CHECK:保证列中的值符合指定的条件,对于 MySQL 数据库,对 CHECK 子句进行分析,但是忽略 CHECK 子句;
实例
//班级表CREATETABLE classes (
id INTPRIMARYKEYauto_increment,
name VARCHAR(20));//学生表CREATETABLE student (//对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,使用最大值+1
id INTPRIMARYKEYauto_increment,
sn INTNOTNULLUNIQUE,
name VARCHAR(20)DEFAULT'unkown',
qq_mail VARCHAR(20),
classes_id int,//学生表中的班级信息为外键,关联班级idFOREIGNKEY(classes_id)REFERENCES classes(id),check(sex ='男'or sex='女')//忽略该约束);
聚合函数
now():获取系统当前时间;
count(*):统计查询结果有多少条;
count(字段):统计指定字段为非 NULL 的有多少条;
sum(字段):获取某一字段值的总和;
max(字段):获取某一字段的最大值;
min(字段):获取某一字段的最小值;
avg(字段):获取某一字段的平均值;
-- 统计班级共有多少同学SELECTCOUNT(*)FROM student;SELECTCOUNT(0)FROM student;-- 统计班级收集的 qq_mail 有多少个,qq_mail 为 NULL 的数据不会计入结果SELECTCOUNT(qq_mail)FROM student;-- 统计数学成绩总分SELECTSUM(math)FROM exam_result;-- 不及格 < 60 的总分,没有结果,返回 NULLSELECTSUM(math)FROM exam_result WHERE math <60;-- 统计平均总分SELECTAVG(chinese + math + english) 平均总分 FROM exam_result;-- 返回英语最高分SELECTMAX(english)FROM exam_result;-- 返回 > 70 分以上的数学最低分SELECTMIN(math)FROM exam_result WHERE math >70;
分组查询
select 要分组的字段, 聚合函数1, 聚合函数2... from 表名称 group by 要分组的字段1, 要分组的字段2...;:按照某一字段进行分组,然后使用指定的聚合函数对数据进行统计、分析;
select 要分组的字段, 聚合函数1, 聚合函数2... from 表名称 group by 要分组的字段1, 要分组的字段2... having 条件筛选;:分组查询中,不能使用where进行筛选,只能使用having来筛选;
CREATETABLE classes (
id INTPRIMARYKEYauto_increment,
name VARCHAR(20),`desc`VARCHAR(100));insertinto classes(name,`desc`)values('计算机系2019级1班','学习了计算机原理、C和Java语言、数据结构和算法'),('中文系2019级3班','学习了中国传统文学'),('自动化2019级5班','学习了机械自动化');
创建学生信息表并插入数据:
CREATETABLE`student`(
id int(11)PRIMARYKEYAUTO_INCREMENT,
sn int(11)NOTNULLUNIQUE,
name varchar(20)NOTNULL,
qq_mail varchar(20),
classes_id int(11)NOTNULL,)insertinto student(sn, name, qq_mail, classes_id)values('09982','黑旋风李逵','xuanfeng@qq.com',1),('00835','菩提老祖',null,1),('00391','白素贞',null,1),('00031','许仙','xuxian@qq.com',1),('00054','不想毕业',null,1),('51234','好好说话','say@qq.com',2),('83223','tellme',null,2),('09527','老外学中文','foreigner@qq.com',2);
CREATETABLE course (
id INTPRIMARYKEYauto_increment,
name VARCHAR(20));insertinto course(name)values('Java'),('中国传统文化'),('计算机原理'),('语文'),('高阶数学'),('英文');
内连接
概念:假设 A 表与 B 表进行内连接,连接条件是 K,那么执行方式为,从 A 表中取出每一条数据,然后和 B 表中每一条数据进行尝试,如果 K 为真,那么就将这两行数据连接到一起;
语法:
//使用...join...on...实现select 字段 from 表1 别名1[inner]join 表2 别名2on 连接条件 and 其他条件;//也可以由...where...来实现select 字段 from 表1 别名1,表2 别名2where 连接条件 and 其他条件;
实例 1:查询每个同学所参加科目的总成绩以及个人信息;
select stu.sn, stu.name, stu.qq_mail,sum(score) total from student stu join score sco on stu.id = sco.student_id groupby stu.id;
实例 2:查询每个同学的每一科成绩以及个人信息;
select stu.sn, stu.name, stu.qq_mail, cou.name, sco.score from student stu join score sco on stu.id = sco.student_id join course cou on sco.course_id = cou.id orderby stu.id, cou.name;
外连接
概念:外连接有两种形式——左连接、右连接,假设 A 表与 B 表进行左(右)连接,连接条件是 K,那么执行方式为,从 A(B)表中取出每一条数据,然后和 B(A)表中每一条数据进行尝试,不管是否为真,左(右)边表的数据一定会显示完全;
语法:
-- 左外连接,表1完全显示select 字段名 from 表名1leftjoin 表名2on 连接条件;-- 右外连接,表2完全显示select 字段 from 表名1rightjoin 表名2on 连接条件;
实例:查询所有同学的各科成绩以及个人信息,如果该同学没有成绩,也需要显示;
#使用select stu.sn, stu.name, stu.qq_mail, cou.name, sco.score from student stu leftjoin score sco on stu.id = sco.student_id leftjoin course cou on sco.course_id = cou.id orderby stu.id, cou.name;
自连接
概念:同一张表连接自身进行查询;
实例:查询所有“计算机原理”成绩比“Java”成绩高的学生信息;
select stu.sn, stu.name, stu.qq_mail, s1.score 计算机原理, s2.score Java from student stu join score s1 on s1.student_id = stu.id join score s2 on s2.student_id = stu.id join course c1 on c1.id = s1.course_id and c1.name ='计算机原理'join course c2 on c2.id = s2.course_id and c2.name ='Java'and s1.score > s2.score;
select*from student where classes_id =(select classes_id from student where name='不想毕业');
多行子查询
[NOT] IN:方括号中NOT为可选项,(不)在某个查询结果中;
实例 1:查询"语文"或"英文"课程的成绩信息;
//inselect*from score where course_id in(select id from course where name ='语文'or name ='英文');//not inselect*from score where course_id notin(select id from course where name !='语文'and name !='英文');
//existsselect*from score whereexists(select*from course where id = score.course_id and(name ='语文'or name ='英文'));//not existsselect*from score wherenotexists(select*from course where id = score.course_id and(name !='语文'and name !='英文'));
在from子句中使用子查询
技巧:把一个子查询当做一个临时表使用;
实例:查询所有比"中文系2019级3班"平均分高的成绩信息;
select*from score join(selectavg(score) avg_score from score sco join student stu on sco.student_id = stu.id join classes cla on cla.name ='中文系2019级3班'and cla.id = stu.classes_id) tmp on score.score > tmp.avg_score;
//unionselect*from course where id <3unionselect*from course where name ='Java';//union allselect*from course where id <3unionallselect*from course where name ='Java';