Oracle学习笔记_05_分组函数
组函数:avg sum max min count
group by
having
group by 增强:rollup cube grouping grouping set
一.分组函数
1.常用分组函数
AVG([DISTINCT|ALL]n) -- 求平均值,忽略空值
COUNT({*|[DISTINCT|ALL]expr}) -- 统计个数,其中expr用来判定非空值(使用*计算所有选定行,包括重复行和带有空值的行)
MAX([DISTINCT|ALL]expr) -- 求最大值,忽略空值
MIN([DISTINCT|ALL]expr) -- 求最小值,忽略空值
SUM([DISTINCT|ALL]n) -- 求和,忽略空值
注: (1) DISTINCT 使函数只考虑非重复值,ALL则考虑包括重复值在内的所有值。默认为ALL.
(2) 带有expr参数的函数的数据类型可以为CHAR,VARCHAR2,NUMBER,DATE.
(3) 所有分组函数都忽略空值。可以使用NVL,NVL2,或COALESCE函数代替空值
(4) 使用GROUP BY 时,Oralce服务器隐式地按照升序对结果集进行排序。可以使用ORDER BY 更改排序结果。
(5)组函数默认忽略空值。可以使用NVL 函数强制分组函数包含空值,如
select avg(nvl(comm,0)) from emp;
2.语法
SELECT [column,] group_function(column), ...
FROM table
[WHERE condition]
[GROUP BY column]
[ORDER BY column];
3.avg() / sum()
只适用于数值型
select avg(salary),sum(salary)
from employees
where department_id = 80;
4.max() / min()
适用于数值型、字符型、日期型
select max(salary),max(last_name),max(hire_date),min(salary),min(last_name),min(hire_date)
from employees;
5.count()
coung(*)包含空值、重复值,count(expr)过滤空值,count(distinct expr)既过滤空值,也过滤重复值
(1) count(1)/count(2)/count(*)表示将表中的每条记录用1/2/*来充当
select count(employee_id),count(1),count(2),count(salary),count(*),count(hire_date),count(commission_pct)
from employees;
(2) avg = sum / count
select avg(commission_pct),sum(commission_pct)/count(commission_pct),sum(commission_pct)/107
from employees; --1和2相等
(3) 使用NVL 函数强制分组函数包含空值
select avg(nvl(commission_pct,0)),sum(commission_pct)/107
from employees; --1,2相等
二.group by
使用GROUP BY 子句可以将表中的行分成更小的组,然后使用分组函数返回每一组的汇总信息。
1.语法
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression] --即为对哪些列进行分组
[ORDER BY column];
注: (1)SELECT 中出现的列,如果未出现在分组函数中,则GROUP BY子句必须包含这些列
(2)WHERE 子句可以某些行在分组之前排除在外
(3)不能在GROUP BY 中使用列别名
(4) 默认情况下GROUP BY列表中的列按升序排列
(5) GROUP BY 的列可以不出现在分组中
2.示例
按多个字段进行分组
select department_id,job_id,avg(salary),sum(salary)
from employees
group by department_id , job_id
order by department_id;
分组函数的嵌套
select max(avg(sal)) from emp group by deptno;
三.having
(1)若过滤条件中出现了组函数,那么必须使用havin替换where.
(2)若过滤条件中没有组函数,建议使用where,比having 效率高。
select department_id,max(salary)
from employees
--where max(salary) > 100000 --错误
having max(salary) > 100000
group by department_id;
四.group by 增强
1.Rollup
在Group By 中使用Rollup 产生常规分组汇总行 以及分组小计:
SELECT department_id, job_id, SUM(salary)
FROM employees
WHERE department_id < 60
GROUP BY ROLLUP(department_id, job_id);

1——常规分组行;
2, 3 ——分层小计行;
Rollup 后面跟了n个字段,就将进行n+1次分组,从右到左每次减少一个字段进行分组;然后进行union
2.Cube
在Group By 中使用Cube 产生Rollup结果集 + 多维度的交叉表数据源:
SELECT department_id, job_id, SUM(salary)
FROM employees
WHERE department_id < 60
GROUP BY CUBE (department_id, job_id) ;

1——常规分组行;
2, 3 、 4 ——分层小计行;其中3是交叉表数据源需要的 job_id 维度层面的小计。
Cube 后面跟了n个字段,就将进行2的N次方的分组运算,然后进行;
3.Grouping
Grouping函数: Rollup 和 Cube有点抽象,他分别相当于n+1 和 2的n次方常规 Group by 运算;那么在Rollup 和 Cube的结果集中如何很明确的看出哪些行是针对那些列或者列的组合进行分组运算的结果的? 答案是可以使用Grouping 函数; 没有被Grouping到返回1,否则返回0.
SELECT department_id DEPTID, job_id JOB,
SUM(salary),
GROUPING(department_id) GRP_DEPT,
GROUPING(job_id) GRP_JOB
FROM employees
WHERE department_id < 50
GROUP BY ROLLUP(department_id, job_id);

第1行, department_id 和 job_id都被用到了,所以都返回0; 第2行, job_id 没有被用到,所以返回1; 第3行, department_id 和job_id 都没有被用到,所以都返回1
4.Grouping Set
使用Grouping Set 来代替多次UNION:
SELECT department_id, job_id,
manager_id,avg(salary)
FROM employees
GROUP BY GROUPING SETS
((department_id,job_id), (job_id,manager_id));

Oracle学习笔记_05_分组函数的更多相关文章
- Oracle学习笔记:wm_concat函数合并字段
在Oracle中使用wm_concat(column)可以实现字段的分组合并,逗号分隔. 例如,现有表temp_cwh_test: -- 创建临时表 create table temp_cwh_tes ...
- Oracle学习笔记:trunc函数
在Oracle中可以使用trunc函数进行日期截取和数字截取,具体使用方法如下: 1.trunc(for dates) 日期截取 语法:trunc(date,[fmt]) select trunc(s ...
- Oracle学习笔记_03_单行函数
1.SQL函数: 单行函数.多行函数 单行函数: 操作数据对象 接受参数返回一个结果 只对一行进行变换 每行返回一个结果 可以转换数据类型 ...
- Oracle 学习笔记 18 -- 存储函数和存储过程(PL/SQL子程序)
PL/SQL子程序 它包含了函数和过程.此功能是指用户定义的函数.和系统功能是不同的.子程序通常完成特定的功能PL/SQL座.,能够被不同的应用程序多次调用.Oracle提供能够把PL/SQL程序存储 ...
- Oracle学习笔记之用户自定义函数
自定义函数语法格式: 用户自定义的函数,可以直接在sql语句中直接调用,并且任何一个funciton都必须有返回值,而且该函数声明后,是保存在数据端的,我们随时可以使用:注意:函数只能有一个返回值 ...
- Oracle学习笔记:decode函数
decode函数主要作用:将查询结果翻译成其他值(即以其他形式变现出来) 使用方法: SELECT DECODE(colunm_name,值1,翻译值1,值2,翻译值2……值n,翻译值n,缺省值) F ...
- Oracle学习笔记_05_ 一个创建表空间、创建用户、授权的完整过程
一.完整命令 su - oracle sqlplus /nolog conn /as sysdba create tablespace scaninvoice logging datafile '/u ...
- Oracle学习笔记之四sp1,Oracle 11g的常用函数
从Oracle学习笔记之四,SQL语言入门中摘出来的,独立成一章节 3.1 字符类函数 ASCII(c)和CHR(i) 分别用于返回一个字符的ASCII码和返回给定ASCII值所对应的字符. C ...
- oracle学习笔记第一天
oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字 1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...
随机推荐
- DJI SDK iOS 开发之中的一个:前言
写这个开发教程之前,还是先说点什么. 首先要声明的是我并非DJI的员工.仅仅是DJI 飞行器的爱好者. 在DJI的phantom出来之后.我就一直期待着能够推出SDK.之前最早是Parrot的AR D ...
- windows下XAMPP安装php_memcache扩展
windows下XAMPP安装php_memcache扩展 首先下载phpmemcache,地址为: http://up.2cto.com/2012/0522/20120522094758371.ra ...
- STL源代码分析--萃取编程(traits)技术的实现
1.为什么要出现? 依照默认认定.一个模板给出了一个单一的定义,能够用于用户能够想到的不论什么模板參数!可是对于写模板的人而言,这样的方式并不灵活.特别是遇到模板參数为指针时,若想实现与类型的參量不一 ...
- Linux进程间通信(IPC)机制总览
Linux进程间通信 Ø 管道与消息队列 ü 匿名管道,命名管道 ü 消息队列 Ø 信号 ü 信号基础 ü 信号应用 Ø 锁与信号灯 ü 记录锁 ü 有名信号灯 ü 无名信号灯(基 ...
- PHP-Manual的学习----【入门指引】
2017年6月27日17:03:53 笔记:简介 PHP是什么? PHP能做什么?1.PHP("PHP: Hypertext Preprocessor",超文本预处理器 ...
- python实现身份证识别
github: 人脸联合语音身份认证:https://github.com/tsstss123/faceUnionVoiceRecognition 身份证识别简易版:https://github.co ...
- MySql 查询列中包含数据库的关键字
MySQL查询列表中包含数据的关键字的处理办法是用``把关键字包起来(tab键上面的字符)
- ArcGIS Scalebar 比例尺 充满div
说明:本篇博文地图充满div,上一篇博文是充满整个body 运行效果: 2.HTML代码 <!DOCTYPE html> <html> <head> <met ...
- python3函数内全局变量使用global
def p_num(): global num num = 10 print (num) num = 5 p_num() print(num)
- python基础5 ---python文件处理
python文件处理 一.文件处理的流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 二.文件的操作方法 1.文件打开模式格式: 文件句柄 = open('文件路径', ...