WHERE HAVING
执行时机 分组前过滤 分组后过滤
使用对象 原始表中的列 分组结果或聚合函数计算结果
性能 通常更高效 通常效率较低
1
2
3
4
SELECT department, AVG(salary) 
FROM employees
GROUP BY department
HAVING AVG(salary) > 5000; -- 不能用WHERE过滤聚合结果
1
2
3
4
SELECT product_id, COUNT(*) as order_count
FROM orders
GROUP BY product_id
HAVING order_count > 10; -- 过滤分组后的计数结果
1
2
3
4
SELECT customer_id, SUM(amount) as total_spent
FROM transactions
GROUP BY customer_id
HAVING total_spent > 1000; -- WHERE不能使用别名

使用建议

  1. 优先使用WHERE:能在WHERE中完成的条件就不要用HAVING,减少分组处理的数据量
  2. 必须时才用HAVING:只有当过滤条件依赖于分组结果或聚合函数时才使用HAVING
  3. 组合使用:经常WHERE和HAVING一起使用,先用WHERE初步筛选,再用HAVING对分组结果过滤