本课目标
掌握 ORDER BY 子句
使用 LIMIT 子句实现分页查询
掌握MySQL的分组查询
掌握MySQL的子查询
SELECT 语法
ORDER BY 排序
ORDER BY 子句:按照一定顺序显示查询结果
排序可以是升序(ASC)或者是降序(DESC),结果默认按ASC升序排列
#把成绩都降低10%后加5分,再查询及格成绩
#按照成绩排序(ASC升序 DESC降序)
SELECT * FROM RESULT WHERE SUBJECTNO=3 AND (STUDENTRESULT*0.9+5) > 60 ORDER BY STUDENTRESULT DESC;
代码案例:
#查询学生表中年级编号为1的学生姓名、电话和出生日期,并按照出生日期降序排序。
SELECT STUDENTNAME,PHONE,BORNDATE FROM STUDENT WHERE GRADEID=1 ORDER BY BORNDATE DESC;#查询成绩表中学号为10000的学号、成绩和考试日期,并按照日期先后次序显示。
SELECT STUDENTRESULT,EXAMDATE FROM RESULT WHERE STUDENTNO=10000 ORDER BY EXAMDATE;#查询成绩表中课程编号为1的学号、成绩和考试日期,并按照日期先后、成绩由高到低的次序显示
SELECT STUDENTNO,STUDENTRESULT,EXAMDATE FROM RESULT WHERE SUBJECTNO=1 ORDER BY EXAMDATE,STUDENTRESULT DESC;
分页查询
LIMIT 子句
MySQL查询语句中使用 LIMIT 子句限制结果集
- 限制显示的结果集的行数
- 分页查询(分页显示数据)
#查询学生表 前4条数据
SELECT * FROM STUDENT LIMIT 4;
SELECT * FROM STUDENT LIMIT 0,4;
#设定每页展示2条数据,查询第三页数据
SELECT * FROM STUDENT LIMIT 4,2;
#LIMIT是做分页的关键字,通常有两个参数 第一个参数表示查询记录的起始位置的索引(0开始)第二个参数表示页面大小
代码案例:
#查询成绩表中2023年课程编号为1且分数大于80的信息(学号,课程编号,分数),只显示前2名。
SELECT STUDENTNO,SUBJECTNO,STUDENTRESULT FROM RESULT WHERE YEAR (EXAMDATE)='2023' AND SUBJECTNO=1 AND STUDENTRESULT>80 ORDER BY STUDENTRESULT DESC LIMIT 2; #查询2023年课程编号为1的学号、考试成绩,并按照考试成绩由高到低的次序显示。要求查询出第3条-4条的记录
SELECT STUDENTNO,STUDENTRESULT FROM RESULT WHERE YEAR (EXAMDATE)='2023' AND SUBJECTNO=1 ORDER BY STUDENTRESULT DESC LIMIT 2,2;
结果1.
结果2.
分组查询
GROUP BY 分组
- 对所有的数据进行分组统计
- 分组的依据字段可以有多个,并依次分组
- 与 HAVING 结合使用,进行分组后的数据筛选
GROUP BY子句经常和聚合函数结合使用完成分组统计功能
WHERE 和 HAVING 对比
- WHERE 子句:用来筛选 FROM 子句中指定的操作所产生的行
- GROUP BY 子句:用来分组 WHERE 子句的输出
- HAVING 子句:用来从分组的结果中筛选行
代码案例:
#查询每门课程及格总人数和及格学生的平均分
SELECT STUDENTNO,COUNT(1),AVG(STUDENTRESULT) FROM RESULT WHERE STUDENTRESULT>=60 GROUP BY SUBJECTNO;#查询每门课程及格总人数和及格平均分在80分以上的记录
SELECT STUDENTNO,COUNT(1),AVG(STUDENTRESULT) FROM RESULT WHERE STUDENTRESULT>=60 GROUP BY SUBJECTNO
HAVING AVG(STUDENTRESULT)>80;#查询每个年级的总学时数,并按照升序排列
SELECT GRADEID,SUM(CLASSHOUR) FROM `SUBJECT` GROUP BY GRADEID ORDER BY SUM(CLASSHOUR); #查询每门课程的平均分,并按照降序排列
SELECT SUBJECTNO,AVG(STUDENTRESULT) FROM RESULT GROUP BY SUBJECTNO ORDER BY AVG(STUDENTRESULT) DESC;#查询每个学生参加的所有考试的总分,并按照降序排列
SELECT STUDENTNO,SUM(STUDENTRESULT) FROM RESULT GROUP BY STUDENTNO ORDER BY SUM(STUDENTRESULT);#查询每个年级学生的平均年龄
SELECT GRADEID,AVG(YEAR(NOW())-YEAR(BORNDATE)) FROM STUDENT GROUP BY GRADEID;#查询考试不及格的学生学号和不及格的次数
SELECT STUDENTNO,COUNT(STUDENTRESULT) FROM RESULT WHERE STUDENTRESULT<60 GROUP BY STUDENTNO;
子查询
子查询是一个嵌套在 SELECT、INSERT、UPDATE、DELETE语句或其他子查询中的查询
子查询在 WHERE 语句中的一般用法
SELECT … FROM 表名 WHERE 字段X 比较运算符(子查询)
当父查询的条件要求是一个具体的值时,子查询的结果也必须只能返回一条数据
IN 子查询
- IN 后面的子查询可以返回多条记录
- 常用 IN 替换等于(=)的子查询
SELECT … FROM 表名 WHERE 字段X IN(子查询)
代码案例:
#查询年级名称为”大一”开设的课程信息(课程编号、课程名称、课时数)
SELECT SUBJECTNO,SUBJECTNAME,CLASSHOUR FROM `SUBJECT` WHERE GRADEID=(SELECT GRADEID FROM GRADE WHERE GRADENAME ='大一');#查询课程名称为”高等数学一”最近一次考试的学生信息(学号、姓名和联系电话)
SELECT STUDENTNO,STUDENTNAME,PHONE FROM STUDENT WHERE STUDENTNO IN(SELECT STUDENTNO FROM RESULT WHERE SUBJECTNO=(SELECT SUBJECTNO FROM `SUBJECT` WHERE SUBJECTNAME='高等数学-1')AND EXAMDATE=(SELECT MAX(EXAMDATE) FROM RESULT WHERE SUBJECTNO=(SELECT SUBJECTNO FROM `SUBJECT` WHERE SUBJECTNAME='高等数学-1'))
)#查询没有参加课程名称为”高等数学-1”最近一次考试的学生信息(学号、姓名和联系电话)
SELECT STUDENTNO,STUDENTNAME,PHONE FROM STUDENT WHERE STUDENTNO NOT IN(SELECT STUDENTNO FROM RESULT WHERE SUBJECTNO=(SELECT SUBJECTNO FROM `SUBJECT` WHERE SUBJECTNAME='高等数学-1')AND EXAMDATE=(SELECT MAX(EXAMDATE) FROM RESULT WHERE SUBJECTNO=(SELECT SUBJECTNO FROM `SUBJECT` WHERE SUBJECTNAME='高等数学-1'))
)
EXISTS 子查询
带有 EXISTS 的子查询不返回任何记录单数据,只返回逻辑值“True”或“False”
SELECT …… FROM 表名 WHERE EXISTS(子查询);
1.子查询有返回结果: EXISTS子查询结果为TRUE,执行外层查询;
2.子查询无返回结果: EXISTS子查询结果为FALSE, 外层查询不执行;
子查询注意事项
任何允许使用表达式的地方都可以使用子查询
嵌套在父查询 SELECT 语句的子查询可包括:
- SELECT 子句
- FROM 子句
- WHERE 子句
- GROUP BY 子句
- HAVING 子句
只出现在子查询中而没有出现在父查询中的列不能包含在输出列中
#查询“高等数学-1”课程最近一次考试成绩,如果有 80分以上的成绩,显示分数排在前5名的学员学号和分数。
select studentno,studentresult from result
where EXISTS(select 1 from result where subjectno=(select subjectno from `subject` where subjectname='高等数学-1') and examdate = (select max(examdate) from resultwhere subjectno=(select subjectno from `subject` where subjectname='高等数学-1') )and studentresult > 50
)and subjectno=(select subjectno from `subject` where subjectname='高等数学-1')
and examdate = (select max(examdate) from resultwhere subjectno=(select subjectno from `subject` where subjectname='高等数学-1')
)
order by studentresult desc
limit 5;#查询“高等数学-1”课程最近一次考试成绩,
#如果全部未通过考试(60分及格),
#认为本次考试偏难,显示考试平均分时加5分。
select avg(studentresult)+5 from result
where not EXISTS(select 1 from result where subjectno=(select subjectno from `subject` where subjectname='高等数学-1') and examdate = (select max(examdate) from resultwhere subjectno=(select subjectno from `subject` where subjectname='高等数学-1') )and studentresult >= 60
) and subjectno=(select subjectno from `subject` where subjectname='高等数学-1')
and examdate = (select max(examdate) from resultwhere subjectno=(select subjectno from `subject` where subjectname='高等数学-1')
)
------------------------------------------------------------------------------------------------------------------------------
#如果今年是2024年,则显示当前时间
SELECT NOW() FROM DUAL WHERE EXISTS(SELECT 1 FROM DUAL WHERE YEAR(NOW())='2024'
);