MySQL8.0-分组函数ROLLUP的基本用法(GROUPING)

这篇具有很好参考价值的文章主要介绍了MySQL8.0-分组函数ROLLUP的基本用法(GROUPING)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、ROLLUP简介

ROLLUP是GROUP BY子句的扩展。 ROLLUP选项允许包含表示小计的额外行,通常称为超级聚合行,以及总计行。 通过使用ROLLUP选项,可以使用单个查询生成多个分组集。

MySQL中的ROLLUP是用于 产生汇总输出的修饰符,包括表示超级汇总(较高级别)汇总操作的额外行。它使我们能够使用单个查询在多个分析级别上汇总输出。它主要用于为OLAP(在线分析处理)操作提供支持。

二、基本语法

以下是使用ROLLUP修饰符的语法:

SELECT 
    column1, column2, ...
FROM 
    table_name
GROUP BY
column1, column2,... WITH ROLLUP;

我们指定了 GROUP BY 子句,其中包括我们要基于其聚合数据的列名。最后,我们指定 WITH ROLLUP 修饰符以在另一行中获得超级聚合输出。

我们已经了解到GROUP BY查询已与诸如 MAX , MIN , SUM , COUNT , AVG 等将输出行按单列或多列进行分组。 ROLLUP修饰符是使用GROUP BY查询的选项,该查询包含用于表示小计的额外字段。这些额外的行称为超级汇总行,是总计行的总和。因此,ROLLUP修饰符使我们可以基于 GROUP BY子句中指定的列,在单个查询中创建一组集合行。

三、ROLLUP的使用

例如,假设我们有一个包含以下数据的表 " sales" :

CREATE TABLE IF NOT EXISTS sales
(
id      BIGINT   COMMENT  'ID',
years   INT  COMMENT '年份',
country VARCHAR(20)  COMMENT '国家',
product VARCHAR(32)  COMMENT  '产品',
sales  INT  COMMENT '销售额',
PRIMARY KEY(id)
);

insert into  sales VALUES
(1,2000,'Finland','Computer',1500),
(2,2000,'Finland','Phone',100),
(3,2000,'India','Calculator',150),
(4,2000,'India','Computer',1200),
(5,2000,'USA','Calculator',75),
(6,2000,'USA','Computer',1500),
(7,2001,'Finland','Phone',100),
(8,2001,'USA','Calculator',50),
(9,2001,'USA','Computer',2700),
(10,2001,'USA','TV',250);

如果要每年总结结果,我们将使用简单的GROUP BY子句,如下所示:

SELECT
years,
SUM(sales) AS total_sales  
FROM  sales  
GROUP BY years;

它将给出以下输出,显示每年的总销售额(总计):

MySQL8.0-分组函数ROLLUP的基本用法(GROUPING)

在上面的查询中,分组集由列名称Year表示。如果我们需要在单个查询中一起生成多个分组集,则可以使用UNION ALL运算符,如下所示:

SELECT
years,
SUM(sales) AS total_sales
FROM  sales  
GROUP BY years
UNION ALL
SELECT
null as years,
SUM(sales) AS  total_sales
FROM  sales ;  

在此查询中,我们可以看到NULL列。这是因为 UNION ALL子句要求所有查询具有相同的列数。因此,为了满足此要求,我们在第二个查询的选择列表中添加了NULL。

在执行查询时,将获得以下输出:

MySQL8.0-分组函数ROLLUP的基本用法(GROUPING)

年份列的输出中的NULL表示超级总计的总计值。由于此查询能够产生每年的总销售额以及总销售额的总和,因此,它有两个问题:

这使查询很长。由于数据库引擎在内部执行两个单独的查询并将结果集组合为一个输出,因此降低了查询的性能。

为解决这些问题,MySQL允许我们使用ROLLUP子句,该子句在一个查询中提供了两种分析级别。 ROLLUP子句是GROUP BY子句的扩展,该子句产生另一行并显示总计(超级聚合)值。

让我们在向WITH BY ROLLUP修饰符添加后看到结果子句显示所有年份的总计:

SELECT
years,
SUM(sales) AS total_sales
FROM sales
GROUP BY years WITH ROLLUP;

执行命令时,将得到如下输出:

MySQL8.0-分组函数ROLLUP的基本用法(GROUPING)

在此输出中,我们可以在 Year列中看到 NULL 值,该值标识了超级汇总行。它清楚地表明ROLLUP子句不仅生成小计,而且给出了全年的总销售额。

