Exists
前提知识点
- 不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询
- 相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询
Exists表示存在量词:Exists后接的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”
Exists的用法
Exists + 子查询(一般为相关子查询) 放在where语句中作为逻辑判断;
相关子查询执行过程:
- 先在外层查询中取第一行记录,用该记录的相关的属性值(在内层查询的WHERE子句中给定的)处理内层查询,若内查询有数据记录,则Exists返回True,若内查询没有数据记录,则Exists返回False;
- 若外层的WHERE子句返回“TRUE”值,则这条记录放入结果表中。
- 然后再取下一行记录,返回1;
- 重复上述过程直到外层表的记录全部遍历一次为止
表结构如下:
表名 | 变量 |
选课表 |
学号、课程号(多对多) |
学生表 |
学号、姓名(一对一) |
课程表 |
课程号、课程名(一对一) |
select 姓名 from 学生表 where exists (select * from 选课表 where 学生表.学号=选课表.学号 and 选课表.课程号='C1')2.查询没有选C1课程的学生的学号、姓名
select 学号,姓名 from 学生表 where not exists (select * from 选课表 where 学生表.学号=选课表.学号 and 选课表.课程号='C1')3.查询选修了所有课程的学生的姓名
select 姓名 from 学生表 where not exists (select * from 课程表 where not exists (select * from 选课表 where 选课表.学号=学生表.学号 and 选课表.课程号=课程表.课程号) )