SELECT语句的完整结构

  1. -- 92语法
  2. SELECT DISTINCT ...,...(存在聚合函数)
  3. FROM ...,...
  4. WHERE 多表连接条件 AND 不包含聚合函数的过滤条件
  5. GROUP BY ...,...
  6. HAVING 包含聚合函数的过滤条件
  7. ORDER BY ...,...(ASC/DESC)
  8. LIMIT ...,...
  9. -- 99语法
  10. SELECT DISTINCT ...,...(存在聚合函数)
  11. FROM ... ( LEFT / RIGHT ) JOIN ... ON 多表连接条件
  12. WHERE 不包含聚合函数的过滤条件
  13. GROUP BY ...,...
  14. HAVING 包含聚合函数的过滤条件
  15. ORDER BY ...,...(ASC/DESC)
  16. LIMIT ...,...

SQL语句的执行过程

FROM -> ON -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT

:::info 一般不能在 HAVING CONDITION 中使用 SELECT LIST 中的 ALIAS。
但是 MYSQL 对此作了扩展。在 MYSQL 5.7.5 之前的版本ONLY_FULL_GROUP_BY SQL_MODE 默认不开启。在5.7.5或之后的版本默认开启。
如果 ONLY_FULL_GROUP_BY SQL_MODE 不开启,那么 MYSQL 对标准 SQL 的扩展可以生效:

  1. 允许在 SELECT LIST、HAVING CONDITION 和 ORDER BY LIST 中使用没有出现在 GROUP BY LIST 中的字段。此时 MYSQL 会随机选择没有出现在 GROUP BY LIST 中的字段的值。效果和使用 ANY_VALUE() 是相同的
  2. 允许在 HAVING CONDITION 中使用 SELECT LIST 中的 ALIAS
  3. SELECT @@SQL_MODE查询SQL_MODE设置 :::