HAVING
HAVING 是分组后的过滤器——WHERE 在分组前过滤行,HAVING 在分组后过滤组。为什么需要 HAVING?因为聚合函数的计算结果(SUM、AVG、COUNT)在 WHERE 执行时还不存在。你想"筛掉平均工资低于 8000 的部门",WHERE AVG(basic_salary) > 8000 是语法错误——必须在 HAVING 里写。
一句话记住:WHERE 管行,HAVING 管组。两者可以同时出现:WHERE 先筛掉不符合条件的行,GROUP BY 对剩余行分组,聚合函数计算,最后 HAVING 筛掉不符合条件的组。
以飞翔科技为例:
-- 平均工资超过 10000 的部门
SELECT dept_code, AVG(basic_salary) AS 平均工资
FROM employees
GROUP BY dept_code
HAVING AVG(basic_salary) > 10000;
-- 商品数量超过 5 件的店铺
SELECT shop_name, COUNT(*) AS 商品数
FROM products
GROUP BY shop_name
HAVING COUNT(*) > 5;
-- 技术部里按工资等级分组,只看超过 1 人的等级
SELECT salary_grade, COUNT(*) AS 人数
FROM employees
WHERE dept_code = 2
GROUP BY salary_grade
HAVING COUNT(*) > 1;
第三个例子展示了 WHERE + HAVING 的完整流程:先用 WHERE dept_code = 2 限定技术部,再 GROUP BY salary_grade 分组,最后 HAVING COUNT(*) > 1 只保留人数大于 1 的等级。一步套一步,层次分明。