数据库sql语句查询选修了全部课程的学生姓名。

SELECT Sname  
FROM Student   
WHERE NOT EXISTS  
(SELECT * FROM Course WHERE NOT EXISTS  
     (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=Course.Cno)  
);  

EXISTS:查询有结果则返回真值,查询为空则返回false。
NOT EXISTS:查询有结果返回false,查询为空返回true。
Exists执行的流程Exists首先执行外层查询,再执行内存查询,与IN相反。

假设:
课程总共有 语文,数学,英语三门课程。
现在有学生:张三:选修了语文,数学,没有选择英语。
           李四:三门课全都选修了。
 开始查询:
 一、首先从Student表中选出 张三 所在元组(也就是张三所在行),接着依次从Course表取出三门课程,
 1、首先取出语文课满足"Sno=Student.Sno AND Cno=Course.Cno"条件,即查询到了结果,则第2个NOT EXISTS返回结果false,1个WHERE收到false,不执行任何操作。
 2、接着判断数学,同样满足,第一个WHERE不执行任何操作。
 3、最后拿出英语,"SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=Course.Cno"语句查询不到结果,则第2个NOT EXISTS返回ture,1个WHERE收到true,
 则将结果(也就是英语课程)放入结果表,也就是"SELECT * FROM Course"结果不为空, 第一个NOT EXISTS返回false,那么张三就不会被放进第一个查询的结果表,即张三没有被选中。
二、从Student表中选出 李四 所在元组,接着依次从Course表取出三门课程,
 因为李四三门课全都选修了,取出的三门课都满足"Sno=Student.Sno AND Cno=Course.Cno"条件,即查询到了结果,则第2个NOT EXISTS都返回结果false,1个WHERE收到false,都不执行任何操作。
 最后循环结束时,"SELECT * FROM Course"没有任何结果,即没有一门课被加入第二个查询结果表中,结果为空,则第一个NOT EXISTS返回true,所以李四被放进第一个查询的结果表。得到选修全部课程的学生-李四。
主要思想:将“选修了所有课程的学生”转化为“没有一门课程不选修的学生”。查询到该学生存在没有选修的课程,
则该学生不会被放入结果集中。
  • 39
    点赞
  • 164
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小绵杨Yancy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值