考虑具有此结构的查询:
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:
将其视为按此顺序处理:
任何人都可以解释这个命令吗?
答案 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,这解释了提交给系统的查询经历了各个阶段(这是一个简单的概述):
重要的是要意识到执行的SQL可能实际上并不是您提交的SQL ,但您可以使用各种开发人员工具深入了解所有这些阶段。
这是一个非常不同的世界!