-------------高级查询----------------
-
if exists
判断是否存在 存在就执行sql操作
不存在就不执行sql操作,例如: drop table if exists temp ;
如果temp 表存在就删除。 -
exists 子查询。
父查询语句 where exists(子查询语句。);– 如果子查询返回结果为 true 那么父查询执行。否则不执行。
-
练习:
=1= 需求:检查“Logic Java”课程最近一次考试成绩
如果有 80分以上的成绩,显示分数排在前5名的学员学号和分数=2= 分析:查询的结果,要的是:学员学号,和对应分数。
学员学号
对应分数。对结果进行限定: 只要5条数据 limit子句
要求前5名,那么就需要排序:
降序排列 order by 分数 desc
外层查询的筛选条件:
(1)logic java 课程
(2)最近一次考试成绩
exsists 子查询中的条件:
判断满足三个条件的结果存在不存在:
(1)logic java 课程
(2)最近一次考试成绩
(3)是否存在80分以上的成绩。
=3= 具体定义写sql语句:
select studentNo,studentResult from result
where exists(
select * from result
where subjectNo =(
select subjectID from subject
where subjectName ='Logic Java'
)
and examDate =(
select max(examDate) from result
where subjectNo =(
select subjectID from subject
where subjectName='Logic Java'
))
and studentResult >=80
)
and subjectNo = (
select subjectID from subject
where subjectName ='Logic Java'
)
and examDate =(
select max(examDate) from result
where subjectNo=(
SELECT subjectID FROM SUBJECT
WHERE subjectName ='Logic Java'
))
ORDER BY studentResult DESC
limit 5;
-
not exists 子查询
判断是否不存在 不存在就返回true ,否则false=1= 练习:
检查“Logic Java”课程最近一次考试成绩
如果全部未通过考试(60分及格),
认为本次考试偏难,计算的该次考试平均分加5分=2= 分析:
查询结果,操作的是成绩表,要的是平均分。子查询判断条件: (1)Logic Java 课程 (2)最近一次考试成绩 (3)成绩是否全部为60以下 如果全部60分以下,那么查询结果的平均成绩+5
=3= 具体sql编码:
SELECT AVG(studentResult) FROM result #平均成绩为 50.1 # 把成绩表中的成绩,全部改为60分一下,做下面题的测试。 select avg(studentResult)+5 from result where not exists( select * from result where subjectNo =( select subjectNo from subject where subjectName='Logic Java' ) and examDate =( select max(examDate) from result where subjectNo =( SELECT subjectNo FROM SUBJECT WHERE subjectName='Logic Java' ) ) and studentResult >=60 )
-
练习 :
需求说明
如果有S1的学生,
就查询参加S2学科考试的
学员学号、科目编号、考试成绩,考试时间sql编码:
select * from result where exists( select * from student where gradeID =( select gradeid from grade where gradeName='s1' ) ) and studentNo in( select studentNo from student where gradeID = ( select gradeID from grade where gradeName ='s2' ) )