WHERE子句中编写的子查询是逐行执行还是仅执行一次?
WHERE子句子查询执行逻辑解答
首先明确核心结论:WHERE子句中的子查询不会固定逐行执行或者仅执行一次,具体执行逻辑取决于子查询是否属于无关子查询(不依赖外层查询的任何字段):
- 无关子查询只会执行一次,执行完成后再和外层查询做逻辑匹配
- 只有需要引用外层查询字段的相关子查询,才需要针对外层每条记录逐行执行
第一个查询执行逻辑
查询代码:
select * from emp where empno in (select empno from emp);
- 该子查询属于无关子查询,全程没有引用外层emp表的任何字段,数据库优化器会将该子查询提取出来仅执行1次,拿到所有empno的结果集后,再和外层emp表的empno做匹配
- 大部分数据库还会对该逻辑做进一步优化:由于子查询的取值就是当前emp表的所有有效empno,该查询最终等价于返回emp表中所有empno非空的全量记录,不需要额外做子查询匹配。
第二个查询执行逻辑
查询代码:
SELECT * FROM emp WHERE EXISTS (SELECT 'RANDOM' FROM dual)
- 该子查询同样是无关子查询,没有用到外层emp表的任何字段,数据库会优先执行1次子查询做结果判断:在Oracle等带dual系统表的数据库中,该子查询永远返回真
- 优化器会直接将WHERE条件判定为恒真,最终执行逻辑等价于
SELECT * FROM emp,不会在遍历外层emp表时重复执行该子查询。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

