MySQL-分组函数ROLLUP的基本用法

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

一、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;

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

MySQL-分组函数ROLLUP的基本用法

在上面的查询中,分组集由列名称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。

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

MySQL-分组函数ROLLUP的基本用法

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

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

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

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

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

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

MySQL-分组函数ROLLUP的基本用法

在此输出中,我们可以在 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子句中指定的多个列的销售表摘要如下所示。在这里,我们将仅在年份/国家/产品分析级别获得摘要值。

MySQL-分组函数ROLLUP的基本用法

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

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

请参见以下输出:

MySQL-分组函数ROLLUP的基本用法

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

首先,给定年份和国家/地区的每组产品行都会生成一个额外的超级汇总摘要行,该行显示所有产品的总数。它将产品列设置为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、否则,它将返回零。

MySQL-分组函数ROLLUP的基本用法

我们还可以使用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;

我们将得到如下输出:

MySQL-分组函数ROLLUP的基本用法

如果我们在其中有多个参数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;

它将给出以下输出:

MySQL-分组函数ROLLUP的基本用法

如果任何参数具有超级聚合的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;

它将给出以下输出:

MySQL-分组函数ROLLUP的基本用法

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

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

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

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

相关文章

  • 【MySQL】聚合函数与分组查询

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

    2024年02月14日
    浏览(41)
  • pandas之apply函数简介及用法详解

    ​ Pandas 的 apply() 方法是用来调用一个函数(Python method),让此函数对数据对象进行批量处理。Pandas 的很多对象都可以使用 apply() 来调用函数,如 Dataframe、Series、分组对象、各种时间序列等。 ​ apply() 使用时,通常放入一个 lambda 函数表达式、或一个函数作为操作运算,官方上

    2024年02月03日
    浏览(46)
  • 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日
    浏览(53)
  • 六、MySQL---综合练习题(单表、多表、分组函数以及等级查询)

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

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

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

    2024年01月25日
    浏览(28)
  • MySQL Workbench基本用法

    MySQL Workbench相当于SQL语言的解释器 目录 1  打开 2  连接数据库 3  创建数据库 4  创建数据表 4.1  字段类型 4.2  字段选项 4.3  其他 4.4  再次修改表的字段内容 5  操作表中的数据 5.1  添加 5.2  更改 5.3  删除 6  代码编辑器 7  保存sql代码 8  加载sql代码 搜索MySQ

    2024年02月04日
    浏览(85)
  • 一段代码理解Python异步函数async的基本用法

    异步函数的使用规则 正常情况下我们的函数时串行的运行的,这里称之为主函数. 异步函数:与主函数并行运行. Python异步函数即async必须在普通函数的命名前加上 async 示例: 执行async函数 async函数内等待:只阻塞当前async函数 m_mock安装 通过上述代码示例可以发现case_a和case_b通过

    2024年02月15日
    浏览(52)
  • mysql日期函数用法大全

    一、 返回当前日期 1、CURRENT_DATE()、CURRENT_DATE和CURDATE()用法相同:返回当前日期 2、CURRENT_TIME()、CURRENT_TIME和CURTIME()用法相同:返回当前时间 3、CURRENT_TIMESTAMP()、CURRENT_TIMESTAMP、LOCALTIMESTAMP()、LOCALTIMESTAMP、LOCALTIME()、LOCALTIME和NOW()用法相同:返回当前日期和时间 4、SYSDATE():返回

    2024年02月15日
    浏览(46)
  • MySQL中的cast()函数用法

    CAST()函数,把一个字段转成另一个字段,主要转化的是字段的类型 其语法为:cast(字段名 as 转换的类型 )                 转换的类型共有: CHAR            字符型                                               DATE            日期型                            

    2024年02月11日
    浏览(46)
  • 【MySQL】SQL的函数用法

    数据准备 所谓聚合,就是将多行汇总成一行;其实,所有的聚合函数均如此——输入多行,输出一行。聚合函数具有自动滤空的功能,若某一个值为NULL,那么会自动将其过滤使其不参与运算。 Count() 统计表中数据的行数或者统计指定列其值不为NULL的数据个数 示例 Max() 计算

    2024年02月09日
    浏览(82)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包