张芷铭的个人博客

HAVING 与 WHERE 的核心区别:WHERE 在分组前过滤原始数据,HAVING 在分组后过滤聚合结果。

核心区别

关键字过滤时机过滤对象聚合函数
WHERE分组前原始数据行不能使用
HAVING分组后分组统计结果可使用

执行顺序

  1. FROM → 2. WHERE → 3. GROUP BY → 4. 聚合计算 → 5. HAVING → 6. SELECT → 7. ORDER BY

使用示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
-- WHERE:过滤普通字段
SELECT category_id, COUNT(*) AS cnt
FROM products
WHERE price > 100
GROUP BY category_id;

-- HAVING:过滤聚合结果
SELECT category_id, COUNT(*) AS cnt
FROM products
GROUP BY category_id
HAVING COUNT(*) > 5;

-- 组合使用
SELECT category_id, COUNT(*) AS cnt
FROM products
WHERE price > 100
GROUP BY category_id
HAVING COUNT(*) > 5;

性能原则

WHERE 优先于 HAVING:过滤时机更早,减少后续计算量。

1
2
3
4
5
-- 推荐:先过滤再分组
WHERE price > 100

-- 不推荐:先分组再过滤
HAVING price > 100

快速判断

条件类型使用关键字
普通字段WHERE
聚合函数(COUNT/AVG/SUM/MAX/MIN)HAVING

一句话:WHERE 管原始数据,HAVING 管聚合结果。

Comments