select exists 的应用一例

当遇到多层exists的时候,事情就变得开始复杂了。我们来看看这个例子吧

假设有三张表

  • 选课表:学号、课程号
  • 学生表:学号、姓名
  • 课程表:课程号、课程名

请选出选了所有课程的学生

SELECT 姓名
FROM 学生表
WHERE NOT EXISTS
( 
//学生缺的学科
SELECT *
FROM 课程表
WHERE NOT EXISTS
(
//学生选的学科 
SELECT *
FROM 选课表
WHERE 学生表.学号 = 选课表.学号 AND 课程表.课程号 = 选课表.课程号
)
);

下面解读一下这两个exists。

第一层not exists的意思是 对一个学生 而言选出他没选过的课程。如果他没选过的课程为空,那么他就选择了所有课程。

第二层not exits的意思是 对一个学生一门指定的课程 筛选出选课表中对应的记录。

从逻辑上说,“选了所有课程的学生”等价于

对一个学生,不存在这样的课程,这个课程不没有被这个学生选。

 

posted @ 2018-03-04 09:21  不以为然的豆瓣  阅读(787)  评论(0编辑  收藏  举报