最近遇到的数据库课程作业,在网上找来找去找不到看得懂的解法。最后自己想明白了,把想法分享出来
先上题
exists原理:先查外查询,然后用外查询数据去内查询根据where做匹配,如果存在则保留外查询记录。
T(16) AC代码
先把思路分析一下,题目要求我们求被所有学生选择的课程,我们不妨把题变成 求 “没有一名学生没有选的课程”
按照这个思路,我们可以这样做
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题完结撒花!