SQL查询选修了全部课程的学生姓名

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这个人。自己跑一遍也就知道了。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读