数据库1
创建表,和管理表
创建数据库
create database 库名;
创建表
create table student(
id int(10) primary key auto_increment,
stuName vachar(20) not null, //可以添加约束条件 非空
school varchar(20) comment ‘字段的注释,是学校’
score float(5,2), //最长5位,小数点后2位
birthday data, //data代表年月日
sex char(2) default ‘女’ //default代表默认值 //最后一行不要加逗号
)comment='表的注释,学生’
primary key:主键
主键的目的可以确定唯一一行数据
auto_increment:设置主键自增,对于自增主键是有自增这个属性的
删除表
drop table student;
删除数据库
drop database 库名;
给表增加一列:alter table student add aa int;
修改表中的列名:alter table student change aa age int;
修改表,设置某列添加约束:alter table student modify sex char(1) not null;
修改表的名称:alter table student rename as zhuzhu;
数据插入:
insert into 语句
INSERT INTO student(tname,sex,score,school) VALUES('狗子','女',90,'南大');
字符串类型用''引起来
数值型不可以用单引号
日期类型也要用单引号引起来
字段列表,和后面的值列表要匹配
通常,对于自增主键可以不指定id
多条记录插入:
INSERT INTO student(tname) VALUES
(‘a’),
(‘b’),
(‘c’);
UPDATE student SET score=100 -- 更新表中所有score字段数组
UPDATE student SET score=60 WHERE id=5 -- 修改id为5的成绩
UPDATE student SET score=80,tname='派大星' WHERE id=5 -- 修改id为5的成绩和名字
UPDATE student SET score=score+10,tname='派大星' WHERE id=5 -- 修改id为5的成绩。原来成绩加10
更新条件符号:
and or >< >= <= <> !=
UPDATE student SET tname='猪猪' WHERE school='南大'AND score<100
数据删除
delete from 表名 删除表中所有记录
delete from 表名 where id=1 删除id为1的记录
truncate table 表名 删除表中所有记录
==> delete from表名
1、truncate table 速度快
2、自动把自增主键id从1开始重置
查询数据
select 字段1,字段2……字段n from 表名 [where 条件]
//例子
SELECT tname,score FROM student WHERE id=1;
SELECT * FROM student WHERE id=1; -- *代表所有字段
SELECT tname AS '姓名',score AS '成绩' FROM student -- 把字段加别名
或者:SELECT tname '姓名',score '成绩' FROM student -- 把字段加别名
SELECT stu1.`tname` '姓名',stu1.score '成绩' FROM student stu1 -- 把表起别名stu1,目的为了区分字段归属
数据查询
float和decimal 以及numeric区别
它们都能表示小数
decimal以及numeric没什么区别
float是近似值
decimal以及numeric是精确值
float比decimal以及numeric效率高
聚合函数
Max() //取最大值
Min() //取最小值
Avg() //平均值
Count() //求数据的条数
sum() //求和
//切记 where后面不允许跟聚合函数
SELECT MAX(score) FROM student WHERE age>25 -- 求大于25岁的最高分数
SELECT MAX(score),MIN(score),AVG(score) FROM student -- 求表中最高分数、最低分数、和平均分数
SELECT SUM(score) FROM student -- 分数总和
SELECT COUNT(age) FROM student WHERE age>25 -- 大于25岁的
SELECT COUNT(*) FROM student WHERE age>25 -- 大于25岁的
注意:COUNT(*)不许有空格 COUNT( * )
-- 数据排序
order by 子句,一般用于select语句的最后,可以指定用一个列或者多个列
可以升序(ASC)或者降序(DESC)
SELECT * FROM student ORDER BY score ASC -- 分数的升序,默认就是升序
SELECT * FROM student ORDER BY score DESC -- 分数的降序
SELECT * FROM student ORDER BY score DESC,age ASC -- 先比较分数,分数一样,再比较年龄
--通配符
使用like 关键字匹配进行查询
叫模糊查询
_匹配单个字符
例子
张_只会匹配以张开头,并且名字后面只有一个字符的人 张三 可以 张三三 不可以
%匹配多个字符
例子
张% 只要以张开头就行 张fsifsfjsf 可以 fsiio张ijfosfso不可以
%张% 只要含有张就可以 张sfjopuj 可以 fsiio张ijfosfso 可以
%张 张必须结尾 sfjaj张 可以
select * from student where tname like “张” //查询姓张的人
select * from student where tname like “张_“ //查询姓张的,两个字
select * from student where tname like ”张__“ //三个字的,两个下划线
SELECT * FROM student WHERE tname LIKE "张_" -- 查询姓张的人
SELECT * FROM student WHERE tname LIKE "张%" -- 查询姓张的人
SELECT * FROM student WHERE tname LIKE "%张" -- 查询名字后面是张
SELECT * FROM student WHERE tname LIKE "%张%" -- 查询名字里有张的人
-- 空值的处理
数据库中,如果有一个列的值没有指定,它的值就是null,表示不知道
查询数据库中,所有test不为null的人
SELECT *FROM student WHERE test!=null 不可以
SELECT *FROM student WHERE test<>null 不可以
SELECT *FROM student WHERE test IS NOT NULL可以
SELECT *FROM student WHERE test IS NULL -- 可以(查询为null)
所以要注意,对于null值,不能用= > < != <>等,查出来的不准确
--多值匹配
-、----查询年龄 23 25 28的人
select *from student where age=23 or age=25 or age=28
select *from student where age in(23,25,28)
-、- ---查询年龄在>=23 <=25的人
SELECT * FROM student WHERE age>=23 AND age<=25
SELECT * FROM student WHERE age BETWEEN 23 AND 25 -- 包含前后区间
-- 分组查询
分组是把查询出的数据,进行一个分组,用group by
例如
公司 人数
腾讯 3
华为 2
阿里 1
SELECT school '学校',COUNT(*) '人数' FROM student GROUP BY school -- 每个学校有多少人
SELECT AVG(score),school FROM student GROUP BY school -- 每个学校的平均分
SELECT school,SUM(score) FROM student GROUP BY school -- 每个学校的总分
SELECT school,xueyuan,SUM(score) FROM student GROUP BY school,xueyuan -- 查询各学校各学院的总分
小技巧:如果查询后面跟着聚合函数和非聚合函数,那么就要用到分组,分组的后面是非聚合函数,即可
、-- -- -having
对分组后的数据,进行过滤,不能用where,要用having
-- 查询总分大于150的学校
SELECT SUM(score),school FROM student GROUP BY school HAVING SUM(score)>150
-- 查询数据库,查询平均年龄20到30的学校
SELECT AVG(age),school FROM student GROUP BY school HAVING AVG(age) BETWEEN 20 AND 30
SELECT AVG(age),school FROM student GROUP BY school-- 查询每个学校的平均分
、--- ---去重复
distinct //这个关键字可以对结果集去重
select count(distinct school) from student 不可以
select distinct school,xueyuan from student 只有当学校和学院一致的时候才会去重,证明是个结果集去重
、-- -- 限制结果集
查询前两条记录
select top 2 * from student //在sql server可以
在my sql中:
SELECT * FROM student LIMIT 2 -- 前两条
SELECT * FROM student LIMIT 0,2 -- 从0开始,两条数据
SELECT * FROM student LIMIT 2,2 -- 从第二条记录开始查询
、 -----联合结果集
union和union all
union
-- 查询两个表的所有id,名字,性别
SELECT id,tname,sex FROM student
UNION
SELECT * FROM student2 //必须和上面的列保持一致,类型对应不上就报错
//附:union语句对于多个表查询速度非常快,速度越快,越不容易引起表的死锁
基本原则:每个结果集的列数必须相同,每个对应的列,类型必须兼容
SELECT id,tname,sex,age FROM student -- 可以使用与列名无关的字符串,进行联合
UNION
SELECT *,' ' FROM student2
union all 不去重复,效率高
例子 查询student的最高分数和最低分数,student2的最高分数和最低分数
结果
student最高分 90
student最低分 50
student2最高分 93
student2最低分 60
SELECT '学生1表的最高分',MAX(score) FROM student
UNION
SELECT '学生1表的最低分',MIN(score) FROM student
UNION
SELECT '学生2表的最高分',MAX(score) FROM student2
UNION
SELECT '学生2表的低高分',MIN(score) FROM student2
//例子
查询每个学生的信息,名字,分数,在最后一行计算出分数总和
SELECT tname '名字',score '分数' FROM student
UNION ALL
SELECT '分数总和',SUM(score) FROM student
表连接
表连接分为内连接,外连接和交叉连接
一、 内连接:
//使用where进行连接
select stu.stuname,sch.schname from student stu ,school sch where stu.schoolId=sch.id
特点:只查询满足条件的数据
//使用join的方式进行连接,并且加条件
//通常使用第一种样式
select stu.stuname,sch.schname from student stu join school sch on stu.schoolId=sch.id where stu.stu.stuname like ‘张%’
或者
select stu.stuname,sch.schname from student stu join school sch on stu.schoolId=sch.id and stu.stu.stuname like ‘张%’
或者
select stu.stuname,sch.schname from student stu join school sch where stu.schoolId=sch.id and stu.stu.stuname like ‘张%’
特点:如果a表有4条记录,b表有2条记录,使用内连接只会查询两个表有匹配条件的数据
如果有三张表
select *from a,b,c
where a.bid=b.id
and
b.cid=c.id
将至少两个连接条件,否则数据不正确
所以对于n张表来说,至少有n-1个连接条件
二、 外连接
1、左连接
左连接使用left join
select stu.stName,sch.schName from student stu left join school sch on stu.schoolId=sch.id
特点:会将左表的数据全部显示出来,右表没有与之对应的数据用null显示
2、右连接
同左连接一样,只是使用的关键字 right join,把右表的数据全部展示,左表用null填充
select stu.stName,sch.schName from student stu right join school sch on stu.schoolId=sch.id
或者使用左连接,把表换个位置即可
3、全外连接
MySQL不支持 全外连接 //sql server 支持 full join
可以使用union 就是代替了全外连接
特点就是:两个表数据都将展示出来,没有的互相以null代替
三、交叉连接
没有where 条件语句,他返回连接表中所有数据的笛卡尔积
select * from student stu,school sch
比如 a 表有3条记录
b表有4条记录
笛卡尔积是3*4=12条
子查询(嵌套查询)
将一个查询语句作为一个结果集给其他SQL使用
就是子查询,几乎所有的查询,都能改为子查询
//例子
select *from student where score>60
//子查询
select *from (select *from student score) as temp
查询最高分的人
select max(score) from student
//子查询
select * from student score=(
select Max(score) from student
)
查询分数在50到80之间的男同学
select *from student s where s.score between 50 and 80 s.sex='男'
//子查询
select *from student where score in(
select s.score from student s where s.score between 50 and 80
)and sex='男'
union all>union >连接查询>子查询
它们的速度依次变慢,速度越慢的SQL就越容易引起死锁,而且会让服务器越来越慢