第8章 SQL高级处理:8-2 GROUPING运算符

■ GROUPING SETS——取得期望的积木
● 只使用GROUP BY子句和聚合函数是无法同时得出小计和合计的。如果想要同时得到,可以使用GROUPING运算符。

● 理解GROUPING运算符中CUBE的关键在于形成“积木搭建出的立方体”的印象。


■同时计算出合计行

如果想要获得那样的结果,通常的做法是分别计算出合计行和按照商品种类进行汇总的结果,然后通过 UNION ALL 连接在一起。
代码清单8-11 分别计算出合计行和汇总结果再通过UNION ALL进行连接

SELECT '合计' AS product_type, SUM(sale_price)
FROM Product
UNION ALL
SELECT product_type, SUM(sale_price)
FROM Product
GROUP BY product_type;

这样一来,为了得到想要的结果,需要执行两次几乎相同的 SELECT语句,再将其结果进行连接,不但看上去十分繁琐,而且 DBMS 内部的处理成本也非常高。

GROUPING 运算符包含以下 3 种。
●ROLLUP
●CUBE
●GROUPING SETS


■ ROLLUP——同时得出合计和小计

■将“登记日期”添加到聚合键当中
 

--Oracle, SQL Server, DB2
SELECT product_type, regist_date, SUM(sale_price) AS sum_price
FROM Product
GROUP BY ROLLUP(product_type, regist_date);

--Oracle, SQL Server, DB2

在上述 GROUP BY 子句中使用 ROLLUP 之后,结果会发生什么变化呢(代码清单 8-14) ?

--MySQL
SELECT product_type, regist_date, SUM(sale_price) AS sum_price
FROM Product
GROUP BY product_type, regist_date WITH ROLLUP;

这 4 行就是我们所说的超级分组记录。也就是说,该SELECT 语句的结果相当于使用 UNION 对如下 3 种模式的聚合级的不同结果进行连接(图 8-5)。

ROLLUP 是“卷起”的意思,可以同时得出合计和小计,是非常方便的工具。


■ GROUPING函数——让NULL更加容易分辨

为了避免混淆, SQL 提供了一个用来判断超级分组记录的 NULL 的
特定函数 —— GROUPING 函数。该函数在其参数列的值为超级分组记录
所产生的 NULL 时返回 1,其他情况返回 0(代码清单 8-15)。

这样就能分辨超级分组记录中的 NULL 和原始数据本身的 NULL 了。

使用 GROUPING 函数还能在超级分组记录的键值中插入字符串。也就是说,
当 GROUPING 函数的返回值为 1 时,指定“合计”或者“小计”等字符串,其他情况返回通常的列的值。


■ CUBE——用数据来搭积木

CUBE 是“立方体”的意思,这个名字和 ROLLUP 一样,都能形象地说明函数的动作。
CUBE 的语法和 ROLLUP 相同,只需要将 ROLLUP 替换为 CUBE 就可以了。


与 ROLLUP 的结果相比, CUBE 的结果中多出了几行记录。大家看一下应该就明白了,多出来的记录就是只把 regist_date 作为聚合键所得到的汇总结果。


顺带说一下, ROLLUP的结果一定包含在CUBE的结果之中。
所谓 CUBE,就是将 GROUP BY 子句中聚合键的“所有可能的组合”的汇总结果集中到一个结果中。
因此,组合的个数就是 2^n(n 是聚合键的个数)。
 

