组函数: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. wamp 两个不同的php.ini

    最近在本地开发的windows wamp环境安装一个vld 扩展,碰见一个奇怪的问题,phpinfo() 有 而cli 命令模式里面却没有 最后发现wamp phpinfo()和cli命令模式指向的p ...

  2. strpos 判断字符串是否存在

    strpos    中为什么要用逗号隔开的原因是因为   防止找出相匹配的中 ,  如   查找1    而数组中  存在  12  那么这个结果也是可以找出来的 ,分别在1 前后加个,  就是为了区 ...

  3. 用PreferenceActivity做一个标准的设置界面

    最后接触到一个任务,做一个工厂设置,在我看来工厂设置不需要多美观,但是一定要方便修改,添加功能,再就是使用方便,我就想到了用PreferenceActivity,android系统的settings就 ...

  4. Map集合按value的大小排序

    public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Int ...

  5. 九度OJ 1338:角斗士 (递归、DP)

    时间限制:3 秒 内存限制:32 兆 特殊判题:否 提交:213 解决:66 题目描述: 角斗士是古罗马奴隶社会的一种特殊身份的奴隶,他们的职责是在角斗场上进行殊死搏斗,为了人们提供野蛮的娱乐.他们的 ...

  6. 九度OJ 1325:Battle Over Cities(城市间的战争) (并查集)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:376 解决:132 题目描述: It is vitally important to have all the cities connect ...

  7. c++得到本地username和IP

    bool CDlgResetAlarmInfo::GetLocalUserNameAddIP(CString &a_lstrUserName ,CString &a_IpStr) { ...

  8. 变分推断(Variational Inference)

    变分 对于普通的函数f(x),我们可以认为f是一个关于x的一个实数算子,其作用是将实数x映射到实数f(x).那么类比这种模式,假设存在函数算子F,它是关于f(x)的函数算子,可以将f(x)映射成实数F ...

  9. json遍历

    $.each(item.attributes,function (name,value) { });

  10. php中生成随机密码的自定义函数代码

    这篇文章主要分享下php中生成随机密码的方法,原理就是把一些要生成的字符预置一个的字符串包括数字拼音之类的以及一些特殊字符,这样我们再随机取字符组成我们想要的随机密码了 代码一: 生成一个随机密码的函 ...