不相关子查询
子查询的查询条件不依赖于父查询,称不相关子查询。子查询可以单独运行的
select stu_id,sex,age
from student t
where sex=(
select sex
from student
where stu_id='10023'
)
相关子查询 ==== 关联子查询
子查询的查询条件依赖于父查询,称为 相关子查询。子查询不能单独运行的
子查询 也称 内部查询
父查询 也称 外部查询
如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称为 关联子查询
首先,从父查询中取出table1表的一个元组outer,将元组outer的expr2值传递给子查询。
然后,执行子查询,得到某个值,用这个值代替 子查询的结果 ,父查询由 嵌套查询 变为 只有一层外层查询的简单的查询。
最后,执行这个简单的查询,即得结果。
- 相关 vs 不相关
相关子查询 的查询过程 就像 高级语言的 双重For循环一样,先执行一次外层循环,然后执行内层循环完毕后,继续执行外层循环的下一个值。
不相关子查询 就是先一次性把 内层查询 执行,再 执行外层 查询。
在select 语句中,除了 group by和 limit 之前,其他的位置都可以声明 子查询
Exists 、Not Exists
select col1,col2,…
from table1 outer
where Exists (
select col1,col2
from table2
where expr1=outer.expr2
);
关联子查询通常会和EXISTS操作符一起使用,用来检查在子查询中是否存在满足条件的行。
如果在子查询中不存在满足条件的行
1、条件返回False
2、继续在子查询中查找
3、若最终子查询都没查到,则主查询的记录 就舍弃了
如果在子查询中存在满足条件的行
1、不在子查询中继续查找
2、条件返回True
3、主查询的记录会被保留
NOT EXISTS 关键字 表示 如果不存在某种条件,则返回True,否则返回False
通常 多表查询 比 子查询效率更高一些,
数据搜索引擎 如果子查询能转换城成多表查询,会自动转换。