Oracle Select子句的执行顺序

bf1o4zei  于 2022-12-22  发布在  Oracle
关注(0)|答案(2)|浏览(224)

请考虑具有以下结构的查询:

select ..., ROWNUM
  from t
 where <where clause>
 group by <columns>
having <having clause>
 order by <columns>;

据我所知,处理的顺序是
1.先执行FROM/WHERE子句。

  1. ROWNUM被分配给FROM/WHERE子句的每个输出行并递增。
    1.应用GROUP BY。
    1.应用HAVING。
    1.应用ORDER BY。
    1.应用SELECT。
    我不明白为什么TOM在Oracle杂志中指定this article
    将其视为按以下顺序处理:
    1.先执行FROM/WHERE子句。
  2. ROWNUM被分配给FROM/WHERE子句的每个输出行并递增。
    1.应用SELECT。
    1.应用GROUP BY。
    1.应用HAVING。
    1.应用ORDER BY。
    有人能解释一下这个命令吗?
mspsb9vt

mspsb9vt1#

SQL语句中的子句与处理顺序之间没有直接关系。SQL查询分两个阶段进行处理。在第一阶段,编译并优化代码。运行优化版本。
出于分析目的,将按特定顺序对查询进行评估。例如,首先分析FROM,然后分析WHERE,再分析GROUP BY,依此类推。这解释了为什么在SELECT中定义的列别名在FROM中不可用。
但是,您对ROWNUM的描述是不正确的。ROWNUM是Oracle中的特殊构造...如documentation中所述。它在ORDER BY之前处理。

k0pti3hp

k0pti3hp2#

我认为,识别SQL语句的执行顺序不仅困难,而且实际上尝试这样做对您理解SQL是有害的。
SQL是一种声明性语言,您可以在其中定义所需的结果,而不是实现该结果的方式(尽管可能会产生很大的影响)。我有过很多次被更熟悉传统语言的开发人员问到“那么这个SQL是如何执行的呢?”的经历,事实是SQL根本没有告诉你这一点,一旦情况不是简单化的,你就不能以“错误的方式”思考SQL。
这可能类似于面向对象语言和非面向对象语言之间的区别,或者函数式编程和过程式编程之间的区别--必然涉及不同的思维方式。
在SQL中,重点应该放在理解语法和它如何定义结果集上,然后放在理解数据库在它所引用的模式上下文中处理SQL的方式上。
我将重点阅读有关此主题的Oracle Concepts Guide,它解释了提交给系统的查询将经历以下各个阶段(这是一个简单的概述):
1.解析
1.转型
1.估算
1.计划生成
1.执行
重要的是要认识到 * 执行的SQL实际上可能不是您提交的SQL *,但您可以使用各种开发人员工具来深入了解几乎所有这些阶段。
这是一个非常不同的世界!

相关问题