组函数: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_分组函数的更多相关文章

  1. Oracle学习笔记:wm_concat函数合并字段

    在Oracle中使用wm_concat(column)可以实现字段的分组合并,逗号分隔. 例如,现有表temp_cwh_test: -- 创建临时表 create table temp_cwh_tes ...

  2. Oracle学习笔记:trunc函数

    在Oracle中可以使用trunc函数进行日期截取和数字截取,具体使用方法如下: 1.trunc(for dates) 日期截取 语法:trunc(date,[fmt]) select trunc(s ...

  3. Oracle学习笔记_03_单行函数

    1.SQL函数: 单行函数.多行函数 单行函数:       操作数据对象       接受参数返回一个结果       只对一行进行变换       每行返回一个结果       可以转换数据类型  ...

  4. Oracle 学习笔记 18 -- 存储函数和存储过程(PL/SQL子程序)

    PL/SQL子程序 它包含了函数和过程.此功能是指用户定义的函数.和系统功能是不同的.子程序通常完成特定的功能PL/SQL座.,能够被不同的应用程序多次调用.Oracle提供能够把PL/SQL程序存储 ...

  5. Oracle学习笔记之用户自定义函数

    自定义函数语法格式:   用户自定义的函数,可以直接在sql语句中直接调用,并且任何一个funciton都必须有返回值,而且该函数声明后,是保存在数据端的,我们随时可以使用:注意:函数只能有一个返回值 ...

  6. Oracle学习笔记:decode函数

    decode函数主要作用:将查询结果翻译成其他值(即以其他形式变现出来) 使用方法: SELECT DECODE(colunm_name,值1,翻译值1,值2,翻译值2……值n,翻译值n,缺省值) F ...

  7. Oracle学习笔记_05_ 一个创建表空间、创建用户、授权的完整过程

    一.完整命令 su - oracle sqlplus /nolog conn /as sysdba create tablespace scaninvoice logging datafile '/u ...

  8. Oracle学习笔记之四sp1,Oracle 11g的常用函数

    从Oracle学习笔记之四,SQL语言入门中摘出来的,独立成一章节 3.1 字符类函数 ASCII(c)和CHR(i)    分别用于返回一个字符的ASCII码和返回给定ASCII值所对应的字符. C ...

  9. oracle学习笔记第一天

    oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字   1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...

随机推荐

  1. 嵌入式驱动开发之sensor---sensor 图形传感器调试

    图像传感器(image sensor)复位顺序 1. 硬件复位寄存器:2. 软件复位寄存器:3. 设置时钟寄存器:4. 设置PLL倍频:5. 设置分辨率:6. 设置窗口控制:7. 设置输出顺序:8. ...

  2. 有关于__align(n) ,内存对齐

    __align __align 关键字指示编译器在 n 字节边界上对齐变量. __align 是一个存储类修饰符.它不影响函数的类型. 语法 __align(n) 其中: n 是对齐边界. 对于局部变 ...

  3. LR测试HTTPS

    从浏览器里导出cer证书 保存好后, 下载openssl-1.0.1s安装好openssl之后,进入openssl目录: 输入openssl命令,即进入命令模式: 先将要转换的cer证书也放到open ...

  4. thrift实例

    Thrift实例 Apache thrift是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架. 它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生 ...

  5. 2016/05/17 thinkphp3.2.2 分页的使用:①在Home下设置Publics文件夹或在thinkPHP下library的vender 把page.class.php 考贝进入 ②通过new 实例化方式调用 $page=new \Home\Publics\Page($total,3);

    注意分页的方法有两种:一种是thinkphp3.2 自带的   另一种是之前新闻页用过的     显示效果稍有差别 显示效果: 细节问题: ①搜索页面  要加session判断   和  分页 ②修改 ...

  6. html/css背景图片自适应分辨率大小

    <style type='text/css'> .bgbox { position: absolute; left: 0; top: 0; width: 100%; overflow: h ...

  7. javascript中apply和call的区别

    请补充   136页  pdf  高级javascript设计

  8. "ORA-01012: not logged on"以及"Connected to an idle instance."解决思路

    今天测试用的ORACLE服务器出现卡顿情况,于是准备重启一下,在运行shutdown指令关闭数据库的时候意外断开连接,后面想再次进入ORACLE服务器启动时便遇见如下报错: 使用sqlplus /no ...

  9. 洛谷 P3629 [APIO2010]巡逻

    题目在这里 这是一个紫题,当然很难. 我们往简单的想,不建立新的道路时,从1号节点出发,把整棵树上的每条边遍历至少一次,再回到1号节点,会恰好经过每条边两次,路线总长度为$2(n-1)$,根据树的深度 ...

  10. Codeforces441C_Valera and Tubes(暴力)

    Valera and Tubes time limit per test 1 second memory limit per test 256 megabytes input standard inp ...