10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 36.3 mb
PDF (A4)- 36.3 mb
手册页(TGZ)- 235.7 kb
手册页(邮政编码)- 347.2 kb
信息(Gzip)- 3.3 mb
信息(邮政编码)- 3.3 mb
本手册节选

12.20.2 GROUP BY修饰符

集团条款允许与汇总修饰符,使汇总输出包含表示更高级别(即超级聚合)汇总操作的额外行。汇总因此,您可以用一个查询在多个分析级别上回答问题。例如,汇总可用于为OLAP(在线分析处理)操作提供支持。

假设一个销售表有一年国家产品,利润销售利润记录栏:

创建销售表(年份INT,国家VARCHAR(20),产品VARCHAR(32),利润INT);

要总结每年的表格内容,请使用简单的集团是这样的:

mysql> SELECT year, SUM(profit) FROM sales GROUP BY year;+------+--------+ | 年|利润  | +------+--------+ | 2000 | 4525 | 2001 | 3010 |  | +------+--------+

产量显示了每年的总(总)利润。要确定历年的总利润总和,您必须自己将各个值相加或运行一个附加查询。或者你可以用汇总,它通过一个查询提供了两个级别的分析。添加一个与汇总修饰符的集团子句导致查询生成另一行(超级聚合),显示全年的总值:

mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP+------+--------+ | 年|利润  | +------+--------+ | 2000 | 4525 | 2001 | 3010 | | |零| 7535年  | +------+--------+

的价值一年列标识总超聚合线。

汇总当有多个时是否会产生更复杂的效果集团列。在本例中,每次除最后一个分组列外的任何列的值发生更改时,查询都会生成一个额外的超级聚合汇总行。

例如,没有汇总,总结一下销售表的基础上一年国家,产品可能如下所示,其中输出仅显示分析年度/国家/产品级别的汇总值:

mysql> SELECT year, country, product, SUM(profit) FROM sales GROUP利润按年,国家,产品;+------+---------+------------+--------+ | 年| | |产品利润  | +------+---------+------------+--------+ | 电脑2000年芬兰| | | 1500 | | 2000 | |芬兰电话| 100 | 2000 | |印度计算器| | 150 | | 2000 | |印度电脑| 1200 | | 2000 | |美国计算器| 75 | | 2000 | |美国电脑| 1500 | | 2001 | |芬兰手机10 | | | 2001 | |美国计算器50 | | | 2001 | |美国电脑| 2700 | 2001 | | 250 | |美国电视  | +------+---------+------------+--------+

汇总添加后,查询会产生几个额外的行:

mysql> SELECT year, country, product, SUM(profit) AS profit FROM sales GROUP BY year, country, product WITH ROLLUP;+------+---------+------------+--------+ | 年| | |产品利润  | +------+---------+------------+--------+ | 电脑2000年芬兰| | | 1500 | | 2000 | |芬兰电话| 100 | 2000 | |芬兰零| | 1600 | | 2000 | |印度计算器| 150 | | 2000 | |印度电脑| 1200 | 2000 | |印度零| | 1350 | | 2000 | |美国计算器| 75 | | 2000 | |美国电脑| 1500 | 2000 | |美国零| | 1575 | | 2000 |空零| | 4525 | | 2001 | |芬兰手机10 | | | 2001 | |芬兰零|10 | | 2001 | USA | Calculator | 50 | | 2001 | USA | Computer | 2700 | | 2001 | USA | TV | 250 | | 2001 | USA | NULL | 3000 | | 2001 | NULL | NULL | 3010 | | NULL | NULL | NULL | 7535 | +------+---------+------------+--------+

现在输出包含了四个分析级别的摘要信息,而不仅仅是一个:

  • 在给定年份和国家的每一组产品行之后,会出现一个额外的超级聚合摘要行,显示所有产品的总数。这些行有产品列设置为

  • 在给定年份的每一组行之后,会出现一个额外的超级汇总汇总行,显示所有国家和产品的总数。这些行有国家而且产品列设置为

  • 最后,在所有其他行之后,出现一个额外的超级汇总汇总行,显示所有年份、国家和产品的总数。这一行有一年国家,产品列设置为

