SELECT(嵌套查询EXISTS、集合查询、基于派生表的查询)
一、 带有EXISTS谓词的子查询
EXISTS谓词代表存在量词 ∃
带有EXISTS谓词的子查询不返回任何数据,只产生 逻辑真值“true” 或 逻辑假值“false”
若内层查询结果非空,则外层的 WHERE子句返回真值
若内层查询结果为空,则外层的 WHERE子句返回假值
一些带EXISTS 或 NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换,但所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换
【例3.60】查询所有选修了1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE EXISTS
( SELECT *
FROM SC
WHERE Sno = Student.Sno AND Cno = '1');
--用连接查询也可以达到目标
--SELECT Sname
--FROM Student
--WHERE EXISTS
--( SELECT *
--FROM SC
--WHERE Sno = Student.Sno AND Cno = '1');
这里的exists谓词是用来连接where语句与内层查询的,把内层结果逐个e一遍。
连接查询能表达的它都能表达,但是它能表达的连接查询并不一定能表达。
【例3.61】查询没有选修1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS
( SELECT *
FROM SC
WHERE Sno = Student.Sno AND Cno = '1');
EXISTS前加个NOT ,就是NOT EXISTS谓词,这个谓词产生的值与EXISTS是相反的。
也就是除了选一号课程的学生,Student表中其他元组都是产生正值然后被输出。
【例3.55】查询与“刘晨”在同一个系学习的学生。(不排除刘晨自己)
方法一:exists嵌套查询
SELECT Sno, Sname, Sdept
FROM Student S1
WHERE EXISTS
( SELECT *
FROM Student S2
WHERE S2.Sdept = S1.Sdept AND S2.Sname = '刘晨');