我有这个查询,但我不清楚它是如何工作的。
在子查询中,先执行内部查询,然后执行外部查询,对吗?所以在这种情况下,这个内部查询
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。