HAVING 与 WHERE 的核心区别:WHERE 在分组前过滤原始数据,HAVING 在分组后过滤聚合结果。
核心区别
| 关键字 | 过滤时机 | 过滤对象 | 聚合函数 |
|---|
| WHERE | 分组前 | 原始数据行 | 不能使用 |
| HAVING | 分组后 | 分组统计结果 | 可使用 |
执行顺序
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