Oracle SQL子句评估顺序

时间:2010-05-16 01:07:57

标签: sql oracle clause operator-precedence

在Oracle中,首先评估哪些子句类型?如果我有以下(假装....表示有效的表达式和关系名称),评估的顺序是什么?

SELECT   ...
FROM     .....
WHERE    ........
GROUP BY ...........
HAVING   .............
ORDER BY ................

我的印象是最后评估了SELECT子句,但除此之外我一无所知。

5 个答案:

答案 0 :(得分:4)

最后不能总是评估选择列表,因为ORDER BY可以使用在选择列表中定义的别名,因此必须在之后执行它们。例如:

SELECT foo+bar foobar FROM table1 ORDER BY foobar

我会说,一般来说执行的顺序可能是这样的:

  • FROM
  • WHERE
  • GROUP BY
  • 选择
  • HAVING
  • ORDER BY

可以在不改变结果的情况下交换GROUP BY和WHERE子句,就像HAVING和ORDER BY一样。

实际上事情更复杂,因为数据库可以根据不同的执行计划对执行重新排序。只要结果保持不变,它的执行顺序就无关紧要。

另请注意,如果为ORDER BY子句选择了索引,则从磁盘读取行时,行可能已按正确顺序排列。在这种情况下,ORDER BY子句根本没有真正执行。

答案 1 :(得分:3)

这就是执行计划的目的。但是,一般来说,只有一种方法可以做到这一点。我暂时忽略了优化:

  • FROM获取相关表格
  • 开始扫描FROM中的表,保留那些通过WHERE子句
  • 的表
  • SELECT unaggregated columns
  • 使用GROUP BY计算汇总列
  • 保留通过HAVING子句
  • 的分组结果
  • 使用ORDER BY订购结果

优化可能会导致某些“偷看”做出更好的决策(例如,在扫描表之前检查WHERE子句是个好主意 - 索引可能是可用的)。

我相信大多数RDBMS通过预先通过优化器来解决这个问题,优化器基本上会重写查询以利用索引,删除冗余表达式等。然后使用这个优化的查询来实际构建执行计划。还有可能改变细节的并行性 - 但基础是相同的。

答案 2 :(得分:3)

Oracle查询处理订单

  • FROM clause
  • WHERE子句
  • GROUP BY子句
  • HAVING条款
  • SELECT条款
  • ORDER BY子句

答案 3 :(得分:2)

下面是SQL查询处理顺序:

  1. FROM
  2. CONNECT BY
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. SELECT
  7. ORDER BY

答案 4 :(得分:0)

SELECT语句的逻辑处理顺序

  1. 开启
  2. 加入
  3. 位置
  4. 多维数据集或具有汇总功能
  5. 拥有
  6. 选择
  7. DISTINCT
  8. ORDER BY

这是用于编写/(逻辑思考)查询的逻辑顺序。为了提高效率,数据库可以在实际执行期间以不同的方式优化查询,只要返回的结果与遵循该执行顺序相同即可。

参考

Microsoft T-SQL
Oracle Blog