首页/数据/SQL 速查/HAVING 中使用别名(方言差异)
本包目录(311 条)
查询基础33 条连接与子查询40 条
聚合与窗口函数54 条
函数速查60 条变更与事务52 条性能与执行计划72 条

HAVING 中使用别名(方言差异)

MySQL 允许在 HAVING 引用 SELECT 别名;PostgreSQL 不支持,需要重复写聚合表达式或套一层子查询。

SQL 速查数据更新于 2026-10-12

MySQL 可用别名

MySQL 可用别名
SELECT city, COUNT(*) AS cnt
FROM users
GROUP BY city
HAVING cnt > 5;

PostgreSQL 改写

PostgreSQL 改写
-- 1) 重复聚合表达式
SELECT city, COUNT(*) AS cnt
FROM users
GROUP BY city
HAVING COUNT(*) > 5;

-- 2) 子查询包装
SELECT * FROM (
    SELECT city, COUNT(*) AS cnt
    FROM users
    GROUP BY city
) t
WHERE t.cnt > 5;
MySQLHAVING/GROUP BY/ORDER BY 可用别名
PostgreSQLHAVING 不可用别名;ORDER BY 可以
移植迁移 SQL 时优先写聚合表达式

易错点

  • 从 MySQL 迁到 PG 的报表 SQL 常在 HAVING 别名上翻车,统一改写为原表达式
  • 重复写聚合表达式时要保证与 SELECT 里完全一致,改一处漏一处会得到矛盾结果

数据来源与参考

  • MySQL 8.0 Reference Manual · HAVING
  • PostgreSQL Documentation · SELECT · HAVING
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