您的位置:首页 > 数据库

数据库操作: 查询选修了所有课程的学生

2015-06-10 15:48 302 查看
先给出sql 代码:

select sno, sname
from students
where not exists(
      select *  from course
      where not exists(
                  select *
                  from sc
                  where sno = students.sno and  cno = course.cno
                )
)


是吧,你肯定会想 == 卧槽这是什么鬼

因为sql 中没有全称量词,所以要把要求转换为 等价的 存在量词的表述形式

也就是转化成 双重否定的形式

not exists 将不满足的条件的提交,里面一个not exists 意思就是说,我先把每个学生选修的全部课程都找出来(a),然后再和所有的课程比较(b) ,两个比较,提交a,然后用b 比较a 如果有 b 里面有,而a 里面灭有not
exists 的,那我们就把这条数据提交,也就是返回 true 返回真的话,外面的 not exists 一作用就变成 false 了

所以如果学生有课程没有选的话,那么就是false 就不会输出

同理,如果a 中的每条记录和b 中都是一样的,那么就不会有 not exists 的问题了,因为都exists 啊! 所以是 false 然后外面的 not exists 一作用就变成 true 了,就会输出

小弟才疏学浅 == 错误之处烦请各位巨巨指正 ==
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: