作用:用来过滤数据。
案例需求:查询各个部门中工资比10000高的部门信息。
错误写法:

  1. #错误的写法:
  2. SELECT department_id,MAX(salary)
  3. FROM employees
  4. WHERE MAX(salary) > 10000
  5. GROUP BY department_id;

注意:

  • 如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。
  • HAVING必须声明在GROUP BY的后面

正确写法:

  1. #正确的写法:
  2. SELECT department_id,MAX(salary)
  3. FROM employees
  4. GROUP BY department_id
  5. HAVING MAX(salary) > 10000;

HAVING子句使用规则:

  • 行已经被分组。
  • 使用了聚合函数。
  • 满足HAVING子句中条件的分组将被显示。
  • HAVING不能单独使用,必须要跟GROUP BY一起使用

案例需求:查询部门id为10,20,30,40这4个部门中最高工资比10000高的部门信息

  1. # 方法一:
  2. SELECT department_id,MAX(salary)
  3. FROM employees
  4. WHERE department_id IN (10,20,30,40)
  5. GROUP BY department_id
  6. HAVING MAX(salary) > 10000;
  7. # 方法二:
  8. SELECT department_id,MAX(salary)
  9. FROM employees
  10. GROUP BY department_id
  11. HAVING MAX(salary) > 10000 AND department_id IN (10,20,30,40);

方法一比方法二效率更高。
结论:

  • 过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中
  • 当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE中或HAVING中都可以。但是,健议声明在WHERE中

    WHERE 与 HAVING 的对比

  • 从适用范围上来讲,HAVING的适用范围更广。

  • 如果过滤条件中没有聚合函数:这种情况下,WHERE的执行效率要高于HAVING