超级详细的SQL exists嵌套用法

   最近遇到的数据库课程作业,在网上找来找去找不到看得懂的解法。最后自己想明白了,把想法分享出来

       先上题

f8a6b58ec80d47bc894184db3b79ab94.jpg

exists原理:先查外查询,然后用外查询数据去内查询根据where做匹配,如果存在则保留外查询记录。

T(16)    AC代码cace1181bfa94aa1b9d7776d107e60a0.png

 先把思路分析一下,题目要求我们求被所有学生选择的课程,我们不妨把题变成 求 “没有一名学生没有选的课程”

   按照这个思路,我们可以这样做

 1.从课程表中进行查询,找出所有课程名作为虚拟表。

 2.从虚拟表中确定出一个课程名,将其带入exists嵌套代码中,此时sc表中的Cno已经被确定下来了

 3.对于嵌套代码我们需要先看内部sc表的exists语句,如果外部的exists的虚拟student表中有那么几个人的学号在内部的sc表不存在。即满足了Not Exists为true的条件,即有几位学生未选该门课程,此时将这几名未选课的学生返回student查询中,因为不满足student的Not exists查询条件所以返回false。此时course表的第一个元组不被保留,继续讲第二个课程带入exists嵌套查询中。

所以对于虚拟表中第一个课程元组而言,因为有未选该门课程的学生在sc表的Not exists查询中被返回到student表中,导致student表返回为false,最后让course表中的该元组不被查询出来。

4.将最外面course表的虚拟表中元组一个个带入exists嵌套中,最后返回的就是所有被所有学生选择的课程啦。16题完结撒花!

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值