HAVING 与 WHERE 的核心区别:WHERE 在分组前过滤原始数据,HAVING 在分组后过滤聚合结果。
核心区别
| 关键字 | 过滤时机 | 过滤对象 | 聚合函数 |
|---|---|---|---|
| WHERE | 分组前 | 原始数据行 | 不能使用 |
| HAVING | 分组后 | 分组统计结果 | 可使用 |
执行顺序
FROM→ 2.WHERE→ 3.GROUP BY→ 4. 聚合计算 → 5.HAVING→ 6.SELECT→ 7.ORDER BY
使用示例
-- 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:过滤时机更早,减少后续计算量。
-- 推荐:先过滤再分组
WHERE price > 100
-- 不推荐:先分组再过滤
HAVING price > 100快速判断
| 条件类型 | 使用关键字 |
|---|---|
| 普通字段 | WHERE |
| 聚合函数(COUNT/AVG/SUM/MAX/MIN) | HAVING |
一句话:WHERE 管原始数据,HAVING 管聚合结果。