DQL命令查询数据 (二)

本课目标

掌握 ORDER BY 子句

使用 LIMIT 子句实现分页查询

掌握MySQL的分组查询

掌握MySQL的子查询

 SELECT 语法

ORDER BY 排序

DQL命令查询数据 (二)_第1张图片

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;

 代码案例:

DQL命令查询数据 (二)_第2张图片

#查询学生表中年级编号为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;

分页查询

DQL命令查询数据 (二)_第3张图片

LIMIT 子句

MySQL查询语句中使用 LIMIT 子句限制结果集

  • 限制显示的结果集的行数
  • 分页查询(分页显示数据)
#查询学生表  前4条数据
SELECT * FROM STUDENT LIMIT 4;
SELECT * FROM STUDENT LIMIT 0,4;
#设定每页展示2条数据,查询第三页数据
SELECT * FROM STUDENT LIMIT 4,2;
#LIMIT是做分页的关键字,通常有两个参数  第一个参数表示查询记录的起始位置的索引(0开始)第二个参数表示页面大小

代码案例:

DQL命令查询数据 (二)_第4张图片

#查询成绩表中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.

分组查询

DQL命令查询数据 (二)_第5张图片

GROUP BY 分组

  • 对所有的数据进行分组统计
  • 分组的依据字段可以有多个,并依次分组
  • 与 HAVING 结合使用,进行分组后的数据筛选

GROUP BY子句经常和聚合函数结合使用完成分组统计功能

WHERE 和 HAVING 对比
  • WHERE 子句:用来筛选 FROM 子句中指定的操作所产生的行
  • GROUP BY 子句:用来分组 WHERE 子句的输出
  • HAVING 子句:用来从分组的结果中筛选行

代码案例:

DQL命令查询数据 (二)_第6张图片

#查询每门课程及格总人数和及格学生的平均分
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  比较运算符(子查询)

DQL命令查询数据 (二)_第7张图片

当父查询的条件要求是一个具体的值时,子查询的结果也必须只能返回一条数据

IN 子查询

  • IN 后面的子查询可以返回多条记录
  • 常用 IN 替换等于(=)的子查询

SELECT … FROM 表名 WHERE 字段X  IN(子查询)

代码案例:

DQL命令查询数据 (二)_第8张图片

#查询年级名称为”大一”开设的课程信息(课程编号、课程名称、课时数)
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 子句

只出现在子查询中而没有出现在父查询中的列不能包含在输出列中

DQL命令查询数据 (二)_第9张图片

#查询“高等数学-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'
);

你可能感兴趣的:(MySQL数据库,mysql,数据库)