SELECT语句的完整结构
-- 92语法SELECT DISTINCT ...,...(存在聚合函数)FROM ...,...WHERE 多表连接条件 AND 不包含聚合函数的过滤条件GROUP BY ...,...HAVING 包含聚合函数的过滤条件ORDER BY ...,...(ASC/DESC)LIMIT ...,...-- 99语法SELECT DISTINCT ...,...(存在聚合函数)FROM ... ( LEFT / RIGHT ) JOIN ... ON 多表连接条件WHERE 不包含聚合函数的过滤条件GROUP BY ...,...HAVING 包含聚合函数的过滤条件ORDER BY ...,...(ASC/DESC)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 的扩展可以生效:
- 允许在 SELECT LIST、HAVING CONDITION 和 ORDER BY LIST 中使用没有出现在 GROUP BY LIST 中的字段。此时 MYSQL 会随机选择没有出现在 GROUP BY LIST 中的字段的值。效果和使用 ANY_VALUE() 是相同的
- 允许在 HAVING CONDITION 中使用 SELECT LIST 中的 ALIAS
- SELECT @@SQL_MODE查询SQL_MODE设置 :::
