当遇到多层exists的时候,事情就变得开始复杂了。我们来看看这个例子吧
假设有三张表
- 选课表:学号、课程号
- 学生表:学号、姓名
- 课程表:课程号、课程名
请选出选了所有课程的学生
SELECT 姓名 FROM 学生表 WHERE NOT EXISTS ( //学生缺的学科 SELECT * FROM 课程表 WHERE NOT EXISTS ( //学生选的学科 SELECT * FROM 选课表 WHERE 学生表.学号 = 选课表.学号 AND 课程表.课程号 = 选课表.课程号 ) );
下面解读一下这两个exists。
第一层not exists的意思是 对一个学生 而言选出他没选过的课程。如果他没选过的课程为空,那么他就选择了所有课程。
第二层not exits的意思是 对一个学生和一门指定的课程 筛选出选课表中对应的记录。
从逻辑上说,“选了所有课程的学生”等价于
对一个学生,不存在这样的课程,这个课程不没有被这个学生选。