with rollup mysql_MySQL中GROUP BY的WITH ROLLUP修饰符

MySQL的GROUP BY语句配合WITH ROLLUP修饰符能实现分组后的汇总信息展示。WITH ROLLUP会在每个分组后提供上一层的汇总数据,直至全表汇总。在使用时,NULL值会在每个聚合行生成,不能在WHERE或JOIN条件中使用。注意WITH ROLLUP与ORDER BY不能同时使用,但可通过派生表和LIMIT控制排序和返回数据行数。
摘要由CSDN通过智能技术生成

在MySQL语句中,使用GROUP BY语句可以检索各组的聚合信息,添加WITH ROLLUP后能将分组后的信息按组聚合。

由下表进行数据测试:

47adc4f6ecd82bd50044e1a54c0ac57d.png

1> 先试用不带聚合函数的GROUP BY语句进行测试得到结果如下图:

1777a6243dd9859262410702b2fabc55.png

上图所测部分箭头所指右侧部分的数据是对应的,右侧部分方框中的数据是对上面该组数据的汇总,由于没有使用聚合函数,所以用NULL表示,最后一个是对所测所有查询结果的汇总。

2> 在GROUP BY中使用聚合函数进行测试,如下图所示:

eb732aab20b9923b9487c595b34babb9.png

上图所测部分箭头所指右侧部分的数据是对应的,右侧部分方框中的数据是对上面该组数据的汇总,由于使用了聚合函数SUM,所以对其上面每个分组求和,最后一个是对所测所有查询结果的汇总。

下图是一个产品销售收益表的汇总:

5983bce3f99bc3d4f56f2fd4cf5fd1b6.png

1> 在每一个最小分组(year/country/product)后会给出一个以year/country分组的数据汇总,该数据行中的product会被设置成NULL。

2> 在每个year/country小组后会给出一个以year分组的数据汇总,该数据行中country/product列都会被设置为NULL。

3> 最后一行是对所有数据的汇总,该数据行中year/country/product都被设置为NULL。

总结:WITH ROLLUP反应的是一种OLAP思想,也就是说一个GROUP BY语句执行完成后可以满足用户想要得到的任何一个分组以及分组组合的聚合信息值。

WITH ROLLUP中的NULL值是在每一个聚合行数据生成并发送到客户端时生成的。服务器会检测GROUP BY子句中最左侧改变值的列之后的列名并置为NULL(如果GROUP BY是通过列序号指定的,那么服务器会根据列位置进行判断并置NULL)。

因为超级聚合中的NULL值是在查询处理的最后阶段设置的,所以只能在SELECT列表或HAVING子句中使用这些NULL,但是不能在JOIN条件或者WHERE子句中通过使用NULL来筛选结果集。

注意:1> 在使用ROLLUP时,不能使用ORDER BY子句对结果进行排序,即ROLLUP与ORDER BY在MySQL中是互相排斥的。但是,仍然可以使用其他方式对排序进行控制。比如可以利用派生表将分组生成的数据作为中间结果,然后在使用ORDER BY进行排序。如下:

ed918118c5f2e47e70a8295e8109b29f.png

2> LIMIT可以用于限制返回客户端的数据行数,在ROLLUP后使用即可,它是对整个ROLLUP数据集基础上进行限制行数,需要注意的是这种使用方式可能会造成一些难以看懂的数据,因为对那些因为超级聚合产生的数据行没有一个清晰又明确的理解。

MySQL扩展实现了可以在SELECT列表中出现GROUP BY中没有的列名在这种情况下,服务器会自由的选取非聚合列的任意值放置在汇总的数据行中,在WITH ROLLUP中同样适用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值