**
困扰人的not exists,exists嵌套,终于搞明白了,确实有点绕,耐心看完我的解释,应该都能懂
**
1.首先要明白not exists和exists的基本用法
当子查询为null时,exists不输出,not exists输出;当子查询不为null时,exists输出,not exists不输出;下面为基本用法示例
1.1先看一下相关表里的字段
如果子查询为null,那么not exists 会输出所有的为null的记录,所以下面的例子中就输出了student表中所有的信息
如果子查询不为null,not exists输出null,所以下面的例子输出null,因为表里有这个字段
exists相反,子查询为ture,所以输出student表里的所有结果
子查询为null,就是false,主查询输出null
2.接下来说嵌套问题
2.1 not exists和not exists嵌套
这个查到的就是选过的所有课程的同学
解析如下:
(select * from course c where not exists
(select * from select_course sc where sc.student_id=s.id and sc.course_id=c.id))
这个子查询查到是 没有被某位学生选过的课程的记录集
如果一个学生选择了所有的课程,那么上面这个子查询的结果集就为null
主查询为not exists,所以输出这个为null的同学的记录集,即查到的记录就是选择了所有课程的记录
2.2 not exists和exists嵌套解析
这个查到的是一门课都没有选择的同学的记录
解析如下:
(select * from course c where exists
(select * from select_course sc where sc.student_id=s.id and sc.course_id=c.id))
这个子查询查的是某位学生选过的课程集合
如果一个学生什么课程都没选,这个查询的结果为null
主查询是not exists,所以输出这个为null的同学的记录,即输出一门课都没有选的同学的记录
2.3 exists和exists嵌套解析
这个查到的是选了课(选课数大于等于1)的同学的记录
解析如下:
(select * from course c where exists
(select * from select_course sc where sc.student_id=s.id and sc.course_id=c.id))
这个子查询查的是某位学生选过的课程集合
如果一个学生选择了一门课程,这个集合就不为null,一门课都不选的同学记录为null
主查询是exists,所以输出不为null的记录,即输出选择了>=一门课程的同学的记录,一门都没选的同学的记录剔除
2.4 exists和not exists嵌套解析
这个查到的就是有某一门课程没选的同学的记录,就是除了把所有课程都选了的同学,选了一门,二门都算,只要有他没选的课程,他就在这个记录里面
解析如下:
(select * from course c where not exists
(select * from select_course sc where sc.student_id=s.id and sc.course_id=c.id))
这个子查询查到是 某位学生没有选过的课程的记录集
如果一个学生选择了所有的课程,那么上面这个子查询的结果集就为null,反之,只要某个同学有他没选的课,这个集合就不为null
主查询是exists,所以输出不为null的结果,即输出的是只要你有一门课没选,就会输出这个记录,那个选了所有课的学生就被剔除了