Mysql中的一个实用关键字HAVING

你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。

点击下方👇关注公众号,带你一起复习后端技术,看看面试考点,补充积累技术知识,每天都为面试准备积累

在 MySQL 中,HAVING 是一个非常有用的关键字,它常用于在 GROUP BY 聚合查询后对聚合结果进行过滤。


01
HAVING 的基本概念


HAVING 和 WHERE 都用于过滤数据,但它们的作用范围不同。

  • WHERE 是在数据分组(GROUP BY)或聚合计算之前过滤数据。

  • HAVING 是在数据分组(GROUP BY)或聚合计算之后对分组结果进行过滤。

HAVING 通常与聚合函数(如 SUM()、COUNT()、AVG() 等)一起使用。


语法

SELECT column1, column2, AGGREGATE_FUNCTION(column3)FROM table_nameWHERE conditionGROUP BY column1, column2HAVING aggregate_conditionORDER BY column1;


02
使用场景


场景 1:结合聚合函数进行过滤

当我们想对分组后的结果应用条件时,HAVING 就派上用场。

示例:统计每个部门的总工资,过滤出总工资大于 10,000 的部门

SELECT department_id, SUM(salary) AS total_salaryFROM employeesGROUP BY department_idHAVING SUM(salary) > 10000;

执行步骤:

  • 先使用 GROUP BY 按部门分组。

  • 对每个分组的工资总和 SUM(salary) 进行计算。

  • 使用 HAVING 过滤出总工资大于 10,000 的部门。


场景 2:与 WHERE 一起使用

如果既需要在分组前对数据过滤,又需要对分组后的结果过滤,可以同时使用 WHERE 和 HAVING。

示例:统计销售额大于 50 的产品销售记录,过滤出销量超过 100 的产品

SELECT product_id, SUM(sales) AS total_salesFROM ordersWHERE sales > 50GROUP BY product_idHAVING SUM(sales) > 100;

执行步骤:

  • WHERE sales > 50:先过滤出单个销售记录中销售额大于 50 的数据。

  • GROUP BY product_id:按产品分组。

  • HAVING SUM(sales) > 100:过滤出分组后总销售额大于 100 的产品。


场景 3:多个条件

HAVING 支持多个条件,可以使用 AND 和 OR。

示例:找出销量在 200 到 500 之间的产品

SELECT product_id, SUM(sales) AS total_salesFROM ordersGROUP BY product_idHAVING SUM(sales) > 200 AND SUM(sales) < 500;


03
WHERE 与 HAVING 的区别


区别WHEREHAVING
作用范围用于过滤原始数据用于过滤分组后的数据
是否支持聚合函数不支持支持
执行顺序在 GROUP BY 和聚合计算之前执行在 GROUP BY 和聚合计算之后执行


示例对比:WHERE 和 HAVING

示例 1:使用 WHERE

统计销售额大于 50 的订单数:

SELECT product_id, COUNT(*AS order_countFROM ordersWHERE sales > 50GROUP BY product_id;
  • 过滤的是原始数据中 sales > 50 的记录。

示例 2:使用 HAVING

统计所有订单中,总销售额大于 100 的产品:

SELECT product_id, SUM(sales) AS total_salesFROM ordersGROUP BY product_idHAVING SUM(sales) > 100;
  • 过滤的是分组后 SUM(sales) 的结果。

执行顺序

在 SQL 查询中,执行顺序是:

  • FROM:从数据表中读取数据。

  • WHERE:过滤原始数据。

  • GROUP BY:对数据分组。

  • 聚合函数:对每组数据进行聚合计算。

  • HAVING:对分组后的数据进行过滤。

  • SELECT:返回最终结果。

  • ORDER BY:对结果排序。


04
重点总结


  • HAVING 是专门用于过滤分组后的结果的。

  • 当需要基于聚合函数的结果进行过滤时,使用 HAVING。

  • 如果过滤条件仅针对单行数据,则使用 WHERE。

  • HAVING 和 WHERE 可以配合使用,先用 WHERE 过滤原始数据,再用 HAVING 过滤分组后的结果。

通过这些理解,能更高效地写出复杂的 SQL 查询,同时避免逻辑混乱。


今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!

END


扫码关注

一起积累后端知识
不积跬步,无以至千里
不积小流,无以成江海

喜欢此内容的人还喜欢

谈谈id那些事(五)——美团的 Leaf 的ID生成


一个阿里二面面试官必问的问题


Lambda表达式说爱你不容易


分享面试:mysql数据库索引失效的情况


Spring-Boot中一个不起眼的好工具StopWatch