为每条记录运行子查询?

Posted

技术标签:

【中文标题】为每条记录运行子查询?【英文标题】:subquery runs for each record? 【发布时间】:2021-05-06 14:36:49 【问题描述】:

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

select *
from emp
where empno in (select empno from emp);

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

SELECT *
FROM emp
WHERE EXISTS (SELECT 'RANDOM' FROM dual)

【问题讨论】:

见:Using EXPLAIN PLAN。 【参考方案1】:

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

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

认为子查询实际上会针对外部查询中的每一行运行是错误的。这样理解查询的结果是完全没问题的,但是引擎可以为所欲为,比如将子查询转换为连接,只要它保证查询指定的结果就是产生的结果。

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

【讨论】:

那么为什么 eixists 和 not exists 效率低下? @Raj 。 . .此答案中没有任何内容提出这样的要求。

以上是关于为每条记录运行子查询?的主要内容,如果未能解决你的问题,请参考以下文章

在单个查询中为每个 DISTINCT 选择几条记录

JOINS 的大型查询中的 SQL 子查询链

BigQuery:需要在相关子查询中返回记录类型的唯一值

如何设置子查询以获取具有最新日期和最大 ID 的单个记录?

MySQL复杂子查询公式

ORA-01427 单行子查询返回多行 - 如何解决?