一尘不染

Oracle SQL子句评估顺序

sql

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

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

我的印象是SELECT子句最后被求值,但除此之外,我一无所知。


阅读 140

收藏
2021-03-17

共1个答案

一尘不染

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

SELECT foo+bar foobar FROM table1 ORDER BY foobar

我要说的是,通常执行的顺序可能是这样的:

  • 在哪里
  • 通过…分组
  • 选择
  • 拥有
  • 订购

可以交换GROUP BY和WHERE子句而不更改结果,HAVING和ORDER BY也可以。

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

还要注意,如果为ORDER BY子句选择了索引,则从磁盘读取行时,它们的顺序可能已经正确。在这种情况下,根本不会真正执行ORDER BY子句。

2021-03-17