MySQL学习-group by 函数

本文详细介绍了SQL中的GROUPBY语句及其与聚合函数(如COUNT,SUM,AVG,MAX,MIN)的配合使用,探讨了WHERE和HAVING的区别,以及rollup,cube,groupingsets等高级功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

group by是开发中经常用到的SQL语句,从字面意思来看就是根据哪个字段或者哪几个字段对查询到的数据进行分组统计,既然是分组统计那如何分组呢?所以group by通常都是和聚合函数还有having一起使用。

技巧:如果只针对一个字段group,但返回的字段有额外的一个字段,满足只要求返回一个数字的字段可以使用以下技巧,使用sum和count的组合,返回只有一个值的组和他的其他值

select employee_id, sum(department_id) department_id from employee

group by employee_id 

having count(department_id) = 1

一、语法
select 聚合函数(字段1),字段2 from 表名 where 条件 group by 字段2,字段3
或者
select 聚合函数(字段1),字段2 from 表名 where 条件 group by 字段2,字段3 having 过滤条件
使用了group by 后,要求select出的结果字段都是可汇总的,否则就会出错。
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面。
SELECT region,SUM(salesVolume) 销量 from Sales  GROUP BY region
 


SELECT region,commodity ,SUM(salesVolume) 销量 from Sales  GROUP BY region,commodity
 


SELECT region,commodity ,SUM(salesVolume) 销量 from Sales  GROUP BY region#这句代码则是会报错


三、where和having的使用
1、where+group by
where 限定的条件查询会在group by 分组之前执行。

SELECT region,SUM(salesVolume) 销量 from Sales WHERE commodity='电视机' GROUP BY region
 


2、group by+having
having限定的条件查询会在group by分组之后查询。

SELECT region,SUM(salesVolume) 销量 from Sales GROUP BY region HAVING SUM(salesVolume)>10000


3、where+group by+having
where和having在一起使用的时候,会先执行where的限定条件查询,最后再执行having的限定条件查询。

SELECT region,SUM(salesVolume) 销量 from Sales WHERE commodity='电视机' GROUP BY region HAVING SUM(salesVolume)>10000
四、聚合函数
常用的聚合函数有:count() 计数, sum() 求和 , avg() 求平均值, max() 求最大值, min()求最小值。

实例如下:
1、count( )
SELECT region,COUNT(*) 记录数 FROM Sales GROUP BY region
2、avg( )
SELECT region,AVG(salesVolume) 平均销量 FROM Sales GROUP BY region 
3、max( )
SELECT region,MAX(salesVolume) 销售最多 FROM Sales GROUP BY region 
4、min( )
SELECT region,MIN(salesVolume) 销售最少 FROM Sales GROUP BY region 

还有一些不经常使用的:count_big()和count()相同作用但返回值的数据类型不同,count()返回 ‘int’ ,count_big()返回 ‘bigint’ ,stdev()求标准偏差,stdevp()求总体标准偏差,var()求方差,varp()求总体统计方差等等这里就不尽数了。

五、group by的其他可用参数。
1、group by rollup( )
SELECT region,SUM(salesVolume)销量 FROM Sales GROUP BY ROLLUP (region )
 

这里比不加 rollup()的查询结果多了一行总计。

2、group by cube( )
SELECT region,commodity,SUM(salesVolume)销量 FROM Sales GROUP BY CUBE (region,commodity )
 

添加cube()后不但增加了一行总计,还增加了每一组单项统计的合计。group by cube为所有可能的列组合创建组。 对于 group by cube (a, b),结果具有 (a, b)、(NULL, b)、(a, NULL) 和 (NULL, NULL) 唯一值的组。

3、group by grouping sets ( )
grouping sets选项可将多个 group by子句组合到一个 group by 子句中。 其结果与针对指定的组执行 union all运算等效。
例如:

SELECT region,commodity,SUM(salesVolume) 销量 FROM Sales
GROUP BY GROUPING SETS ( ROLLUP (region,commodity), CUBE (region,commodity) )
1
返回结果与两个 group by语句的联合查询相同。

SELECT region,commodity,SUM(salesVolume) 销量
FROM Sales GROUP BY ROLLUP (region,commodity)
UNION ALL
SELECT region,commodity,SUM(salesVolume) 销量 
FROM Sales GROUP BY CUBE (region,commodity)

SQL 不会合并为 grouping sets 列表生成的重复组。 上例中,GROUPING SETS ( ROLLUP (region,commodity), CUBE (region,commodity) ),两个元素都返回总计行并且这两行都会列在结果中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚公移山山不移

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值