如何理解SELECT和ORDER BY的执行顺序



我在谷歌上搜索了这个问题,所有答案都说SELECT是在ORDER BY之前执行的。但下面的简单示例(使用MySQL和sakila数据库(给出了正确的排序结果。显然,ORDER BY不会在SELECT之后执行,因为SELECT没有选择customer_id。有人能解释一下发生了什么吗?

SELECT rental_date FROM rental ORDER BY customer_id LIMIT 10;

SQL中根本没有执行序列。

SQL是一种声明性语言,而不是命令式。您正试图在SQL和命令式语言(如Java、Python或C#(之间建立一种并行关系。。。但是没有。

每个SQL引擎都可以自由地重写/改写查询(随意(,以任何顺序执行,甚至可以随着时间的推移更改其策略,只要它根据约束结果集的谓词返回数据即可。

就是这样,不多不少。

这就是您想要的吗?

请记住,执行顺序是一条一般规则,任何给定查询的解析方式可能会有所不同,具体取决于索引、缓存等。

但话虽如此,如果你想了解你的查询是如何在这些通用指南下解析的,它会是这样的:

一般执行顺序:

  • FROM子句:将表rental作为初步结果集拉入内存
  • WHERE子句:不应用筛选;显示完整的结果集
  • SELECT子句:仅在最终结果集中显示列rental_date。(内存中仍然存在完整的表。(
  • GROUP BY子句:不应用分组或聚合
  • HAVING子句:不应用聚合值进行筛选
  • ORDER BY子句:使用列customer_id对显示的结果集进行排序

引擎可以对所有结果进行排序,但在显示LIMIT子句中请求的行数之前,可能只对足够的结果进行排序以满足该子句。

显然,在SELECT之后不会执行ORDER BY,因为SELECT没有选择customer_id

你误解了这里的概念。select子句定义哪些列将出现在结果集中,order by子句定义行的排序方式。

数据库实际如何执行查询,以及不同子句按哪个顺序考虑,则是另一回事。SQL是一种描述性语言:您告诉数据库您想要的结果,而不是它应该如何进行。

如果希望查询返回customer_id,则将其添加到select子句:

SELECT customer_id, rental_date FROM rental ORDER BY customer_id LIMIT 10;

最新更新