MySQL 中,WHEREHAVING 都用于过滤数据,但它们的作用范围和使用场景不同。以下是它们的区别和适用场景:

1. 适用范围

WHERE

  • 用于过滤原始数据
  • 查询语句执行之前应用,主要用于过滤表中的行。
  • 不能用于过滤聚合函数的结果(例如 SUM()AVG() 等)。

HAVING

  • 用于过滤聚合后的结果
  • 聚合操作之后应用,主要用于过滤 GROUP BY 分组后的结果。
  • 可以用于过滤聚合函数的结果。

2. 执行顺序

在 SQL 查询的执行顺序中:

  1. FROM:先从表中读取数据。
  2. WHERE:过滤原始数据。
  3. GROUP BY:将数据分组。
  4. 聚合函数:对分组数据进行计算(如求和、计数等)。
  5. HAVING:对分组和聚合后的结果进行过滤。
  6. SELECT:返回最终结果。
  7. 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:作用在分组或聚合后的数据上,可以使用聚合函数。
    在查询中,可以根据数据过滤的阶段来选择使用 WHEREHAVING