Mysql 温故知新系列「group by | having」

「这是我参与11月更文挑战的第 19 天,活动详情查看:2021最后一次更文挑战

group by

mysql 中对数据进行分组的关键字,需要搭配上 count, avg, max, min 等聚合函数进行查询,sql 的模版语句为

SELECT groupName, count(groupName) FROM table GROUP BY groupName
复制代码

count 这个统计的聚合函数为例,上面的 sql 翻译为:在 table 中按照 groupName 进行分组,返回分组的字段 groupName 以及对这个字段对应的行记录进行数据汇总

如下是一个初学的错误示范:

image.png

翻译过来就是,我们对非聚合的字段使用了 group by 操作

group by 的常规操作就是对一个字段进行分组,然后统计这个字段中某个值相同的有多少条记录,如文末的示例

或者是,我们统计各个部门中薪水最高/最低/平均 多少,伪 sql 如下:

select dept, max|min|avg(dept) from salary group by dept
复制代码

having

mysql 中提供了条件查询的关键字 where ,会帮助我们过滤掉不符合条件的记录

但是,对于聚合分组后的查询结果,where 无能为力,这里需要使用 having 来实现条件过滤的功能


这里聊聊 where 和 having 的区别:

  • 在我们获取查询的结果之前,where 会帮助我们过滤掉不符合条件的记录
  • having 是在我们获取到查询的结果之后,对现有的结果进行过滤,需要与 group by 搭配使用

案例分享

在某工厂,上线了我们的系统,并运行了一段时间之后,发现数据里出现了重复编码的异常,工厂的负责人需要帮忙从数据库里找出哪些是重复编码

对这个场景做分析,首先,我们对这个编码字段进行分组,并统计他出现的次数,然后再次过滤次数超过 1 的数据,这种操作拉到的编码就是客户期望的数据

sql 大致如下

SELECT
	CODE,
	count(CODE) count
FROM
	rfid_info
WHERE
	factory = '01'
GROUP BY
	CODE
HAVING
	count > 1;
复制代码

我们先获取他对应的工厂的数据记录,然后根据编码进行分组,最后在分组的结果上使用 having 过滤得到重复编码

猜你喜欢

转载自juejin.im/post/7032256784035217421