Oracle Select子句的执行顺序

问题描述 投票:1回答:3

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

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

根据我的理解,处理顺序为1. FROM / WHERE子句排在最前面。2. ROWNUM被分配并从FROM / WHERE子句递增到每个输出行。3.应用GROUP BY。4.应用HAVING。5.应用ORDER BY。6.应用选择。

我不明白为什么TOM在Oracle杂志中的this article指定:

认为它是按此顺序处理的:

  1. FROM / WHERE子句排在最前面。
  2. ROWNUM已分配,并从FROM / WHERE子句增加到每个输出行。
  3. 选择已应用。
  4. GROUP BY已应用。
  5. 已应用。
  6. ORDER BY被应用。

任何人都可以解释这个顺序吗?

sql oracle
3个回答
0
投票

SQL语句中的子句与处理顺序之间没有直接关系。 SQL查询分两个阶段进行。在第一阶段,对代码进行编译和优化。运行优化版本。

出于分析目的,将按特定顺序评估查询。例如,首先解析FROM,然后解析WHERE,然后解析GROUP BY,依此类推。这解释了为什么SELECT中定义的列别名在FROM中不可用。

但是,关于ROWNUM,您的描述不正确。 ROWNUM是Oracle中的特殊构造。 。 。如documentation中所述。在ORDER BY之前进行处理。


0
投票

两个处理顺序中唯一的区别在于“ group by”“ select”

子句。我们可以通过这个简单的例子解决这个问题。

我有一个表“ emp”和一个列“ emp_id”。现在,让我在group byselect

子句中输入不正确的列名,然后让我们看看Oracle首先选择了哪个。
select max(select_test) from emp
 group by group_test;

返回错误

ORA-00904: "GROUP_TEST": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 2 Column: 15

因此,这证明“ group by”“ select”

之前被处理。希望这能消除您的疑问。

0
投票

我认为,不仅要识别SQL语句的执行顺序,而且这样做实际上对您对SQL的理解有害。

SQL是一种声明性语言,您可以在其中定义所需的结果,而不是实现结果的方式(尽管有可能强烈影响该方式)。我曾被问过很多经验,“那么如何执行此SQL?”由对传统语言更加熟悉的开发人员开发的,而事实是SQL根本不会告诉您,只需要非常简单的情况即可。一旦情况变得不简单,您就无法以“错误的方式”考虑SQL。

它可能类似于面向对象的语言和非面向对象的语言之间的差异,或者功能编程和过程编程之间的差异-所涉及的思维方式必然不同。

在SQL中,重点应放在理解语法及其如何定义结果集,然后在理解其所引用的模式的上下文中理解数据库处理SQL的方式。

我将重点阅读有关该主题的Oracle Concepts Guide,这说明提交给系统的查询经历了以下各个阶段(这是一个简单的概述):

  1. 解析中
  2. 转换
  3. 估计
  4. 计划生成
  5. 执行

重要的是要意识到执行的SQL实际上可能不是您提交的SQL],但是您可以使用各种开发人员工具来深入了解所有这些阶段。

这是一个非常不同的世界!

© www.soinside.com 2019 - 2024. All rights reserved.