子查询-执行序列

  • 本文关键字:执行 查询 sql
  • 更新时间 :
  • 英文 :


我有这个查询,但我不清楚它是如何工作的。

在子查询中,先执行内部查询,然后执行外部查询,对吗?所以在这种情况下,这个内部查询

select salary 
from hr.employees emp 
where salary > 1000 
and emp.department_id = dep.department_id

将首先执行,但此查询需要dep.department_id,所以此内部查询依赖于外部查询,对吗?那么在这种情况下,内部查询也是首先执行的吗?你能解释一下查询的顺序是如何的,或者它在实践中是如何工作的吗?谢谢

select 
department_name
from 
hr.departments dep 
where 
exists (select salary from hr.employees emp 
where salary > 1000 and emp.department_id = dep.department_id);

没有"这个查询首先执行,那个查询最后执行;。内部查询充当来自外部查询的行的谓词。

从逻辑的角度来看,首先执行外部查询的from子句,对于每个关系(即您的案例中的部门(执行内部查询。外部查询中的每一行都将固定值替换为使用别名dep的内部查询。

例如,对于外部查询的某行,内部查询的行为与select salary from hr.employees emp where salary > 1000 and emp.department_id = 1类似,对于其他行,如select salary from hr.employees emp where salary > 1000 and emp.department_id = 2等。(注意,select子句中的实际列在这里并不重要,选择1也可以。(

从实现的角度来看,可以进行一些优化,但我目前认为这不是您理解查询意义所希望的。

在子查询中,先执行内部查询,然后执行外部查询,对吗?

否。您遗漏了有关SQL的一个基本点。它是一种描述性语言,而不是程序性语言。

SQL查询描述生成的结果集。它没有指定确切的处理方式。事实上,处理的内容通常看起来一点也不像查询。它是各种数据流操作的有向无环图(DAG(。

SQL编译器/优化器生成DAG。

最新更新