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. Spring Boot . 3 -- Spring Boot Auto_configuration 是如何实现的?

    配置是Spring 框架的重要核心之一,所以Spring 应用能够正常的跑起来肯定是需要配置的,但是使用的Spring Boot 后很多配置没有做,那么AUTO-CONFIGURATION 到底是怎么 ...

  2. Javascript中的For循环

    在开发的过程中,遍历是一个经常遇到的.而for循环则是Javascript工具箱里一个好用的,也常用的工具.每个人的习惯不同,for循环的写法也不尽相同. 1.不写声明变量的写法: for(var i ...

  3. BZOJ2212【POI2011】ROT:Tree Rotation 线段树合并

    题意: 给一棵n(1≤n≤200000个叶子的二叉树,可以交换每个点的左右子树,要求叶子遍历序的逆序对最少. 分析: 求逆序对我们可以想到权值线段树,所以我们对每个点建一颗线段树(为了避免空间爆炸,采 ...

  4. [LUOGU] P1113 杂物

    题目描述 John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它.比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作.尽早将所有杂务完成是必要的,因为 ...

  5. 解决mysql时区问题以及SSL问题

    看了下网上的教程,觉得都太麻烦啦,这里推荐个简单的! 解决时区问题 只需要加上serverTimezone=UTC即可,如下: spring.datasource.url=jdbc:mysql://1 ...

  6. [Python3网络爬虫开发实战] 6.3-Ajax结果提取

    这里仍然以微博为例,接下来用Python来模拟这些Ajax请求,把我发过的微博爬取下来. 1. 分析请求 打开Ajax的XHR过滤器,然后一直滑动页面以加载新的微博内容.可以看到,会不断有Ajax请求 ...

  7. Linux系统下设置vi编辑器,tab键为4

    1.cd ~ 2.vi .exrc 3.set tabstop=4(保存并退出)即可

  8. C#基础学习(二)

    ---恢复内容开始--- 面向对象 (类是不占内存,实例占内存) C#与python不用可以直接从另一个文件直接实例化一个类,不需要导包:                                ...

  9. pandas的合并、连接、去重、替换

    import pandas as pd import numpy as np # merge合并 ,类似于Excel中的vlookup df1 = pd.DataFrame({'key': ['K0' ...

  10. 集训第六周 数学概念与方法 概率 数论 最大公约数 G题

    Description There is a hill with n holes around. The holes are signed from 0 to n-1. A rabbit must h ...