如果GROUP BY子句有多个列,则ROLLUP修饰符具有更多的列。复杂的效果。在这种情况下, ROLLUP修饰符假定GROUP BY子句中指定的列之间的层次结构。每次列值发生变化时,查询都会在结果末尾生成一个额外的超级汇总摘要行。

例如,假设我们在GROUP BY子句中指定了三列为下方:

GROUP BY c1, c2, c3 WITH ROLLUP

ROLLUP修饰符采用以下层次结构:

c1 > c2 > c3

并生成以下分组集:

(c1, c2, c3)

(c1, c2)

(c1)

()

请参阅以下查询以更清楚地说明它:

SELECT
years,
country,
product,
SUM(sales) AS total_sales
FROM sales
GROUP BY years, country, product ;

如果没有ROLLUP,则基于GROUP BY子句中指定的多个列的销售表摘要如下所示。在这里,我们将仅在年份/国家/产品分析级别获得摘要值。

MySQL8.0-分组函数ROLLUP的基本用法(GROUPING)

添加ROLLUP后,查询会产生一些额外的行:

SELECT
years,
country,
product,
SUM(sales) AS total_sales
FROM sales
GROUP BY years, country, product WITH ROLLUP;

请参见以下输出:

MySQL8.0-分组函数ROLLUP的基本用法(GROUPING)

以上输出在以下四个级别生成信息: 分析,说明如下:

首先,给定年份和国家/地区的每组产品行都会生成一个额外的超级汇总摘要行,该行显示所有产品的总数。它将产品列设置为NULL。接下来,给定年份的每组行都会生成一个额外的超级汇总摘要行,该行显示所有国家和产品的总计。它将"国家和地区"和"产品"列设置为NULL。最后,对于所有其他行,它会生成一个额外的超级汇总摘要行,该行显示所有列的总计。它将Years,Country和Products列设置为NULL。

四、GROUPING()函数

GROUPING()函数用于检查结果集中的NULL是否表示常规分组值,超汇总值或总计。当超级汇总行中出现NULL时,它返回1、否则,它将返回0。

我们可以在选择列表, HAVING 子句和 ORDER BY 子句中使用GROUPING()函数。

请参阅以下查询:

SELECT
years,
country,
product,
SUM(sales) AS total_sales,
GROUPING(years),
GROUPING(country),
GROUPING(product)
FROM sales
GROUP BY years, country, product WITH ROLLUP;

当超级集合行中 Years 列中的NULL出现时, GROUPING(Years)返回1,我们将得到以下输出。否则,它将返回零。

类似地,当"超级汇总"行中"国家/地区"列中的NULL为空时, GROUPING(Country)将返回1、否则,它将返回零。

此外,当超级汇总行中"产品"列中的NULL出现时, GROUPING(produce)返回1、否则,它将返回零。

MySQL8.0-分组函数ROLLUP的基本用法(GROUPING)

我们还可以使用GROUPING()函数来替代超级汇总NULL值的有意义的标签,而不是直接显示。

以下查询说明了如何将 IF()函数与GROUPING()函数组合以替换标签"年份","国家/地区"和"产品"列中的超级汇总NULL值:

SELECT
 IF(GROUPING(years), 'All years', years) AS years,
 IF(GROUPING(country), 'All countries', country) AS country,
 IF(GROUPING(product), 'All products', product) AS product,
 SUM(sales) AS Total_Sales
FROM sales
GROUP BY years, country, product WITH ROLLUP;

我们将得到如下输出:

MySQL8.0-分组函数ROLLUP的基本用法(GROUPING)

如果我们在其中有多个参数GROUPING()函数,它将返回代表位掩码的输出,该掩码合并了每个表达式的结果。在这里,最低位产生最右边参数的结果。下面的示例将按以下方式进行评估:

示例分组(年份,国家/地区,产品)

  result for GROUPING(product)

+ result for GROUPING(country) << 1

+ result for GROUPING(years) << 2

使用多个参数GROUPING()函数示例:

SELECT
years,
country,
product,
SUM(sales) AS Total_Sales,
GROUPING(years,country,product) AS Grouping_Result
FROM sales
GROUP BY years, country, product WITH ROLLUP;

它将给出以下输出:

MySQL8.0-分组函数ROLLUP的基本用法(GROUPING)

如果任何参数具有超级聚合的NULL值,则此GROUPING()的结果将为非零。在这种情况下,它将仅返回超级聚集的行,并使用以下查询过滤常规的分组行:

SELECT
years,
country,
product,
SUM(sales) AS Total_Sales
FROM sales
GROUP BY years, country, product WITH ROLLUP
HAVING GROUPING(years, country, product) <> 0;

