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

本文解析了一个SQL查询语句,该语句通过联接Student、Course和SC表,筛选出选修了所有课程的学生姓名。利用相关子查询和not exists条件,实现了动态循环查询,最终返回满足条件的学生名单。

select Sname 
from Student
where not exists
  (select * 
  from Course 
  where not exists
    (select * 
    from SC 
     where Sno=Student.Sno
      and Cno=Course.Cno));
我的理解是:
  这是一个相关子查询,由三个表查询出结果。前两个select查询的表分别是Student和Course表,最后一个是SC表。关键子查询条件在于最内层的where语句。
这是个动态的循环的查询,由最外层Student表的Sno的属性值循环实现。 
那么结合起来看,如果Sno是001,那么最内层select语句就是查询的这个学生的选课表;第二层求的是这个学生没有选的课程,如果这个学生选了全部的课程那么第二层就是false的结果,再用not exists否定就是true的结果,那么返回的就是001这个学生的姓名,否则就是相反的结果,即这个学生没有选全部的课程,那么这个学生不满足件,不会被输出出来!
最后结果查询的就是选修了全部课程的学生姓名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值