MySQL中使用group by.
一般情况下, mysql中使用group by,是为了聚合计算, 所以通常情况下, group by 会和聚集函数(sum(), avg(), min(), max(), count() )联合使用,另外group by 通常会和关键字having配合使用.
另外作为筛选的还有where, 如果group by having 和 where都要使用的话, where先写, group by 后写,具体特点如下:
①查询列表往往是 分组函数和被分组的字段 ★
②分组查询中的筛选分为两类
筛选的基表 使用的关键词 位置
分组前筛选 原始表 where group by 的前面
分组后筛选 分组后的结果集 having group by的后面
eg:
SELECT COUNT(*),manager_id
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id;
然后再来说一下关于group by的理解:
首先看一下表一:
当执行该条sql时:
SELECT name FROM test
GROUP BY name
会得到如下结果:
将这个sql分解一下,首先执行:
FROM test
GROUPBY name
这个过程我们理解为生成一个虚拟表3:
就是将name相同的多行数据,合并成一行数据.
然后执行:
select name
得到结果:
ps:执行select * 的话, 之前的版本好像是会报错.但是我现在用的5.7.37是可以执行成功,但是这样写其实是有问题的, 因为name相同得id不止一行,现在应该是只返回了name相同的第一个id,number也是一样.
因为相同的name对应多个id和name,所以这时用 * 输出是不合理的, 这就用到了聚集函数来处理,例如count(),sun()等等
例如:
select name,sum(number)
from test
group by name
结果如下:
但是如果要用到group by多个字段的话, 就把多个字段看成一个整体,当多个字段都相同的时候才认为相同.
如group by name,number,我们可以把name和number 看成一个整体字段,以他们整体来进行分组的。如下图:
接下来就可以配合select和聚合函数进行操作了。如执行select name,sum(id) from test group by name,number,结果如下图:
一般情况下, group by 字段1, select 的字段中也会有字段1.
参考文章: https://blog.csdn.net/qq403580298/article/details/90756352
接下来是关于having子句.
having 是作为分组后的筛选条件,与group by搭配使用, 可以这样理解,如果不是group by 后面的分组就是用where作为筛选条件, 如果是group by前面的筛选条件就是用where
简单来说就是: 分组之前筛选用where, 分组之后筛选用having
所以最重要的就是判断该筛选条件是在分组前还是分组后,如果筛选条件是和分组有关的聚合函数()相关的,那么就是分组之后的筛选
eg:
案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT job_id,MAX(salary)
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
这里的最高工资>12000 就是和聚合函数相关的,所以就是分组之后的.
有时候group by之后还需要排序,一般情况下,先分组后排序.
本人新手,肯定有理解错误的地方,还请大家不吝赐教,多多给予批评指正!
万般感谢!!!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~