一、EXISTS谓词
1、作用:用于判断一个子查询的结果是否为空
2、使用语法:
【NOT】EXISTS(子查询)
语义:如果子查询的查询结果不为空,则EXISTS为真,否则为假
二、举例
1、举例1:查询选修“003”课程的学生姓名
select sN
from s
where exists(
select *
from sC
where sC.sNo=s.sNo and cNo='003'
)
该子查询是一个相关子查询,用到了父查询中当前元组的属性值
2、举例2:查询没有选修“003”课程的学生姓名(NOT是逻辑运算符,用于对布尔表达式的结果取反)
select sN
from s
where not exists(
select *
from sC
where sC.sNo=s.sNo and cNo='003'
)
3、举例3:查询选修全部课程的学生的姓名
(1)分析:
选修全部课程的学生=没有一门课他不选的学生=每门课他都有选课记录的学生
(2)SQL语句:
select sN
from s
where not exists(
select *
from c
where not exists(
select *
from sC
where s.sNo=sC.sNo and c.cNo=sC.cNo
)
)
第一层子查询和第二层子查询都是相关子查询,用到了当前父查询元组的属性值
4、举例4:查询所学课程包含学生“嫦娥”所学课程的学生的姓名
select sN
from s
where not exists(
select *
from sC x
where sNo='202218014030'and not exists(
select *
from sC
where s.sNo=sC.sNo and x.cNo=sC.cNo
)
)
第一层子查询和第二层子查询都是相关子查询,并且第二层子查询与第一层子查询中用到了相同的表并且还在第二层子查询中使用到了两个表的属性值比较,因此至少要对其中一个表进行重命名操作
三、总结
1、使用谓词EXISTS可实现连接查询,以及其它方式的嵌套查询无法实现的SELECT查询
2、所用带IN谓词、比较运算符、ANY谓词和ALL谓词的子查询都可以使用带EXISTS谓词的子查询来进行等价替换
3、嵌套查询是指在一个SELECT查询中嵌套另一个SELECT查询,增强了SQL语言的查询能力,层层嵌套的查询方式正是SQL语言的"结构化"特征所在
4、在实际应用中,应根据查询需求选择合适的查询嵌套方式,在相关子查询中一定要注意是否需要进行重命名操作。