1.知识点:能够对比以下的录屏进行阅读

SQL> --组函数类型:avg,count,max。min,sum
SQL> --工资总额
SQL> select sum(sal) from emp; SQL> --员工人数
SQL> select count(*) from emp; SQL> --平均工资
SQL> select sum(sal)/count(*) 一, avg(sal) 二 from emp; SQL> --平均奖金的三种方式:二三方法一样。一方法不一样;
SQL> select sum(comm)/count(*) 一, sum(comm)/count(comm) 二, avg(comm) 三 from emp;
SQL> --造成一方法和二三方法结果不同的原因:空值 4. 组函数会自己主动滤空。仅仅统计不为空
SQL> select count(*),count(comm) from emp; --结果不同。count(comm)仅仅统计comm不为空的个数
SQL> --能够在组函数中嵌套滤空函数,来屏蔽组函数的滤空功能
SQL> select count(*),count(nvl(comm,0)) from emp; --结果同样。count(comm)统计全部结果 SQL> --求各个部门的平均工资
SQL> select deptno,avg(sal)
2 from emp
3 group by deptno; SQL> --语法
SQL> --在select列表中全部未包括在组函数中的列都应该包括在group by子句中
SQL> --包括在group by子句中的列不必包括在select列表中
SQL> --按部门,不同的职位统计平均工资
SQL> select deptno,job,avg(sal)
2 from emp
3 group by deptno,job
4 order by 1
SQL> --group by多列:先依照第一列分;假设第一列同样,再依照第二列分 SQL> --having:过滤分组
SQL> --查询平均工资大于2000的部门
SQL>select deptno,avg(sal)
2 from emp
3 group by deptno
4 having avg(sal)>2000 SQL> --having和where的差别
SQL> --求10号部门的平均工资
SQL> select deptno,avg(sal)
2 from emp
3 group by deptno
4 having deptno=10; SQL> --SQL优化 3. 尽量使用where,例外:假设条件中含有组函数,仅仅能使用having SQL> --group by的增强:做部门报表可能用到
SQL> -- group by deptno,job + group by deptno + group by null = group by rollup(deptno,job)
SQL> -- group by rollup(a,b) = group by a,b + group by a + group by null
SQL> select deptno,job,sum(sal)
2 from emp
3 group by rollup(deptno,job); SQL> --SQLPLUS支持报表功能
SQL> break on deptno skip 2 --break on deptno:依照部门号分段,同样的部门号仅仅显示一次;skip 2:不同的部门之间空2行

2.在Sqlplus下实际运行的结果录屏:

SQL> host cls

