SQL 查询语句先执行 SELECT?
				
									
					
					
						|  | 
							admin 2025年2月3日 1:6
								本文热度 1550 | 
					
				 
				在 SQL 查询中,查询的执行顺序并不是按照语句中编写的顺序执行的,实际上,SQL 的执行顺序是由数据库查询优化器决定的。理解 SQL 查询的执行顺序对调优查询性能非常重要,特别是在涉及复杂查询时。
1. SQL 查询执行的顺序
虽然 SQL 查询语句看起来是从上到下逐步执行的,但数据库会根据内部的执行计划重新安排各个部分的执行顺序。标准的 SQL 执行顺序如下:
- FROM: 从数据源(表、视图或连接)中检索数据。 
- ON: 对连接条件进行过滤(如果使用了连接操作,如 - JOIN)。
 
- JOIN: 执行连接操作,合并不同的数据集。 
- WHERE: 对数据应用过滤条件,排除不符合条件的行。 
- GROUP BY: 对数据进行分组。 
- HAVING: 对分组后的数据应用过滤条件。 
- SELECT: 选择并返回列,确定需要查询的字段。 
- DISTINCT: 去除重复的行。 
- ORDER BY: 对结果进行排序。 
- LIMIT / OFFSET: 限制返回的结果集大小或偏移量。 
注意:SELECT 语句是在查询的最后阶段执行的,它是结果集返回给用户的那一部分。但数据库通常会先执行数据检索、过滤、分组等操作,再进行选择列和去重的操作。
2. 执行顺序分析
让我们通过一个具体的例子来详细分析 SQL 查询的执行顺序。
假设我们有以下 SQL 查询:
SELECT customer_id, COUNT(order_id)
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id
WHERE order_date > '2024-01-01'
GROUP BY customer_id
HAVING COUNT(order_id) > 5
ORDER BY COUNT(order_id) DESC
LIMIT 10;
执行步骤:
- FROM: 
- JOIN: 
- ON: 
- WHERE: 
- GROUP BY: 
- HAVING: 
- SELECT: 
- DISTINCT (如果存在): 
- ORDER BY: 
- LIMIT / OFFSET: 
3. 为什么 SELECT 是最后执行的?
理解 SELECT 作为最后执行的操作,需要从 SQL 查询的优化角度考虑。SQL 查询的设计本意是让数据库引擎从底层开始处理数据(即从数据源提取数据、连接、过滤),直到用户需要的最终结果,这时才是数据选择的阶段。
以下是具体的原因:
- 数据检索与过滤优先:执行计划从底层表中检索数据,并根据查询条件(- WHERE)和连接条件(- JOIN)过滤数据。如果在这时就进行- SELECT,将会浪费资源提取不必要的字段。
 
- 聚合与分组优先:在执行 - SELECT之前,数据库需要先进行数据的分组(- GROUP BY),然后根据分组的结果应用聚合函数(如- COUNT()、- SUM()、- AVG()等)。只有在分组和聚合之后,才能知道哪些列需要被选取,并根据这些结果生成最终的输出。
 
- 排序与限制:数据库通常会在生成了满足查询条件的完整结果集后,才进行排序(- ORDER BY)和限制(- LIMIT)操作。如果早早执行- SELECT,排序和去重可能会浪费资源。
 
4. 执行顺序的示例:
假设你有以下查询:
SELECT product_id, COUNT(order_id)
FROM orders
JOIN products ON orders.product_id = products.product_id
WHERE order_date > '2023-01-01'
GROUP BY product_id
HAVING COUNT(order_id) > 10
ORDER BY COUNT(order_id) DESC;
执行步骤(按顺序):
- FROM: 从 - orders和- products表中获取数据。
 
- JOIN: 将 - orders表和- products表连接起来,条件是- orders.product_id = products.product_id。
 
- WHERE: 过滤出 - order_date > '2023-01-01'的记录。
 
- GROUP BY: 按 - product_id对结果进行分组。
 
- HAVING: 保留那些 - COUNT(order_id) > 10的产品。
 
- SELECT: 返回 - product_id和计算的- COUNT(order_id)。
 
- ORDER BY: 按照订单数降序排列结果。 
- LIMIT (如果有的话): 限制返回的行数。 
5. 总结
- SQL 查询的执行顺序从逻辑上与我们编写查询时的顺序不同,SQL 引擎会根据执行计划优化查询。 
- SELECT是在查询的最后执行的,原因是查询执行计划需要先完成数据检索、连接、过滤、分组等操作,然后再根据需要选择和输出列。
 
- SELECT作为最后步骤是为了确保只有在完成所有计算和过滤后,数据库才会提取最终所需的列,从而避免无谓的计算和资源浪费。
 
理解 SQL 查询的执行顺序是优化 SQL 查询性能和调试复杂查询的重要基础。
阅读原文:原文链接
该文章在 2025/2/5 17:21:48 编辑过