4

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

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

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

4

5 回答 5

5

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

SELECT foo+bar foobar FROM table1 ORDER BY foobar

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

  • 在哪里
  • 通过...分组
  • 选择
  • 拥有
  • 订购方式

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

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

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

于 2010-05-16T01:38:41.540 回答
3

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

  • FROM 让表参与进来
  • 开始扫描 FROM 中的表,保留那些通过 WHERE 子句的表
  • 选择未聚合的列
  • 使用 GROUP BY 计算聚合列
  • 保留那些通过 HAVING 子句的分组结果
  • 使用 ORDER BY 排序结果

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

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

于 2010-05-16T01:58:38.113 回答
3

Oracle 查询处理顺序

  • FROM 子句
  • WHERE 子句
  • GROUP BY 子句
  • HAVING 子句
  • 选择子句
  • ORDER BY 子句
于 2016-12-02T09:28:38.943 回答
2

下面是 SQL 查询处理顺序:

  1. FROM
  2. CONNECT BY
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. SELECT
  7. ORDER BY
于 2017-03-23T13:13:19.100 回答
1

SELECT语句的逻辑处理顺序

  1. 加入
  2. 在哪里
  3. 通过...分组
  4. WITH CUBE 或 WITH ROLLUP
  5. 拥有
  6. 选择
  7. 清楚的
  8. 订购方式

这是用于编写/(逻辑思考)查询的逻​​辑顺序数据库在实际执行过程中,为了提高效率,可能会采用不同的方式优化查询,只要返回的结果与按照这个执行顺序相同即可。

参考

微软 T-SQL
甲骨文博客

于 2018-08-16T22:52:56.053 回答