Oracle学习(四)----分组函数
2016-03-29 16:01
531 查看
1 什么是分组函数 分组函数作用于一组数据,并对一组数据返回一个值。 1.1 组函数类型 AVG / COUNT / MAX / MIN / SUM select max(sal) 最大值, min(sal) 最小值, avg(sal) 平均值, sum(sal) 总, count(sal) 计数 from emp 最大值 最小值 平均值 总 计数 ---------- ---------- ---------- ---------- ---------- 8000 800 2468.33333 37025 15 1.2 当组函数和null在一起,组函数会自动过滤空值 1.2.1: SQL> select avg(comm) 方法一, sum(comm)/count(comm) 方法二, sum(comm)/count(*) 方法三 from emp; 方法一 方法二 方法三 ---------- ---------- ---------- 550 550 146.666667 1.2.2:组函数会自动过滤空值 SQL> select count(comm), count(*) from emp; COUNT(COMM) COUNT(*) ----------- ---------- 4 15 1.2.3:修正组函数的虑空(利用nvl修正count虑空) select count(nvl(comm, 0)), count(*) from emp; COUNT(NVL(COMM,0)) COUNT(*) ------------------ ---------- 15 15 1.3 补充 SQL> select count(distinct deptno) from emp; COUNT(DISTINCTDEPTNO) --------------------- 3 2 分组数据 2.1 求各个部门的平均工资 思想:需要把各个部门的数据划分......10部门 20部门 30部门.......分组...... SQL> select deptno, avg(sal) from emp group by deptno; DEPTNO AVG(SAL) ---------- ---------- 30 1566.66667 20 2175 10 4187.5 2.2 注意: (1)select 检索的列必须位于group by后面的集合中,但是包含在group by子句中的列不必包含在select列表中; (2)组函数设计的本意:必须要在分组数据之上进行结果集合的检索,解释了第一条 2.3 group by后面有多列 求各个部门的每一个工种的平均工资(分两组) SQL> select deptno, job, avg(sal), count(deptno) from emp 2 group by deptno, job 3 order by 1; DEPTNO JOB AVG(SAL) COUNT(DEPTNO) ---------- --------- ---------- ------------- 10 CLERK 1300 1 10 MANAGER 2450 1 10 PRESIDENT 5000 1 10 8000 1 20 ANALYST 3000 2 20 CLERK 950 2 20 MANAGER 2975 1 30 CLERK 950 1 30 MANAGER 2850 1 30 SALESMAN 1400 4 3 分组过滤 查询平均工资>2000的部门 思路:先分组,再过滤 SQL> ed 已写入 file afiedt.buf 1 select deptno, avg(sal) from emp 2 group by deptno 3* having avg(sal) > 2000 SQL> / DEPTNO AVG(SAL) ---------- ---------- 20 2175 10 4187.5 4 having子句和where子句的区别,where子句中不能使用分组函数,having子句中可以使用分组函数 例:求10号部门的平均工资 方法一:先分组,再过滤 SQL> select deptno, avg(sal) from emp 2 group by deptno 3 having deptno = 10; DEPTNO AVG(SAL) ---------- ---------- 10 4187.5 方法二:先过滤,再分组(这种方法好!) SQL> select deptno,avg(sal) from emp 2 where deptno = 10 3 group by deptno; DEPTNO AVG(SAL) ---------- ---------- 10 4187.5 错误示例: SQL> select deptno, avg(sal) from emp 2 where deptno = 10; select deptno, avg(sal) from emp * 第 1 行出现错误: ORA-00937: 不是单组分组函数 解析:若果没有group by,则deptno会返回若干行数据,而avg(sal)只会返回一行数据,这种多对一的情况是不可能实现的! 5 oracle优化 5.1:oracle解析逻辑表达式的方向是从右向左 select * from emp where (deptno = 10) and (deptno = 20) and (deptno = 30); <------------<-------------<-------- 语法次序: select ...... from ...... where ...... group by ...... having ...... order by ......
相关文章推荐
- Oracle存储过程基本语法介绍
- oracle12c创建用户
- ORACLE ADF11g:存储过程传入数据库对象
- oracle 的 nubmer 类型与 C# 的 float double decimal 对应关系
- 《oracle每日一练》oralce数据库的导入导出
- ORACLE ADF11g: AM 调用存储过程
- oracle 11g 密码过期问题
- Oracle密码过期
- ORACLE ADF11g:AM 获取AM的方式
- Oracle11G 7个服务说明
- delphi调用oracle存储过程(ODAC)
- oracle11实战详解
- oracle11实战详解
- oracle11实战详解
- Oracle11G 卸载步骤
- oracle判断日期是否合法
- ORACLE ADF11g: VO RowFinder
- Oracle索引小记
- Oracle 学习笔记--入门篇
- 关于oracle数据库 多条相同数据拆分成数量为1的单条数据