sql执行顺序是什么

sql执行顺序是什么
最新回答
他年词笔隐

2026-10-22 00:43:13

SQL语句在MySQL中的执行顺序分为以下11个阶段,每个阶段生成虚拟表(VT)作为下一阶段的输入,最终返回最后一个虚拟表的结果:

1. FROM阶段
首先对FROM子句中涉及的表进行笛卡尔积运算,生成初始虚拟表VT1。若包含多个表,则依次处理每对表的连接。

2. ON阶段
对VT1应用JOIN操作的连接条件(如ON t1.id = t2.id),筛选符合条件的行生成VT2。此阶段仅处理内连接(INNER JOIN)的过滤。

3. JOIN阶段
若存在外连接(如LEFT JOIN、RIGHT JOIN),保留左表或右表中未匹配的行,添加到VT2中生成VT3。若FROM包含多个表,则循环执行步骤1-3直至所有表处理完毕。

4. WHERE阶段
对VT3应用WHERE条件(如WHERE age > 18),过滤符合条件的行生成VT4。注意:WHERE无法使用SELECT中定义的别名或聚合函数。

5. GROUP BY阶段
根据GROUP BY子句的列对VT4进行分组,生成VT5。每组对应一行结果,未分组的列需包含在聚合函数中。

6. CUBE | ROLLUP阶段(可选)
若存在GROUP BY的扩展操作(如CUBE或ROLLUP),对VT5生成多维度汇总行,生成VT6。此阶段用于生成数据透视表等复杂分析。

7. HAVING阶段
对VT6应用HAVING条件(如HAVING COUNT(*) > 5),过滤分组后的结果生成VT7。与WHERE的区别:HAVING可过滤聚合结果。

8. SELECT阶段
选择VT7中的指定列(含表达式或别名),生成VT8。此时可计算非聚合列(如SELECT name, AVG(score))。

9. DISTINCT阶段(可选)
对VT8进行去重操作,生成VT9。若SELECT中包含DISTINCT关键字,则执行此步骤。

10. ORDER BY阶段
根据ORDER BY子句的列对VT9排序,生成VT10。排序可能影响性能,尤其是大数据量时。

11. LIMIT阶段
从VT10中截取指定范围的行(如LIMIT 10 OFFSET 20),生成最终结果VT11并返回。此阶段常用于分页查询。

关键总结

  • 执行顺序与书写顺序不同:实际流程为FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT。
  • 虚拟表机制:每个阶段的结果仅作为下一阶段输入,用户不可见。
  • 条件过滤位置:WHERE在分组前过滤行,HAVING在分组后过滤组。
  • 性能优化重点:优先通过WHERE和JOIN条件减少数据量,避免在ORDER BY或GROUP BY中处理过多数据。