select 执行的先后顺序:
- FROM 阶段: 数据首先从表中获取,这是查询开始的地方。
- ON 阶段(连接条件): 在连接的表中,根据连接条件(ON 子句)筛选匹配的行。这是连接操作的一部分。(如果有连接)
- WHERE 阶段: 在
WHERE子句中对数据进行筛选,只选择满足条件的行。 - GROUP BY 阶段: 如果查询包含
GROUP BY子句,则按照指定的列对数据进行分组。 - HAVING 阶段: 在
HAVING子句中对分组进行筛选,只选择满足条件的分组。 - SELECT 阶段: 在
SELECT子句中选择要返回的列,可以包含聚合函数。 - ORDER BY 阶段: 如果查询包含
ORDER BY子句,则按照指定的列对结果进行排序。 - LIMIT 阶段: 通过
LIMIT子句限制返回的行数。
需要注意的是,虽然这是一个一般情况下的执行顺序,但优化器可能会对查询进行重写以提高性能。例如,有时候会使用索引来加速 WHERE 子句的执行,或者使用聚合索引来加速 GROUP BY 操作。
此外,HAVING 子句是在 GROUP BY 之后执行的,因为它涉及到对分组进行条件过滤。而 ORDER BY 和 LIMIT 是在 SELECT 阶段之后执行的。