如果不进行去重可能会出现一个情况
嵌套查询根据子查询的结果是否依赖于外层循环,分成相关子查询和不相关子查询
分类
IN
笔者总结:一般这种方法适用于查找有共性的元组,同一类事物比如查找和elsa选修相同科目的学生/选修相同科目的女同学。在后面我们也知道in先执行子查询,可以在优化的时候进行选择下推。
例题1
解法1 不相关子查询
查询结果是不是在那个嵌套的返回结果里面,比如说查询和elsa选修同一个系得学生,一个比较简单的方法是先确定elsa在哪个系,然后在这个查询的系中选人。 那么
select sdept
from student
where sname = 'Elsa';//首先先查找Elas学生所在的系
将sdept看成是一个集合
一定先执行子查询再执行父查询,先取子查询再了解父查询。
解法2 相关子查询
select sno,sname from student as S
where exists
(select * from student as t where t.sname = 'Elsa' AND t.sdept = s.sdept);
两种方法都可以达到预期的结果 第一种的时间开销主要在查询和选择上 第二中的时间开销在于那个exist函数,需要一个判断返回的操作。
例题2
在比较条件下使用子查询
一般情况下这种查询适用于寻找最高或者最低分
上一次 出现是在聚集函数中出现 并且聚集函数不能出现在where子句里。
select * from student where sage > ALL(select sage from student where sdept = 'CS');
分组查询第一个属性必须是分组属性 你分的是啥 必须得让别人看到。
Exist存在性函数
查看执行结果是否为空
select * from student as S where exists
(select * from student as T
where S.sname = 'Elsa' and S.SDEPT = T.SDEPT)
利用exist函数实现任意的功能
关系代数实现
如果是关系代数的话可以用除法来实现:
SELECT Sno FROM Student WHERE NOT EXISTS (
SELECT * FROM SC AS SC1
WHERE SC1.Sno = 'CS-001' AND NOT EXISTS (
SELECT * FROM SC AS SC2
WHERE SC2.Sno = Student.Sno AND SC2.Cno = SC1.Cno));