Oracle学习(四):组函数
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学习(四):组函数的更多相关文章
- oracle数据库之组函数
组函数也叫聚合函数,用来对一组值进行运算,并且可以返回单个值 常见的组函数: (1)count(*),count(列名) 统计行数:找到所有不为 null 的数据来统计行数 (2)avg(列名) ...
- oracle篇 之 组函数
一,常见组函数 1 . avg:求平均值,操作数值类型 2.sum:求和,操作数值类型 3.min:求最小值,操作任意类型 4.max:求最大值,操作任意类型 select avg(salary),s ...
- Oracle学习笔记—常用函数
这里记录一些oracle常用的函数. TO_NUMBER()函数 将字符串类型转换成一个 number 类型的值. SELECT TO_NUMBER('100.00') FROM DUAL; TO_C ...
- Oracle学习笔记——常用函数总结
在平时写PL/SQL的时候,经常要用到很多系统自带的函数,而这些函数用起来非常好用,但是每次用完以后,就又忘到脑后了,为了加深自己的映象,以及对这些函数做一个全面的总结,就有了今天这篇文章. 首先这就 ...
- Oracle系列四 单行函数查询语句
单行函数 操作数据对象 接受参数返回一个结果 只对一行进行变换 每行返回一个结果 可以转换数据类型 可以嵌套 参数可以是一列或一个值 包含:字符,数值,日期,转换,通用 字符函数 1.大小写控制函数: ...
- oracle学习 四(持续更新中)无法为表空间 MAXDATA 中的段创建 INITIAL 区
解决建立表的时候出现的 ORA-01658: 无法为表空间 MAXDATA 中的段创建 INITIAL 区 出现这个问题是因为表空间的大小不足,可以给他扩容这样的话也会多出来一个数据文件.具体写法如下 ...
- oracle 组函数
一.组函数嵌套 ORACLE中规定,组函数嵌套只能嵌两层.其实多层嵌套并没有实际的用途,因此ORACLE没有提供组函数的多层嵌套.但是,单行函数是可以多层嵌套的. 二. 1.Oracle包含以下组函数 ...
- oracle学习篇五:组函数,分组统计
常用组函数: 1.ccount() 求出全部记录数. 2.max() 求出一组最大值 3.min() 求出一组最小值 4.avg() 求出平均值 5.sum() 求和 --1.统计员工数量: sele ...
- oracle 学习笔记(四)
1. SQL(高级查询) 1.1. 子查询 1.1.1. 子查询在WHERE子句中 在SELECT查询中,在WHERE查询条件中的限制条件不是一个确定的值,而是来自于另外一个查询的结果.为了给查询提供 ...
随机推荐
- 20181225模拟赛 T1 color (转化思想,分拆思想)
题目: 有⼀块有 n 段的栅栏,要求第 i 段栅栏最终被刷成颜色 ci .每⼀次可以选择 l, r 把第l . . . r 都刷成某种颜色,后刷的颜⾊会覆盖之前的.⼀共有 m 种颜色,雇主知道只需要用 ...
- LG-P1311选择客栈
题目 暴力十分好想但你写不出来qwq 正解十分好写但你想不出来qaq 我们先读题,发现k其实没什么用 同时暴力枚举两个客栈的话会超时,所以只能同时枚举一个.我们枚举第二个客栈,然后用第二个客栈反推出前 ...
- 安装Vmware Tools出现错误
安装Vmware Tools出现: Before you can compile modules, you need to have the following installed... makegc ...
- Nginx基础篇(2)- Nginx基本配置文件和变量详解
Nginx基本配置文件和变量详解 1. 基本配置文件 /etc/nginx/nginx.conf # nginx运行的用户 user nginx; # nginx进程数,建议设置为等于CPU总核心数. ...
- 优先队列重载运算符< 以及初始化列表
优先队列定义 priority_queue<int, vector<int>, greater<int> >pq; 优先队列重载<运算符 在结构体中定义一个 ...
- phtyon,通过while循环简单的用户名和密码登录
_username='zhangxin' _password='abc123' _username1='zhaopeng' _password1='abc1234' _username2=" ...
- jQuery调用WCF 说明
在项目中用过一些WCF的技术这篇文章是对以前用过的一点东西的一个梳理 一,webconfig的配置除了一般的配置外,与WCF相关的配置如下 <system.serviceModel> ...
- 二元决策图(Binary decision diagram)
修一门写作课题目是Binary decision diagram.在网上查了些资料感觉说的都不是很清楚,看了半天还是很困惑,这到底是个啥?到底咋使?于是决定写下这篇随笔,总结一下看过的各种资料加上自己 ...
- POJ1308/HDU1325/NYOJ129-Is It A Tree?,并查集!
Is It A Tree? Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28838 Accepted: 9843 -& ...
- pandas中计算总体标准差
标准差(或方差),分为 总体标准差(方差)和 样本标准差(方差). 前者分母为n,后者为n-1.后者是无偏的. pandas里的 .std() 和 .var() 都是算的无偏的. 而numpy是有偏的 ...