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并返回。此阶段常用于分页查询。
关键总结