《SQL 基础教程》第八章:SQL 高级处理
本章分为两个部分:
- 窗口函数
- GROUPING 运算符
它们用于以「窗口」为单位的排序、计算总和等任务.
OLAP 函数
OLAP 定义:OLAP 是 OnLIne Analytical Processing 的简称,意思是对数据库数据进行实时分析处理
OLAP 函数定义: 为了实现 OLAP 的标准 SQL 功能.
语法
<OLAP function> ([PARTITION BY <collist>]
ORDER BY <collist>
)
窗口定义:通过 PARTITION BY 分组后的记录集合称为窗口.它代表「范围」的概念.
要点与 Keyword:
- OLAP function :即窗口函数.可用的窗口函数有两类,第一类为专用窗口函数(例如: RANK, DENSE_RANK, ROW_NUMBE), 另一类为聚合函数(例如: SUM, AVG, COUNT, MAX, MIN)
- PARTITION BY :[可选的]设定执行窗口函数的的对象范围.
- ORDER BY: 指定按照哪一列、何种顺序(可指定 ASC/DESC 来指定升序和降序)执行窗口函数.
- 窗口函数不能用在 WHERE 子句和 GROUP BY 子句中.
专用窗口函数
RANK 函数,DENSE_RANK 函数, ROW_NUMBER 函数均是专用窗口函数,可以用于排序,它们的不同之处在于:
若三条记录并列第一,结果分别为:
- RANK: 1,1,1,4
- DENSE_RANK: 1,1,1,2
- ROW_NUMBER:1,2,3,4
框架
定义:在窗口中指定的更加详细的汇总范围的备选功能,该汇总功能的汇总范围称为框架.
语法
举例:
用于计算当前行、上一行、下一行的 sale_price 的平均值
SELECT product_id, product_name, sale_price,
AVG (sale_price) OVER (ORDER BY product_id
ROWS BETWEEN 1 PRECEDING AND
1 FOLLOWING) AS moving_avg
FROM Product;
在 OVER 子句中指定 PRECEDING关键词(意为当前行的上一行) 和 FOLLOWING 关键词(意为当前行的下一行),来确定窗口函数执行的范围
GROUPING 运算符
问题源
由于 GROUP BY 子句只指定聚合键,因此结果中只有小计,因此不能同时得到总计.
普通解决办法是使用 UNION ,但标准 SQL 引入了 GROUPING 运算符,用于得到不同汇总范围下的汇总结果.
GROUPING 运算法包括以下3种:
- ROLLUP
- CUBE
- GROUPING SET
语法:
用于 GROUP BY 子句中:格式如下
GROUP BY <function>
(<col1>
, <col2>
,...)<function>
为函数
ROLLUP 运算符
定义:
一次计算出不同聚合键集合的结果
语法:
比如:
GROUP BY ROLLUP(<col1>
, <col2>
)
得到下面三种组合的汇总结果:
① GROUP BY () :称为「超级分组」,其默认的键值为 NULL,结果为未使用 GROUP BY 的合集行.
② GROUP BY(<col1>
)
③ GROUP BY(<col1>
,<col2>
)
ROLLUP 是“卷起”的意思,比如卷起百叶窗、窗帘卷,等等.其名称也形象地说明了该操作能够得到像从小计到合计这样,从最小的聚合级开始,聚合单位逐渐扩大的结果.
GROUPING 函数——区分 NULL 与汇总
由于超级分组以 NULL 为聚合键,当存在以 NULL 为聚合键的其他分组时,就难以区分超级分组和其他分组,因此可以使用 GROUPING 函数配合 CASE 语句加以区分
格式:
SELECT CASE WHEN GROUPING(product_type) = 1
THEN '商品种类 合计'
ELSE product_type END AS product_type,
CASE WHEN GROUPING(regist_date) = 1
THEN '登记日期 合计'
ELSE CAST(regist_date AS VARCHAR(16)) END AS regist_date,
SUM(sale_price) AS sum_price
FROM Product
GROUP BY ROLLUP(product_type, regist_date);
以上为 GROUPING 配合 CASE 语句同时得到小计和总计的范例.
语法:
当参数列的值为超级分组产生的 NULL 时返回1, 其他情况返回 0
CUBE 运算符
定义:得到聚合键的所有组合的结果,组合的个数为 2n
GROUPING SETS 运算符
定义:只得到指定的列作为聚合键的汇总
三个运算符之间的关系
聚合键的数目从多到少依次为:
- CUBE
- ROLLUP
- GROUPING SETS
《SQL 基础教程》第八章:SQL 高级处理的更多相关文章
- 《SQL基础教程》+ 《SQL进阶教程》 学习笔记
写在前面:本文主要注重 SQL 的理论.主流覆盖的功能范围及其基本语法/用法.至于详细的 SQL 语法/用法,因为每家 DBMS 都有些许不同,我会在以后专门介绍某款DBMS(例如 PostgreSQ ...
- [SQL基础教程] 5-1视图
[SQL基础教程] 5-1视图 视图和表 从SQL角度看视图就是一张表 视图与表的差别 表保存了实际的数据,视图保存的是SELECT语句: 视图的优点 节省存储空间: 将常用的Select 语句保存成 ...
- [SQL基础教程] 4-4 事务
[SQL基础教程] 4 数据更新 4-4 事务 事务 需要在同一处理单元中执行的一系列更新处理的集合 创建事务 事务开始语句; DML语句1; DML语句2; . . . 事务结束语句; 事务开始语句 ...
- [SQL基础教程] 4-3 数据的更新(UPDATE)
[SQL基础教程] C4 数据更新 4-3 数据的更新(UPDATE) UPDATE UPDATE <表名> SET <列名> = <表达式>; UPDATE &l ...
- [SQL基础教程] 4-2 数据删除(DELETE)
[SQL基础教程] C4 数据更新 4-2 数据删除(DELETE) DROP TABLE / DELETE DROP TABLE - 完全删除表 DELETE - 仅删除数据,保留表容器 DELET ...
- [SQL基础教程] 4-1 数据的插入(INSERT)
[SQL基础教程] C4 数据更新 4-1 数据的插入(INSERT) INSERT INSERT INTO <表名>(列1,列2...) VALUES(值1,值2...); 清单 用() ...
- [SQL基础教程] 3-4 对查询结果进行排序/ORDER BY
[SQL基础教程] 3-4 对查询结果进行排序/ORDER BY ORDER BY SELECT <列名1>,<列名2>,<列名2>... FROM ORDER B ...
- [SQL基础教程] 3-3 HAVING
[SQL基础教程] 3-3 HAVING HAVING子句 SELECT col_1,col_2 FROM table GROUP BY col_1,col_2 HAVING col_1 = '2'; ...
- [SQL基础教程] 3-2 对表进行分组
[SQL基础教程] 3-2 对表进行分组 GROUP BY SELECT <列名1>,<列名2>,... FROM <表名> GROUP BY <列名1> ...
- [SQL基础教程] 3-1 对表进行聚合查询
[SQL基础教程] 3-1 对表进行聚合查询 聚合函数 用于合计的函数称为聚合函数或者集合函数 COUNT SUM AVG MAX MIN SELECT COUNT(*) FROM table; SE ...
随机推荐
- java mysql连接时出现的问题
当出现Caused by: java.sql.SQLException: Unknown system variable ‘tx_isolation’ 一般是mysql-connector-java的 ...
- 在eclipse中的交叉编译
1.硬件是Arm 9的板子,运行的系统是Ubuntu 12.05 2.电脑虚拟机上安装的系统是Ubuntu 10.04,程序的开发都是在虚拟机上完成,开发IDE是eclipse 3.eclipse 默 ...
- git----------如何安装gitlab,使用步骤。
1.配置yum源 vim /etc/yum.repos.d/gitlab-ce.repo 2.复制以下内容到打开的文件中: [gitlab-ce] name=Gitlab CE ...
- python [[1,2],[3,4],[5,6]]一行代码展开该列表,得出[1,2,3,4,5,6]
#1)利用推导式运行过程:for i in a ,每个i是[1,2],[3,4],[5,6],for j in i,每个j就是1,2,3,4,5,6,合并后就是结果 a=[[1,2],[3,4],[5 ...
- react使用create-react-app创建的项目部署
一.在所有的项目代码编写完成后,react项目直接部署是无法正常访问的 1.问题一 网页无法正常的浏览器刷新,刷新会报404错,路由找不到页面 2.问题二 路由跳转后,浏览器后退按钮点击后,页面不刷新 ...
- Excel VBA附合导线平差自动计算表
这是6,7年前做的一个excel vba自动计算附合导线平差的表格. 对于做测绘的朋友来说,附合导线平差是最基础的技能,目前来说,能平差的软件和工具也很多,像南方的平差易,科傻平差.清华三维平差等,但 ...
- 【Codeforces Round】 #431 (Div. 2) 题解
Codeforces Round #431 (Div. 2) A. Odds and Ends time limit per test 1 second memory limit per test ...
- rpm 数据库
rpm 数据库 /var/lib/rpm
- 利用BLEU进行机器翻译检测(Python-NLTK-BLEU评分方法)
双语评估替换分数(简称BLEU)是一种对生成语句进行评估的指标.完美匹配的得分为1.0,而完全不匹配则得分为0.0.这种评分标准是为了评估自动机器翻译系统的预测结果而开发的,具备了以下一些优点: 计算 ...
- Java面向对象概述和三大特性
Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...