本课目标
掌握 ORDER BY 子句
使用 LIMIT 子句实现分页查询
掌握MySQL的分组查询
掌握MySQL的子查询
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;
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子句经常和聚合函数结合使用完成分组统计功能
代码案例:
#查询每门课程及格总人数和及格学生的平均分
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 比较运算符(子查询)
当父查询的条件要求是一个具体的值时,子查询的结果也必须只能返回一条数据
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 的子查询不返回任何记录单数据,只返回逻辑值“True”或“False”
SELECT …… FROM 表名 WHERE EXISTS(子查询);
1.子查询有返回结果: EXISTS子查询结果为TRUE,执行外层查询;
2.子查询无返回结果: EXISTS子查询结果为FALSE, 外层查询不执行;
任何允许使用表达式的地方都可以使用子查询
嵌套在父查询 SELECT 语句的子查询可包括:
只出现在子查询中而没有出现在父查询中的列不能包含在输出列中
#查询“高等数学-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 result
where 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 result
where 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 result
where 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 result
where subjectno=(
select subjectno from `subject` where subjectname='高等数学-1'
)
)
------------------------------------------------------------------------------------------------------------------------------
#如果今年是2024年,则显示当前时间
SELECT NOW() FROM DUAL WHERE EXISTS(
SELECT 1 FROM DUAL WHERE YEAR(NOW())='2024'
);