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| department | amount |
|---|---|
| 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;优化前运行结果
| department | total |
|---|---|
| Sales | 1500 |
优化后 / 推荐
SELECT department, SUM(amount) AS total FROM orders GROUP BY department HAVING SUM(amount) >= 1300 ORDER BY total DESC;优化后运行结果
| department | total |
|---|---|
| Sales | 2700 |
为什么这样更好:WHERE 先删除金额低于 1300 的明细,再计算部门总额;HAVING 先汇总完整部门金额,再筛选总额。两者不能互换。
这篇内容是否清楚?
感谢反馈,我们会把它用于后续内容复核。