它将给出以下输出:

MySQL8.0-分组函数ROLLUP的基本用法(GROUPING)

 文章来源地址https://www.toymoban.com/news/detail-437389.html

到了这里,关于MySQL8.0-分组函数ROLLUP的基本用法(GROUPING)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql 分组函数,分组查询

    #1.分组函数 功能:用作统计使用,又称聚合函数,统计函数,组函数 分类: sum :求和,avg 平均值,max最大值,min最小值,count计算个数 特点: sum, avg 一般用于处理数值型 max ,min ,count 可以处理任何类型 是否忽略Null count: MYISAM 存储引擎下,COUNT( ) 的效率高 INNODB 存储引擎下,COUN

    2024年01月25日
    浏览(45)
  • MySQL8窗口函数

    一、窗口函数简介 在日常开发工作中,经常会遇到下面这些需求 去医院看病,怎样知道上次就医距现在的时间? 环比如何计算? 怎么样得到各部门工资排名前N名员工列表? 查找各部门每人工资占部门总工资的百分比? 如果用传统SQL来解决这些问题,理论上是可以的,但逻

    2024年02月11日
    浏览(35)
  • MySQL学习笔记 ------ 分组函数

    //----------分组函数----------// 1、功能         用作统计使用,又称为聚合函数或统计函数或组函数 2、分类         sum 求和、avg 平均值、max 最大值 、min 最小值 、count 计算个数 3、特点 (1)sum、avg一般用于处理数值型;max、min、count可以处理任何类型; (2)以上分组

    2024年02月15日
    浏览(30)
  • 【Hive】grouping sets() 函数

    多维函数作用:是一种将多个 group by 逻辑写在一个sql语句中的便利写法。等价于将不同维度的 group by 结果集进行 union all 与union all 效率对比:Grouping Sets 版本的 SQL 不仅在表达上更加简洁,在性能上也更加高效 Hive中多维函数有哪些? grouping sets() with cube with rollup 假设现在有

    2024年02月13日
    浏览(22)
  • MySQL8新特性:窗口函数(精讲)

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主! 也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! 假设我现在有这样一个数据表,它显示了某购物网站在每个城市每个区的销售额: 查询: 需求:

    2024年02月13日
    浏览(52)
  • 【MySQL】聚合函数与分组查询

    MySQL中的聚合函数用于对数据进行计算和统计,常见的聚合函数包括下面列举出来的聚合函数: 查看班级有多少同学 统计数学成绩有多少个 统计英语不及格的人数 查看数学成绩的总和 统计英语不及格的分数总和 统计不及格的英语的平均分不需要上面那么麻烦自己手动除:

    2024年02月14日
    浏览(31)
  • MySQL8.0数据库开窗函数

          数据库开窗函数是一种在SQL中使用的函数,它可以用来对结果集中的数据进行分组和排序,以便更好地分析和处理数据。开窗函数与聚合函数不同,它不会将多行数据聚合成一行,而是保留每一行数据,并对其进行分组和排序。 常见的开窗函数包括ROW_NUMBER()、RANK()、

    2024年02月08日
    浏览(49)
  • Mysql 合并多个分组。GROUP_CONCAT 函数 及其平替函数

    GROUP_CONCAT 函数用于将一个分组内的多行数据合并成一个字符串,并以指定的分隔符进行分隔。常用于需要将一个分组内的多条数据以字符串的形式展示的情况。语法如下: GROUP_CONCAT(expr [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [, expr ...]] [SEPARATOR str_val]) 其中,expr 表示要

    2024年02月02日
    浏览(42)
  • 六、MySQL---综合练习题(单表、多表、分组函数以及等级查询)

    数据库:dept_emp 1. dept表 :deptno’部门编号’、dname’部门名称’、loc’地理位置’; 2. emp表 :empno ‘员工编号’、ename ‘员工名字’、job ‘职位’、mgr ‘上司’、hiredate ‘入职时间’、sal ‘基本工资’,comm ‘补贴’,deptno ‘所属部门编号’; 3. salgrade :grade ‘工资等级’

    2024年01月21日
    浏览(41)
  • Oracle2-Rollup和Cube用法

    在Oracle的聚合函数中,会有按照维度统计的情况,比如上图按照job 和 deptno统计 sal的sum 但是也会遇到同时要求统计只按照job维度统计的情况,并且做到一张表里 首先反应过来的是分两步查询,再讲结果union起来 从以上的查询结果可以看到 rollup和 rullup的不同点在于 rollup只会对

    2024年01月25日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包