1. SELECT
2. Sname
3. FROM
4. NOT EXISTS (
5. SELECT * FROM course WHERE NOT EXISTS (
6. SELECT * FROM SC WHERE Sno = student.Sno AND Cno = course.Cno ) );
对于这个题目我解释一下:
NOT EXISTS: 它表示若查询结果为空,则最外层的WHERE子句返回真值(true),否则为假值(false);EXISTS正好与它相反;
对于执行过程我举个例子:
SELECT Sname FROM Student WHERE EXISTS(
SELECT * FROM SC WHERE Sno=Student.Sno
AND Cno='1');
它的执行过程是:
首先取外层查询中Student表的第一个元祖,根据它与内层查询查询相关的属性值(Sno值)处理内层查询,
若WHERE子句的返回值为真,则取外层查询中该元祖的Sname放入结果表;
然后去Student表的下一个元祖;重复这一过程,直至外层Student表全部检查完为止。
所有对于上面两个NOT EXISTS ,他们的执行过程是这样的。
首先我们是要查询选了全部的课程的学生。那么跑一遍SQL语句,假设有一个 Sno=2012 的学生的选择了全部课程和一个Sno=2013 的学生只选择了全部课程的其中几门; 假设先以Sno=2012(也就是选了全部课程的那位),那么先往最内层看也就是第6行,既然选择了全部课程那么第6行最后不就是有结果集,既然有结果集那么第5行的NOT EXISTS不就是为false嘛!,也就是第5行得到的结果嘛。 既然第5行为false那不就是第5行的结果集为空,既然第5行的结果集为空那么第4行的NOT EXISTS不就是为 true , 那么最后最外层当前元祖不就加入到最后查询结果集了。
然后对于Sno=2013这个人。自己跑一遍也就知道了。