本文来自百度知道
设有学生-课程数据库如下:
学生表Student(Sno,Sname,Ssex,Sage,Sdept),课程表Course(Cno,Cname,Ccredit,Tn),学生选课表SC(Sno,Cno,Grade)
其中Sno表学号,Sname表姓名,Ssex表性别,Sage年龄,Sdept系别,Cno课程号,Cname课程名,Ccredit学分,Tn教师,Grade分数。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM Course
WHERE NOT EXISTS
(
SELECT *
FROM SC
WHERE Sno = Student.Sno AND Cno = Course.Cno
)
);
这个查询,查出的是选择全部课程的学生的姓名。对于这个语法,要分步理解,从最下边的where看起,从下往上去看。最下边的一个select(not exists后边)是把学生编号和课程编号带入,结果是查询学生选课的记录。加上not exists,就是学生没选课,那么加上前边的从课程表的select,就是查询出学生没选的课程。最后在上面又加了一个not exists,那么就是不存在没选课程的数据,也就是说,这个学生选择了所有的课程,才会符合记录。

这么说能明白么?看我下边分的段

----------------以下查询选择全部课程学生的姓名
SELECT Sname
FROM Student
WHERE NOT EXISTS --------此处不存在配合以上STUDENT,可知查询的是不存在没选课的学生
----------------以下查询学生没选课的信息
(SELECT *
FROM Course
WHERE 
NOT EXISTS -------此处增加不存在,配合上面从COURSE的选择可知查询的是学生没有选的课
----------------以下查询查询学生选课的信息
(
SELECT *
FROM SC
WHERE Sno = Student.Sno AND Cno = Course.Cno
)
);
exists (sql 返回结果集为真) 
not exists (sql 不返回结果集为真) 
如下: 
表A 
ID NAME 
1    A1 
2    A2 
3  A3 

表B 
ID AID NAME 
1    1 B1 
2    2 B2 
3    2 B3 

表A和表B是1对多的关系 A.ID 
=> B.AID 

SELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID) 
执行结果为 
1 A1 
2 A2 
原因可以按照如下分析 
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=
--->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据 

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2
--->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据 

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3
--->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据 

NOT EXISTS 就是反过来 
SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID) 
执行结果为 
3 A3 
=========================================================================== 
EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因 
SELECT ID,NAME FROM A  WHERE ID IN (SELECT AID FROM B) 

NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别 
SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)