Mysql 温故知新系列「group by | having」
group by
mysql 中对数据进行分组的关键字,需要搭配上 count, avg, max, min
等聚合函数进行查询,sql 的模版语句为
SELECT groupName, count(groupName) FROM table GROUP BY groupName
以 count
这个统计的聚合函数为例,上面的 sql 翻译为:在 table
中按照 groupName
进行分组,返回分组的字段 groupName
以及对这个字段对应的行记录进行数据汇总
如下是一个初学的错误示范:
翻译过来就是,我们对非聚合的字段使用了 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 过滤得到重复编码
原创文章,未经允许,禁止转载
-- by 安逸的咸鱼
转载自:https://juejin.cn/post/7032256784035217421