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