代码与技术常识03 / 10
SQL 的执行顺序
写的顺序和执行的顺序不一样:先 FROM,最后 SELECT。
- 学会用时30 分钟
- 你的收获想通「为什么别名不能用在 WHERE 里」
- 用到的频率每周 2 次
- 难度进阶
该复习了做一下本页的 10 秒自测,答对就能把下次复习推后。去自测
01为什么学
没学之前
SQL 总报错,不知道为什么 WHERE 里不能用 SELECT 里起的别名。
学会之后
知道执行顺序,一眼看出哪个子句能用哪些东西。
- WHERE 和 HAVING 的区别一次想通
- 写复杂查询更有条理
02图解
原理图
flowchart LR A["FROM 选表"] --> B["WHERE 筛行"] B --> C["GROUP BY 分组"] C --> D["HAVING 筛组"] D --> E["SELECT 选列、算别名"] E --> F["ORDER BY 排序"] F --> G["LIMIT 限制行数"]
03基本单元7 个
- FROM先选表
- WHERE筛行
- GROUP BY分组
- HAVING筛组
- SELECT选列
- ORDER BY排序
- LIMIT限制行数
04怎么用
- 执行顺序FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
- WHERE 在分组前筛行,HAVING 在分组后筛组
- 别名在 SELECT 里才产生,所以 WHERE 看不到,ORDER BY 能用
- 聚合函数(SUM、COUNT)不能用在 WHERE,只能用在 HAVING 和 SELECT
05速查表
| 子句 | 能用什么 | 不能用什么 |
|---|---|---|
| WHERE | 原始列 | 聚合结果、SELECT 别名 |
| HAVING | 聚合结果 | 通常不用别名(数据库不同) |
| SELECT | 原始列、聚合 | — |
| ORDER BY | SELECT 别名 | — |
06套用一次
SELECT city, SUM(amount) AS total FROM orders WHERE year = 2026 GROUP BY city HAVING total > 1000 ORDER BY total DESC LIMIT 10;
07常见的坑
在 WHERE 里用别名
WHERE 先于 SELECT,用原表达式或子查询。
把 WHERE 和 HAVING 混用
能先过滤行就用 WHERE,聚合后再过滤才用 HAVING。
08自测与练习
先做 10 秒自测,再动手练一下。
下面哪个子句最先执行?
10 分钟小练习
写一条 GROUP BY 查询,试试把 WHERE 换成 HAVING,看报错信息。
看参考答案
WHERE 里写聚合函数会报错。