有用

代码与技术常识03 / 10

SQL 的执行顺序

写的顺序和执行的顺序不一样:先 FROM,最后 SELECT。

  • 学会用时30 分钟
  • 你的收获想通「为什么别名不能用在 WHERE 里」
  • 用到的频率每周 2 次
  • 难度进阶

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怎么用

  1. 执行顺序FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
  2. WHERE 在分组前筛行,HAVING 在分组后筛组
  3. 别名在 SELECT 里才产生,所以 WHERE 看不到,ORDER BY 能用
  4. 聚合函数(SUM、COUNT)不能用在 WHERE,只能用在 HAVING 和 SELECT

05速查表

子句能用什么不能用什么
WHERE原始列聚合结果、SELECT 别名
HAVING聚合结果通常不用别名(数据库不同)
SELECT原始列、聚合—
ORDER BYSELECT 别名—

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 里写聚合函数会报错。

+配合着学

代码与技术常识的全部 10 条