本文来自百度知道 设有学生-课程数据库如下: 学生表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=1)
--->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)