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

  • 45
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值