Oracle SQL 子句求值顺序

jon*_*son 4 sql oracle clause operator-precedence

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

SELECT   ...
FROM     .....
WHERE    ........
GROUP BY ...........
HAVING   .............
ORDER BY ................
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 5

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

SELECT foo+bar foobar FROM table1 ORDER BY foobar
Run Code Online (Sandbox Code Playgroud)

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

  • 在哪里
  • 通过...分组
  • 选择
  • 订购者

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

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

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

  • GROUP 在选择中不需要聚合。你可以做 SELECT cust_id FROM orders GROUP BY cust_id HAVING COUNT(*) > 10; 你甚至可以在没有 HAVING 的情况下做到这一点(实际上,使它成为一个 DISTINCT) (3认同)
  • 如果不先做 WHERE,你就不能 GROUP。GROUP 在 SELECT 中需要一个聚合函数,并且您不能将不满足 WHERE 的行提供给该聚合。 (2认同)