我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Oracle增强型分组函数

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Oracle增强型分组函数

ROLLUP()函数是对于GROUP BY 分组统计的功能扩展,可以实现分组统计求和的效果。

下面我们开始准备我们的试验的环境

--创建新表employee_salary,存储数据来自用户hr.employees

SQL>CREATE TABLE employee_salary ASSELECT E.FIRST_NAME,E.JOB_ID,E.MANAGER_ID,E.SALARY FROM HR.EMPLOYEES E WHERE E.JOB_ID='IT_PROG';
--查看新创建的表

SQL>SELECT * FROM employee_salary;

--显示效果如下

FIRST_NAME    JOB_ID      MANAGER_ID     SALARY

-------------------- ---------- --------------------------------

Alexander       IT_PROG        102         9000.00

Bruce             IT_PROG        103          6000.00

David             IT_PROG        103          4800.00

Valli               IT_PROG        103          4800.00

Diana             IT_PROG        103         4200.00

 

--首先按照JOB_ID进行分组,查看salary和

SQL>SELECT sa.job_id,SUM(sa.salary) FROM employee_salary sa GROUP BY sa.job_id;

--显示效果如下

JOB_ID      SUM(SA.SALARY)

---------- -----------------------

IT_PROG          28800

--按照MANAGER_ID进行分组,查看salary和

SELECT sa.manager_id,SUM(sa.salary) FROM employee_salary sa GROUP BY sa.manager_id;

--显示效果如下

MANAGER_ID    SUM(SA.SALARY)

---------- ----------------------------

      102                      9000

      103                    19800

--我们使用ROLLUP函数看看是什么效果

SELECT sa.job_id,sa.manager_id,SUM(sa.salary) FROM employee_salary sa GROUP BY ROLLUP(sa.job_id,sa.manager_id);

--显示效果如下

JOB_ID     MANAGER_ID  SUM(SA.SALARY)

---------- ---------- --------------------------------

IT_PROG       102           9000

IT_PROG       103          19800

IT_PROG                      28800

                                   28800

说明:ROLLUP解析过程,以ROLLUP(a,b)为例

ROLLUP(a,b)== GROUP(a,b) UNION ALL GROUP(a) UNIONALL GROUP()

即:解析顺序是从右至左,显示按照a,b分组,接下来是按照a分组,最后是对全表分组;

上面ROLLUP (sa.job_id,sa.manager_id)等同下面UNION ALL的集合操作

SELECT sa.job_id,sa.manager_id,SUM(sa.salary) FROM employee_salary sa

GROUP BY sa.job_id,sa.manager_id

UNION ALL

SELECT sa.job_id,NULL,SUM(sa.salary) FROM employee_salary sa

GROUP BY sa.job_id

UNION ALL

SELECT NULL,NULL,SUM(sa.salary) FROM employee_salary sa GROUP BY()

ORDER BY 1,2;

--显示效果如下

JOB_ID     MANAGER_ID  SUM(SA.SALARY)

---------- ---------- --------------------------------

IT_PROG       102                9000

IT_PROG       103               19800

IT_PROG                            28800

                                         28800

说明:虽然最后展示的效果是相同的,但是ROLLUP()函数的执行效率要比UNION ALL的效率要高、要快。

ROLLUP(A,B,C)是在执行组合操作,无顺序,组合公式是(n+1),当n=3时,组合结果就是有4个。

ROLLUP()中的参数位置不同,得出的结果可能不一样!

在理解ROLLUP的基础上再来理解CUBE()就比较容易,ROLLUP()在执行组合操作,CUBE()就是在执行排序动作,从左至右,排序公式是2N次方。

CUBE(A,B,C)==GROUP BY (A,B,C) UNION ALL GROUP BY (A,B) UNION ALL GROUP BY (A,C) UNION ALL GROUPBY (A) UNION ALL GROUP BY (B) UNION ALL GROUP BY (C) UNION ALL GROUP BY ()

例如:执行下列语句

