执行顺序Oracle Select子句

时间:2015-08-29 13:05:27

标签: sql oracle

考虑具有此结构的查询:

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.应用SELECT。

我无法理解为什么TOM指定的Oracle杂志中的this article

将其视为按此顺序处理:

  1. FROM / WHERE子句首先出现。
  2. ROWNUM被分配并递增到FROM / WHERE子句的每个输出行。
  3. 应用SELECT。
  4. 应用GROUP BY。
  5. 已应用HAVING。
  6. 应用ORDER BY。
  7. 任何人都可以解释这个命令吗?

3 个答案:

答案 0 :(得分:0)

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

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

但是,您对ROWNUM的说明不正确。 ROWNUM是Oracle中的一个特殊构造。 。 。正如documentation中所解释的那样。它在ORDER BY之前处理。

答案 1 :(得分:0)

两个处理订单的唯一区别在于“group by”“select”子句。我们可以通过这个简单的例子解决这个问题。

我有一个带有“emp_id”列的表“emp”。现在让我在 group by select 子句中给出错误的列名,让我们先看看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

因此,这证明在“选择”之前处理“分组依据”。希望这能清除你的怀疑。

答案 2 :(得分:0)

我认为不仅难以识别SQL语句的执行顺序,实际上这对您理解SQL有害。

SQL是一种声明性语言,您可以在其中定义所需的结果,而不是实现该结果的方式(尽管可能会强烈影响该方式)。我有很多被问到的经历,“那么这个SQL如何被执行?”开发人员更熟悉传统语言,事实上,SQL并没有告诉你这一点,期望非常简单的情况。只要案例不简单,你就不能以“错误的方式”思考SQL。

它可能类似于面向对象语言和非面向对象语言之间的区别,或者功能编程和程序编程之间的区别 - 必然会有不同的思维方式。

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

我将专注于阅读有关该主题的Oracle Concepts Guide,这解释了提交给系统的查询经历了各个阶段(这是一个简单的概述):

  1. 解析
  2. 转化
  3. 估计
  4. 计划生成
  5. 执行
  6. 重要的是要意识到执行的SQL可能实际上并不是您提交的SQL ,但您可以使用各种开发人员工具深入了解所有这些阶段。

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