1、简介
• 不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询
• 相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询。带Exists的子查询就是相关子查询
• Exists表示存在量词:带有Exists的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”
★相关子查询执行过程:先在外层查询中取“学生表”的第一行记录,利用该记录的相关属性值(在exists子查询的where
子句中用到的列)处理内层查询,若外层的where子句返回“true”,则本条记录放入结果表中。然后再取下一行记录,
重复上述过程直到外层表遍历完毕。
2、exists和not exists
Exists语句不关心子查询返回的具体内容,因此用“exists(select 1 from)”来判断子查询是否返回记录。
• Exists(select):若子查询的结果集非空时,exists()表达式返回true;子查询的结果集为空时,exists()表达式返回false。
• Not Exists(select):若子查询的结果集非空时,not exists()表达式返回false;子查询的结果集为空时,not exists()表达式返回true。
3、案例
a表(主表)
---------------
id name
1 刘王
2 李涛
3 渝佳
4 赵敏
---------------
b表(从表)
---------------
id_b gender
1 女
2 男
3 女
4 女
---------------
测试:获取性别为女的姓名
①exists语句:
select * from a where exists(select 1 from b where a.id=b.id_b and gender='女');
②not existe语句:
select * from a where not exists(select 1 from b where a.id=b.id_b and gender<>'女');
③in语句:
select * from a where id in (select id_b from b where gender='女');
④not in语句:
select * from a where id not in(select id_b from b where gender<>'女');
以上查询结果均为:
---------------
id name
1 刘王
3 渝佳
4 赵敏