日期:2014-05-18  浏览次数:20729 次

SQL关于not exists的理解
学生(学号,姓名,系别,年龄) 
课程(课程号,课程名,学时) 
选读(学号,课程号,成绩) 
问题:检索选读全部课程的学生姓名 
select 学生.姓名
from 学生 
where not exists( select *
  from 课程 
  where not exists( select * 
  from 选读 
  where 学号=学生.学号 and 课程号=课程.课程号));
这个怎么理解,怎么单独运行 select * 
  from 选读 
  where 学号=学生.学号 and 课程号=课程.课程号
得不出什么结果?





------解决方案--------------------
对exists 跟not exists 的理解不够啊。
select 学生.姓名 
from 学生 
where not exists( select * 
from 课程 
where not exists( select * 
from 选读 
where 学号=学生.学号 and 课程号=课程.课程号)); 
这是一整条的查询语句,不能把里面的拆出来用的。
拆出来的话,学生表、课程表,对于选课表来说就是不可见的了。

如果不是很清楚,可以查下SQL的帮助文档里面关于EXISTS与NOT EXISTS的用法。
使用 EXISTS 和 NOT EXISTS 引入的子查询可用于两种集合原理的操作:交集与差集。两个集合的交集包含同时属于两个原集合的所有元素。差集包含只属于两个集合中的第一个集合的元素。