标准答案

  1. 逻辑上先处理 FROM 和 JOIN,形成参与查询的行集合。
  2. WHERE 在分组和聚合前过滤普通行,不能直接使用同层 SELECT 别名或聚合结果。
  3. GROUP BY 把行分组,聚合函数在组内计算;HAVING 用来过滤聚合后的组。
  4. SELECT 决定输出表达式,DISTINCT 在投影后去重,ORDER BY 再排序,LIMIT 最后截取结果。
  5. 优化器可以改变物理执行方式,但结果语义必须等价,理解逻辑顺序有助于写出正确 SQL。

题目解析

逻辑顺序最常用来解释两个问题:为什么聚合条件通常放 HAVING 而不是 WHERE,以及为什么某些数据库不能在 WHERE 中引用 SELECT 别名。它也能帮助判断过滤应该尽量前置,减少后续 JOIN、分组和排序的输入。

不要把逻辑顺序误解为数据库逐步生成完整中间表。优化器会下推条件、重排 JOIN 和选择索引,但不能改变 SQL 所表达的可观察结果。

常见误区

  • 把聚合后的条件写在 WHERE 中,得到错误结果或直接语法报错。
  • 误认为 SQL 从 SELECT 开始执行,导致无法解释别名和聚合的可见范围。

作者信息