我在google上搜索了这个问题,所有的答案都说select是在order by之前执行的。但是下面的简单示例(使用mysql和sakila数据库)给出了正确的排序结果。显然,由于select没有选择customer\u id,所以select之后不会执行order by。有人能解释发生了什么事吗? SELECT rental_date FROM rental ORDER BY customer_id LIMIT 10;
这就是你要找的吗? 请记住,执行序列是一个通用规则,任何给定查询的解析方式可能会有所不同,具体取决于索引、缓存等。 不过,如果您想了解查询是如何在这些通用准则下进行解析的,应该是这样的: 一般执行顺序: FROM 条款:牵引台 rental 作为初步结果集存入内存。 WHERE 条款:不适用过滤;显示完整结果集。 SELECT 子句:仅显示列 rental_date 在最终结果集中(内存中仍然存在完整的表。) GROUP BY 子句:不应用分组或聚合。 HAVING 子句:不应用聚合值筛选。 ORDER BY 子句:使用列对显示的结果集进行排序 customer_id . 引擎可以对所有结果进行排序,但只能对足够的结果进行排序以满足 LIMIT 在显示该子句中请求的行数之前。
显然, 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;
3条答案
按热度按时间zour9fqk1#
这就是你要找的吗?
请记住,执行序列是一个通用规则,任何给定查询的解析方式可能会有所不同,具体取决于索引、缓存等。
不过,如果您想了解查询是如何在这些通用准则下进行解析的,应该是这样的:
一般执行顺序:
FROM
条款:牵引台rental
作为初步结果集存入内存。WHERE
条款:不适用过滤;显示完整结果集。SELECT
子句:仅显示列rental_date
在最终结果集中(内存中仍然存在完整的表。)GROUP BY
子句:不应用分组或聚合。HAVING
子句:不应用聚合值筛选。ORDER BY
子句:使用列对显示的结果集进行排序customer_id
.引擎可以对所有结果进行排序,但只能对足够的结果进行排序以满足
LIMIT
在显示该子句中请求的行数之前。zpf6vheq2#
sql中根本没有执行序列。
sql是一种声明性语言,而不是命令式语言。您正试图在sql和命令式语言(如java、python或c#)之间建立一种并行性。。。但是没有。
每个sql引擎都可以随意重写/重新表述查询,可以按任意顺序执行,甚至可以随时间改变策略,只要它根据约束结果集的 predicate 返回数据。
就这样。不多不少。
wfsdck303#
显然,
ORDER BY
在选择后不执行,如customer_id
不是由选择的SELECT
.你误解了这里的概念。这个
select
子句定义哪些列将出现在结果集中,以及order by
子句定义行的排序方式。数据库如何实际执行查询,以及在哪个序列中考虑不同的子句,则是另一回事。sql是一种描述性语言:您告诉数据库您想要的结果,而不是它应该如何进行。
如果希望查询返回
customer_id
,然后将其添加到select
条款: