在 MySQL 中,WHERE
和 HAVING
都用于过滤数据,但它们的作用范围和使用场景不同。以下是它们的区别和适用场景:
1. 适用范围
WHERE
- 用于过滤原始数据。
- 在查询语句执行之前应用,主要用于过滤表中的行。
- 不能用于过滤聚合函数的结果(例如
SUM()
、AVG()
等)。
HAVING
- 用于过滤聚合后的结果。
- 在聚合操作之后应用,主要用于过滤
GROUP BY
分组后的结果。 - 可以用于过滤聚合函数的结果。
2. 执行顺序
在 SQL 查询的执行顺序中:
- FROM:先从表中读取数据。
- WHERE:过滤原始数据。
- GROUP BY:将数据分组。
- 聚合函数:对分组数据进行计算(如求和、计数等)。
- HAVING:对分组和聚合后的结果进行过滤。
- SELECT:返回最终结果。
- ORDER BY:对结果排序。
因此,WHERE
总是先于 HAVING
执行。
3. 使用示例
使用 WHERE
SELECT name, salary
FROM employees
WHERE salary > 5000;
- 这里
WHERE
过滤的是employees
表中的行,找出salary > 5000
的员工。
使用 HAVING
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 6000;
- 这里
HAVING
用于过滤分组后的结果,找出平均工资大于 6000 的部门。
WHERE 和 HAVING 一起使用
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
WHERE salary > 3000
GROUP BY department_id
HAVING AVG(salary) > 6000;
- WHERE:先过滤掉
salary <= 3000
的记录。 - HAVING:再过滤出平均工资大于 6000 的分组。
总结
- WHERE:作用在原始数据上,不能使用聚合函数。
- HAVING:作用在分组或聚合后的数据上,可以使用聚合函数。
在查询中,可以根据数据过滤的阶段来选择使用WHERE
或HAVING
。