一、HAVING与WHERE的本质区别
1. 执行阶段的差异
-
WHERE:在数据分组前对原始行进行过滤,作用于磁盘数据读取阶段。
-
HAVING:在GROUP BY分组后对聚合结果进行过滤,作用于内存计算结果集。
2. 使用限制对比
特性 | WHERE | HAVING |
---|---|---|
使用聚合函数 | 不允许(如SUM、AVG) | 允许 |
执行顺序 | GROUP BY之前 | GROUP BY之后 |
索引利用 | 可命中索引 | 无法直接利用索引 |
性能影响 | 减少分组数据量 | 过滤已计算的结果 |
3. 典型错误示例
-- 错误:WHERE中使用了聚合函数
SELECT department, AVG(salary)
FROM employees
WHERE AVG(salary) > 10000 -- 报错!
GROUP BY department;
-- 正确:改用HAVING
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 10000;