嵌套查询
4、带有EXISTS谓词的子查询
EXISTS代表存在量词,带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”.
EXISTS若内层查询结果为非空,则外层WHERE子句返回真值;若为空,则返回假值;而谓词NOT EXISTS则是相反。
例3.60
查询所有选修了1号课的学生姓名。
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno='1');
注意:有EXISTS引出的子查询,其目标列表达式通常都用。*
例3.61
查询没有选修1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno='1');
一些EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换,但所有带有IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。
SQL中没有全称量词(for all),但是可以把带有全称量词的谓词转换为等价的带有存在量词的谓词。
例3.62
查询选修了全部课程的学生姓名。
注解:由于没有全称量词,因此我们可以转换成等价的用存在量词的形式:查询这样的学生,没有一门课程是他不选修的(简单来讲,双重否定表肯定)
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno
AND Cno&#