我在谷歌上搜索了这个问题,所有答案都说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;