SQL基础教程(第2版)第8章 SQL高级处理:8-2 GROUPING运算符的更多相关文章

  1. 推荐《SQL基础教程(第2版)》中文PDF+源代码+习题答案

    我认为<SQL基础教程(第2版)>非常适合数据库学习的初学者.论述的角度是读者的角度,会换位思考到读者在看到这一段时候会发出怎样的疑问,非常难得:原始数据的例题只有一道,但是可以反复从不同 ...

  2. 笔记-Python基础教程(第二版)第一章

    第一章 快速改造:基础知识 01:整除.乘方 (Python3.0之前 如2.7版本) >>> 1/2 ==>0 1/2整除,普通除法: 解决办法1: 1.0/2.0  ==& ...

  3. [SQL基础教程] 5-1视图

    [SQL基础教程] 5-1视图 视图和表 从SQL角度看视图就是一张表 视图与表的差别 表保存了实际的数据,视图保存的是SELECT语句: 视图的优点 节省存储空间: 将常用的Select 语句保存成 ...

  4. SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)

    SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1 ...

  5. [SQL基础教程] 4-4 事务

    [SQL基础教程] 4 数据更新 4-4 事务 事务 需要在同一处理单元中执行的一系列更新处理的集合 创建事务 事务开始语句; DML语句1; DML语句2; . . . 事务结束语句; 事务开始语句 ...

  6. [SQL基础教程] 4-3 数据的更新(UPDATE)

    [SQL基础教程] C4 数据更新 4-3 数据的更新(UPDATE) UPDATE UPDATE <表名> SET <列名> = <表达式>; UPDATE &l ...

  7. [SQL基础教程] 4-2 数据删除(DELETE)

    [SQL基础教程] C4 数据更新 4-2 数据删除(DELETE) DROP TABLE / DELETE DROP TABLE - 完全删除表 DELETE - 仅删除数据,保留表容器 DELET ...

  8. [SQL基础教程] 4-1 数据的插入(INSERT)

    [SQL基础教程] C4 数据更新 4-1 数据的插入(INSERT) INSERT INSERT INTO <表名>(列1,列2...) VALUES(值1,值2...); 清单 用() ...

  9. [SQL基础教程] 3-4 对查询结果进行排序/ORDER BY

    [SQL基础教程] 3-4 对查询结果进行排序/ORDER BY ORDER BY SELECT <列名1>,<列名2>,<列名2>... FROM ORDER B ...

随机推荐

  1. android studio 入门坑

    安装 android studio,碰到下面这个图片,直接跳过. 安装时候,选择自定义设置,里面可以配置 sdk 的存放位置. 新建工程后,gradle sync 比较慢,可以 修改工程中的 buil ...

  2. Arduino读取串口数据并进行字符串分割

    String comdata = ""; int numdata[6] = {0}, PWMPin[6] = {3, 5, 6, 9, 10, 11}, mark = 0; voi ...

  3. 【LeetCode】反转字符串

    [问题] 编写一个函数,其作用是将输入的字符串反转过来. 示例 : 输入: "hello" 输出: "olleh" 示例 : 输入: "A man, ...

  4. SpringBoot#自定义配置的封装

    _震惊,开局 不可避免的需要弄一些自定义的配置. 要点: 1. 把配置项都写出来,分析层次关系:2. 抽象成bean与bean之间的关系,写出bean对应的类,这时候配置项对应了bean的属性,属性可 ...

  5. [JZOI]1251.收费站[二分][最短路]

    Description 在某个遥远的国家里,有n个城市.编号为1,2,3,--,n. 这个国家的政府修建了m条双向的公路.每条公路连接着两个城市.沿着某条公路,开车从一个城市到另一个城市,需要花费一定 ...

  6. 三十、SAP中的内置图标

    一.选择[编辑]->[模式] 二.选中写入模式 三.选中图标 四.选择我们需要的图标 五.选中图标后,选择复制 六.点击之后,会回到代码界面,如下 七.执行结果如下,显示出了一个神奇的图标

  7. HttpServletRequest HttpServletResponse接口详解

    HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据.同时,HttpServletRequest接口可以获取由客户端传送的名称,也可以获取产生请求 ...

  8. 常见的四种Essay Reference写作格式大全

    Essay包括四个部分——introduction,Main body,conclusion,Reference. 1.Introduction包括Topic的背景介绍和文章主要解决的主要问题,一般是 ...

  9. Flink 历史服务与连接器

    History Server(历史服务) Flink提供了记录历史任务运行情况的服务,可用于在关闭Flink群集后依然能够查询已完成作业的相关信息. 配置: # 任务执行信息存储在hdfs目录 job ...

  10. 一、VIP课程:互联网工程专题 05-快速掌握Jenkins原理与核心功能

    第五课:快速掌握jenkins核心功能.docx 2.164 (2019-02) and newer: Java 8 or Java 11 一.jenkins 概述与环境配置 知识点: 关于可持续化集 ...