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之后还需要排序,一般情况下,先分组后排序.

本人新手,肯定有理解错误的地方,还请大家不吝赐教,多多给予批评指正!
万般感谢!!!

posted @   怎言笑i  阅读(1957)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示