首页/数据/数据库速查/HAVING 分组后过滤
本包目录(495 条)
MySQL 基础与连接36 条
SQL 语法52 条
用户与权限21 条备份与恢复56 条主从复制与高可用53 条性能与调优57 条Redis 命令96 条Redis 运维与场景124 条

HAVING 分组后过滤

对聚合结果过滤只能用 HAVING;能提前到 WHERE 的条件尽量下推,HAVING 只留聚合判断。

数据库速查数据更新于 2026-10-12
用途分组结果过滤
位置GROUP BY 之后、ORDER BY 之前
对比WHERE 过滤行,HAVING 过滤组

用法示例

用法示例
SELECT user_id, COUNT(*) AS cnt, SUM(amount) AS total
FROM orders
WHERE created_at >= '2026-09-01'   -- 先筛行
GROUP BY user_id
HAVING cnt >= 5 AND total > 1000   -- 再筛组
ORDER BY total DESC
LIMIT 20;
HAVING 里可以引用 SELECT 别名(MySQL 支持);标准 SQL 更严格,跨库脚本建议写聚合表达式本身。

易错点

  • 把本可在 WHERE 的普通条件写进 HAVING 会导致多分组再过滤,性能更差
  • HAVING 用别名时某些客户端/兼容模式不支持,注意可移植性

数据来源与参考

  • MySQL 8.0 Reference Manual: SELECT - HAVING Clause

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