每个超级聚合行中的指示符是在将该行发送到客户机时产生的。控件中命名的列集团子句紧跟在已改变值的最左边的子句后面。对于结果集中名称与其中任何一个名称相匹配的任何列,其值设置为.(如果您指定按列位置分组列,服务器将识别要设置的列通过位置。)

因为超级聚合行中的值在查询处理的后期阶段被放入结果集中,您可以在以下阶段测试它们仅在选择列表或条款。你不能把它们作为的值在哪里子句确定要选择哪些行。例如,不能添加product为NULL的地方以从输出中删除除超级聚合行以外的所有行。

值确实显示为可以使用任何MySQL客户端编程接口进行测试。但是,在这一点上,您无法区分a表示常规分组值或超级聚合值。在MySQL 8.0中,您可以使用分组()函数来测试区别。

使用ROLLUP时的其他注意事项

下面的讨论列出了MySQL实现特定的一些行为汇总

当你使用汇总,你不能同时使用an命令子句对结果进行排序。换句话说,汇总而且命令在MySQL中是互斥的。但是,您仍然可以控制排序顺序。以解决阻止使用的限制汇总命令并实现分组结果的特定排序顺序,生成分组结果集作为派生表并应用命令到它。例如:

mysql> SELECT * FROM (SELECT year, SUM(profit) AS profit FROM sales GROUP BY year WITH ROLLUP) AS dt ORDER BY year DESC;+------+--------+ | 年|利润  | +------+--------+ | 2001 | 3010 | 2000 | 4525 | | |零| 7535年  | +------+--------+

在本例中,超级聚合汇总行与计算它们的行排序,它们的位置取决于排序顺序(升序排序在开始,降序排序在结束)。

限制可用于限制返回给客户机的行数。限制应用后汇总,因此限制适用于添加的额外行汇总.例如:

mysql> SELECT year, country, product, SUM(profit) FROM sales GROUP利润,按年,国家,产品,ROLLUP LIMIT 5;+------+---------+------------+--------+ | 年| | |产品利润  | +------+---------+------------+--------+ | 电脑2000年芬兰| | | 1500 | | 2000 | |芬兰电话| 100 | 2000 | |芬兰零| | 1600 | | 2000 | |印度计算器| 150 | |电脑| 1200 | 2000 |印度  | +------+---------+------------+--------+

使用限制汇总可能会产生更难以解释的结果,因为理解超级聚合行的上下文较少。

目录中没有出现的列是MySQL扩展允许的集团列表要在选择列表中命名。有关非聚合列和集团,请参阅章节12.20.3,“MySQL对GROUP BY的处理”)。在本例中,服务器可以自由地从汇总行的这个非聚合列中选择任何值,这包括由与汇总.例如,在下面的查询中,国家中没有出现的非聚合列集团列表和为该列选择的值是不确定的:

mysql> SELECT year, country, SUM(profit) FROM sales GROUP BY year WITH ROLLUP+------+---------+--------+ | 年| |利润  | +------+---------+--------+ | 美国印度2000 | | 4525 | | 2001 | | 3010 | |美国零| | 7535年  | +------+---------+--------+

的情况下允许此行为ONLY_FULL_GROUP_BY未启用SQL模式。如果启用了该模式,服务器将拒绝查询为非法查询,因为国家是不是列在集团条款。与ONLY_FULL_GROUP_BY方法,仍然可以执行查询ANY_VALUE ()非确定性值列的函数:

mysql> SELECT year, ANY_VALUE(country) AS country, SUM(profit) AS profit FROM sales GROUP BY year WITH ROLLUP;+------+---------+--------+ | 年| |利润  | +------+---------+--------+ | 美国印度2000 | | 4525 | | 2001 | | 3010 | |美国零| | 7535年  | +------+---------+--------+