SQL> SELECT sa.job_id,sa.manager_id,SUM(sa.salary) FROM employee_salary sa GROUP BY CUBE(sa.job_id,sa.manager_id);

--显示效果如下

 

JOB_ID    MANAGER_ID SUM(SA.SALARY)

---------- ---------- -----------------------------

                                           28800

                     102                   9000

                     103                 19800

IT_PROG                              28800

IT_PROG        102                   9000

IT_PROG        103                  19800

 

6 rows selected

上面的语句等同执行下列语句

SQL>SELECT sa.job_id,sa.manager_id,SUM(sa.salary) FROM employee_salary sa GROUP BY (sa.job_id,sa.manager_id)

UNION ALL

SELECT sa.job_id,NULL,SUM(sa.salary) FROM employee_salary sa

GROUP BY (sa.job_id)

UNION ALL

SELECT NULL,sa.manager_id,SUM(sa.salary) FROM employee_salary sa 

GROUP BY (sa.manager_id)

UNION ALL

SELECT NULL,NULL,SUM(sa.salary) FROM employee_salary sa

GROUPBY ();

关于GROUPING

GROUPING(A)用于判断对于分组后的列是否是空值NULL,返回值有0和1两个值,1表示,该列为空——NULL,这个NULL值是因为分组时产生,否则则为0;


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Oracle增强型分组函数

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Value函数如何增强Oracle数据库的容错能力

Value函数本身并不直接增强Oracle数据库的容错能力。然而,Value函数可以用于在数据库中存储和检索值,这些值可以用于实现一些容错机制。例如,可以使用Value函数将数据冗余存储在多个位置,以便在某个位置出现故障时,可以从另一个位
Value函数如何增强Oracle数据库的容错能力
2024-10-09

mysql中find_in_set()函数用法及自定义增强函数

目录一、find_in_set()二、FIND_PART_IN_SET三、FIND_ALL_PART_IN_SET一、find_in_set()我们知道mysql提供了一个好用的函数FIND_IN_SET(str,strlist),该
mysql中find_in_set()函数用法及自定义增强函数
2024-08-13

Linux strcat函数:增强程序稳定性

strcat 是一个 C 语言库函数,用于将两个字符串连接在一起为了提高程序的稳定性,可以采取以下措施:使用 strncat 函数:strncat 函数允许你指定要复制的最大字符数。这样可以防止在目标缓冲区中写入过多的字符,从而避免缓冲区
Linux strcat函数:增强程序稳定性
2024-09-14

PHP 函数不断增强的协程特性

php 协程特性显着增强,提供灵活性、性能和可扩展性。主要好处包括:并行性:允许多任务同时执行。高效性:轻量级,避免性能损失。可扩展性:易于扩展到多核系统。php 中的协程函数包括 fiber::new()、fiber::start()、f
PHP 函数不断增强的协程特性
2024-05-03

Oracle Index与数据库安全性的增强

Oracle Index可以帮助提高数据库的性能和安全性。通过为数据库中的表和列创建索引,可以加快数据检索和查询的速度,从而提高系统的性能。同时,索引还可以帮助减少数据库中的重复数据和提高数据的完整性,从而增强数据库的安全性。在数据库安全
Oracle Index与数据库安全性的增强
2024-08-15

PHP 函数参数的强制类型转换

php函数参数强制转换功能允许将参数转换为特定数据类型,以确保正确的数据输入。强制转换语法:function func(mixed $param): type {...},其中mixed表示可接受任何类型的数据,type表示期望的类型。ph
PHP 函数参数的强制类型转换
2024-04-19

分析语音数据增强及python实现

目录一、概述二、加噪2.1、第一种:控制噪声因子2.2、第二种:控制信噪比三、加混响3.1、方法一:Pyroomacoustics实现音频加混响3.2、方法二:Image Source Method 算法讲解四、生成指定SER的混响五、波形
2022-06-02

C++中怎么强制类型转换函数

本篇文章给大家分享的是有关C++中怎么强制类型转换函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1)static_cast(a)将地址a转换成类型T,T和a必须是指
2023-06-17

编程热搜

目录