如何理解select和order by的执行顺序

oxf4rvwz  于 2021-07-27  发布在  Java
关注(0)|答案(3)|浏览(427)

我在google上搜索了这个问题,所有的答案都说select是在order by之前执行的。但是下面的简单示例(使用mysql和sakila数据库)给出了正确的排序结果。显然,由于select没有选择customer\u id,所以select之后不会执行order by。有人能解释发生了什么事吗? SELECT rental_date FROM rental ORDER BY customer_id LIMIT 10;

zour9fqk

zour9fqk1#

这就是你要找的吗?
请记住,执行序列是一个通用规则,任何给定查询的解析方式可能会有所不同,具体取决于索引、缓存等。
不过,如果您想了解查询是如何在这些通用准则下进行解析的,应该是这样的:
一般执行顺序: FROM 条款:牵引台 rental 作为初步结果集存入内存。 WHERE 条款:不适用过滤;显示完整结果集。 SELECT 子句:仅显示列 rental_date 在最终结果集中(内存中仍然存在完整的表。) GROUP BY 子句:不应用分组或聚合。 HAVING 子句:不应用聚合值筛选。 ORDER BY 子句:使用列对显示的结果集进行排序 customer_id .
引擎可以对所有结果进行排序,但只能对足够的结果进行排序以满足 LIMIT 在显示该子句中请求的行数之前。

zpf6vheq

zpf6vheq2#

sql中根本没有执行序列。
sql是一种声明性语言,而不是命令式语言。您正试图在sql和命令式语言(如java、python或c#)之间建立一种并行性。。。但是没有。
每个sql引擎都可以随意重写/重新表述查询,可以按任意顺序执行,甚至可以随时间改变策略,只要它根据约束结果集的 predicate 返回数据。
就这样。不多不少。

wfsdck30

wfsdck303#

显然, ORDER BY 在选择后不执行,如 customer_id 不是由选择的 SELECT .
你误解了这里的概念。这个 select 子句定义哪些列将出现在结果集中,以及 order by 子句定义行的排序方式。
数据库如何实际执行查询,以及在哪个序列中考虑不同的子句,则是另一回事。sql是一种描述性语言:您告诉数据库您想要的结果,而不是它应该如何进行。
如果希望查询返回 customer_id ,然后将其添加到 select 条款:

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

相关问题