为每条记录运行子查询?

Raj*_*Raj 6 sql oracle oracle-apex

我的疑问是,如果我在 where 子句中编写子查询,那么该子查询将为每个记录执行或仅执行一次。例如,

select *
from emp
where empno in (select empno from emp);
Run Code Online (Sandbox Code Playgroud)

如果我有这样的查询那么会发生什么?

SELECT *
FROM emp
WHERE EXISTS (SELECT 'RANDOM' FROM dual)
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 7

SQL 查询代表生成的结果集,而不是生成它的具体步骤。也就是说,SQL 是一种描述性语言,而不是一种过程性语言。

事实上,实际运行的通常是操作的有向无环图 (DAG),与原始查询几乎没有相似之处。不仅查询被转换为图的节点,而且优化步骤进一步增加了与原始查询的距离。

认为子查询实际上会针对外部查询中的每一行运行的想法是错误的。通过这种方式理解查询的结果是完全可以的,但是引擎可以做任何它想做的事情,比如将子查询转换为联接,只要它保证查询指定的结果就是所产生的结果即可。

事实上,很少有 SQL 数据库会在您编写的任一查询中实际对外表中的每一行运行子查询。