You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 00:45:03