SQL> --工资总额
SQL> select sum(sal) from emp; SUM(SAL)
----------
29025 SQL> --员工人数
SQL> select count(*) from emp; COUNT(*)
----------
14 SQL> --平均工资
SQL> select sum(sal)/count(*) 一, avg(sal) 二 from emp; 一 二
---------- ----------
2073.21429 2073.21429 SQL> --平均奖金
SQL> select sum(comm)/count(*) 一, sum(comm)/count(comm) 二, avg(comm) 三 from emp; 一 二 三
---------- ---------- ----------
157.142857 550 550 SQL> --空值 4. 组函数会自己主动滤空
SQL> select count(*),count(comm) from emp; COUNT(*) COUNT(COMM)
---------- -----------
14 4 SQL> select count(*),count(nvl(comm,0)) from emp; COUNT(*) COUNT(NVL(COMM,0))
---------- ------------------
14 14 SQL> --能够在组函数中嵌套滤空函数,来屏蔽组函数的滤空功能
SQL> host cls SQL> --求各个部门的平均工资
SQL> set linesize 150
SQL> col sal for 9999
SQL> select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 13-7月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 13-7月 -87 1100 20 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10 已选择14行。 SQL> select deptno,avg(sal)
2 from emp
3 group by depnto;
group by depnto
*
第 3 行出现错误:
ORA-00904: "DEPNTO": 标识符无效 SQL> ed
已写入 file afiedt.buf 1 select deptno,avg(sal)
2 from emp
3* group by deptno
SQL> / DEPTNO AVG(SAL)
---------- ----------
30 1566.66667
20 2175
10 2916.66667 SQL> --语法
SQL> select deptno,job,avg(sal)
2 from emp
3 group by depnto;
group by depnto
*
第 3 行出现错误:
ORA-00904: "DEPNTO": 标识符无效 SQL> ed
已写入 file afiedt.buf 1 select deptno,job,avg(sal)
2 from emp
3* group by deptno
SQL> /
select deptno,job,avg(sal)
*
第 1 行出现错误:
ORA-00979: 不是 GROUP BY 表达式 SQL> ed
已写入 file afiedt.buf 1 select deptno,job,avg(sal)
2 from emp
3* group by deptno,job
SQL> --group by多列:先依照第一列分;假设第一列同样,再依照第二列分
SQL> ed
已写入 file afiedt.buf 1 select deptno,job,avg(sal)
2 from emp
3 group by deptno,job
4* order by 1
SQL> / DEPTNO JOB AVG(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
20 ANALYST 3000
20 CLERK 950
20 MANAGER 2975
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 1400 已选择9行。 SQL> --按部门。不同的职位统计平均工资
SQL> host cls SQL> --having
SQL> select deptno,avg(sal)
2 from emp
3 group by depnto;
group by depnto
*
第 3 行出现错误:
ORA-00904: "DEPNTO": 标识符无效 SQL> ed
已写入 file afiedt.buf 1 select deptno,avg(sal)
2 from emp
3* group by deptno
SQL> / DEPTNO AVG(SAL)
---------- ----------
30 1566.66667
20 2175
10 2916.66667 SQL> --查询平均工资大于2000的部门
SQL> ed
已写入 file afiedt.buf 1 select deptno,avg(sal)
2 from emp
3 group by deptno
4* having avg(sal)>2000
SQL> / DEPTNO AVG(SAL)
---------- ----------
20 2175
10 2916.66667 SQL> --having 过滤分组
SQL> host cls SQL> --having和where的差别
SQL> --求10号部门的平均工资
SQL> select deptno,avg(sal)
2 from emp
3 group by deptno
4 having deptno=10; DEPTNO AVG(SAL)
---------- ----------
10 2916.66667 SQL> select deptno,avg(sal)
2 from emp
3 where deptno=10
4 group by deptno; DEPTNO AVG(SAL)
---------- ----------
10 2916.66667 SQL> --SQL优化 3. 尽量使用where
SQL> 例外:假设条件中含义组函数。仅仅能使用having
SP2-0734: 未知的命令开头 "例外:假设..." - 忽略了剩余的行。 SQL> -- 例外:假设条件中含义组函数。仅仅能使用having
SQL> host cls SQL> --group by的增强
SQL> /*
SQL> group by deptno,job
SQL> +
SQL> group by deptno
SQL> +
SQL> group by null
SQL>
SQL> =
SQL>
SQL> group by rollup(deptno,job)
SQL>
SQL> group by rollup(a,b)
SQL> =
SQL> group by a,b
SQL> +
SQL> group by a
SQL> +
SQL> group by null
SQL>
SQL> */
SQL> select deptno,job,sum(sal)
2 from emp
3 group by rollup(deptno,job); DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10 8750
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
20 10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600 DEPTNO JOB SUM(SAL)
---------- --------- ----------
30 9400
29025 已选择13行。 SQL> --SQLPLUS支持报表功能
SQL> break on deptno skip 2
SQL> select deptno,job,sum(sal)
2 from emp
3 group by rollup(deptno,job); DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
MANAGER 2450
PRESIDENT 5000
8750 20 CLERK 1900
ANALYST 6000
MANAGER 2975
10875 DEPTNO JOB SUM(SAL)
---------- --------- ---------- 30 CLERK 950
MANAGER 2850
SALESMAN 5600
9400 29025 已选择13行。 SQL> break on null
SQL> / DEPTNO JOB SUM(SAL)
---------- --------- ----------
10 CLERK 1300
10 MANAGER 2450
10 PRESIDENT 5000
10 8750
20 CLERK 1900
20 ANALYST 6000
20 MANAGER 2975
20 10875
30 CLERK 950
30 MANAGER 2850
30 SALESMAN 5600 DEPTNO JOB SUM(SAL)
---------- --------- ----------
30 9400
29025 已选择13行。 SQL> spool off

Oracle学习(四):组函数的更多相关文章

  1. oracle数据库之组函数

    组函数也叫聚合函数,用来对一组值进行运算,并且可以返回单个值 常见的组函数: (1)count(*),count(列名)  统计行数:找到所有不为 null 的数据来统计行数 (2)avg(列名)  ...

  2. oracle篇 之 组函数

    一,常见组函数 1 . avg:求平均值,操作数值类型 2.sum:求和,操作数值类型 3.min:求最小值,操作任意类型 4.max:求最大值,操作任意类型 select avg(salary),s ...

  3. Oracle学习笔记—常用函数

    这里记录一些oracle常用的函数. TO_NUMBER()函数 将字符串类型转换成一个 number 类型的值. SELECT TO_NUMBER('100.00') FROM DUAL; TO_C ...

  4. Oracle学习笔记——常用函数总结

    在平时写PL/SQL的时候,经常要用到很多系统自带的函数,而这些函数用起来非常好用,但是每次用完以后,就又忘到脑后了,为了加深自己的映象,以及对这些函数做一个全面的总结,就有了今天这篇文章. 首先这就 ...

  5. Oracle系列四 单行函数查询语句

    单行函数 操作数据对象 接受参数返回一个结果 只对一行进行变换 每行返回一个结果 可以转换数据类型 可以嵌套 参数可以是一列或一个值 包含:字符,数值,日期,转换,通用 字符函数 1.大小写控制函数: ...

  6. oracle学习 四(持续更新中)无法为表空间 MAXDATA 中的段创建 INITIAL 区

    解决建立表的时候出现的 ORA-01658: 无法为表空间 MAXDATA 中的段创建 INITIAL 区 出现这个问题是因为表空间的大小不足,可以给他扩容这样的话也会多出来一个数据文件.具体写法如下 ...

  7. oracle 组函数

    一.组函数嵌套 ORACLE中规定,组函数嵌套只能嵌两层.其实多层嵌套并没有实际的用途,因此ORACLE没有提供组函数的多层嵌套.但是,单行函数是可以多层嵌套的. 二. 1.Oracle包含以下组函数 ...

  8. oracle学习篇五:组函数,分组统计

    常用组函数: 1.ccount() 求出全部记录数. 2.max() 求出一组最大值 3.min() 求出一组最小值 4.avg() 求出平均值 5.sum() 求和 --1.统计员工数量: sele ...

  9. oracle 学习笔记(四)

    1. SQL(高级查询) 1.1. 子查询 1.1.1. 子查询在WHERE子句中 在SELECT查询中,在WHERE查询条件中的限制条件不是一个确定的值,而是来自于另外一个查询的结果.为了给查询提供 ...

随机推荐

  1. 制作framework&静态库

    http://blog.csdn.net/justinjing0612/article/details/7880712     (制作framework) http://blog.sina.com.c ...

  2. Spider-scrapy 中的 xpath 语法与调试

    把setting中的机器人过滤设为False ROBOTSTXT_OBEY = False 1 语法 artcile 选取所有子节点 /article 选取根元素 artile article/a 选 ...

  3. url方法使用与单例模式

    一.url方法使用 from django.contrib import admin from django.urls import path, include from django.conf.ur ...

  4. python标准库笔记

    1.python互联网数据处理模块 base64数据编码 二进制数据 encode ASCII字符 ASCll字符 decode 二进制数据 json数据交换格式 轻量的数据交换格式,json暴露的A ...

  5. add favorite & 收藏夹

    add favorite // 收藏夹 function favorite (){ var ctrl = (navigator.userAgent.toLowerCase()).indexOf(&qu ...

  6. hdu 5093 二分匹配

    /* 题意:给你一些冰岛.公共海域和浮冰,冰岛可以隔开两个公共海域,浮冰无影响 求选尽可能多的选一些公共海域点每行每列仅能选一个. 限制条件:冰山可以隔开这个限制条件.即*#*可以选两个 预处理: * ...

  7. Quartz进一步学习与使用

    一.再思考 了解Quartz.NET的基本使用方法了.但如果想方便的知道某个作业执行情况,需要暂停,启动等操作行为,这时候就需要个Job管理的界面,如何才能达到我们想到的效果,查看相关Quartz.n ...

  8. Linux下汇编语言学习笔记34 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  9. [bzoj2962]序列操作_线段树_区间卷积

    序列操作 bzoj-2962 题目大意:给定一个n个数的正整数序列,m次操作.支持:1.区间加:2.区间取相反数:3.区间求选c个数的乘积和. 注释:$1\le n,m\le 5\cdot 10^4$ ...

  10. 洛谷 P1023 税收与补贴问题

    P1023 税收与补贴问题 题目背景 每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最 ...