首页/数据/SQL 速查/WHERE 与 HAVING 的分工
聚合与窗口函数54 条

WHERE 与 HAVING 的分工

WHERE 过滤行、HAVING 过滤组:同一条件写在哪一层会影响参与分组的数据量与结果正确性。

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

对比

对比
-- 先过滤行:只统计北京用户
SELECT city, COUNT(*) AS cnt
FROM users
WHERE city = 'Beijing'
GROUP BY city;

-- 组后过滤:统计所有城市,只显示人数大于 5 的
SELECT city, COUNT(*) AS cnt
FROM users
GROUP BY city
HAVING COUNT(*) > 5;
WHERE行级过滤,先执行;不能用聚合函数
HAVING组级过滤,后执行;可用聚合函数
性能能把条件下推到 WHERE 就下推

易错点

  • 把行级条件写进 HAVING 会多统计再丢弃,大表上代价明显
  • WHERE 中直接引用聚合函数会报错:Invalid use of group function / aggregate functions are not allowed in WHERE

数据来源与参考

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