SQLPathLab
SQL 实战指南 · MySQL 8.0

SQL 书写顺序与实际执行顺序

理解 FROM、WHERE、GROUP BY、HAVING、SELECT 和 ORDER BY 的逻辑先后。

问题与判断方法

SQL 写在前面的部分不一定先执行。理解逻辑顺序可以解释为什么 SELECT 中的别名通常不能直接用于 WHERE,也能判断筛选应放在分组前还是分组后。常见逻辑顺序是 FROM/JOIN、WHERE、GROUP BY、HAVING、SELECT、DISTINCT、ORDER BY、LIMIT。

排查复杂查询时,先确认 FROM 和 JOIN 产生的基础行,再逐步加入 WHERE、GROUP BY 与 HAVING。这样比一次阅读完整语句更容易发现行数在哪一步发生变化。

执行顺序是理解模型,不代表数据库一定按这个物理顺序运行。优化器可能重写查询,但不会改变符合 SQL 语义的最终结果。

示例

示例数据表

表名:orders
orders
departmentamount
Sales 1200
IT 900
Sales 1500
HR 700

优化前 / 不推荐

SELECT department, SUM(amount) AS total FROM orders WHERE amount >= 1300 GROUP BY department ORDER BY total DESC;

优化前运行结果

result
departmenttotal
Sales 1500

优化后 / 推荐

SELECT department, SUM(amount) AS total FROM orders GROUP BY department HAVING SUM(amount) >= 1300 ORDER BY total DESC;

优化后运行结果

result
departmenttotal
Sales 2700

为什么这样更好:WHERE 先删除金额低于 1300 的明细,再计算部门总额;HAVING 先汇总完整部门金额,再筛选总额。两者不能互换。

这篇内容是否清楚?