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. torch.nn.Linear()函数的理解

    import torch x = torch.randn(128, 20) # 输入的维度是(128,20)m = torch.nn.Linear(20, 30) # 20,30是指维度output ...

  2. HNOI 2010 物品调度 并查集 置换

    题意: 题意有点细,暂不概括.请仔细审题. 分析: 我们先要把c生成出来. 记得颜神讲这道题,首先表明,这道题有两个问题需要处理. 第一个是要先定位,第二个是要求最小移动步数. 定位时对于每一个物品i ...

  3. 安装composer及切换镜像为国内镜像

    一.下载composer php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" 下面的 ...

  4. mysql You can't specify target table 'sys_org_relation' for update in FROM clause 删除表条件不能直接包含该表

    mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表( ...

  5. MySQL-----一对一

    一对一: 用户表和博客表 用户表(userinfo): 用户id 用户名 1 George 2 root 3 Bruce 4 Catherine 博客表: 博客id 博客名 用户id(FK + 唯一) ...

  6. C++解决大数组问题

    今天写一个C++小程序,竟然出现:"VS 未经处理的异常: 0xC00000FD: Stack overflow" 查了一下,普通数组变量是在堆栈中保存的,而堆栈空间有限,故出此错 ...

  7. 关于使用mongodb中遇到的时间戳雷同的问题

    文不对题,实际上不是时间戳,而是我们使用js取当前毫秒数,将他看为时间戳,每次updata的时候,获取当前毫秒数,把它当做create_time的默认值,自动添加到我们的数据库中,数据模型如下 开始的 ...

  8. [HDU2136] Largest prime factor(素数筛)

    传送门 题意 给出若干个数n(n<=1000000),求每个n的最大质因子的排名. 质数的排名:如果素数p是第k小的素数,那么p的排名就是k. 思路 乍一看不知道怎么搞. 其实可以想想我们怎么筛 ...

  9. 593. Valid Square

    Problem statement: Given the coordinates of four points in 2D space, return whether the four points ...

  10. ***mysql 用一个表的一列,去更新另一表的一列

    需求: 老板给了一个EXCEL数据,是本人提供的一个模板,含ID,现在相当于要导入这新增的一列数据到数据库中的某一个表. 方法一:用navicat,在excel中复制一列,再粘贴到navicat中的一 ...