Oracle使用分组函数汇总数据
- 1.1 【常用分组函数类型】
- 1.2 【分组函数基本语法】
- 1.3 【使用 avg、 max、 min、 sum 函数】
- 1.4 【使用 COUNT 函数】
- 1.4.1 count(distinct)
- 1.5 【分组函数和空值】
- 1.6【group by 创建聚组数据】
- 1.6.1 【group by 子句基本语法】
- 1.7 【使用 group by 子句】
- 1.8 【根据多个列进行分组】
- 1.9 【分组函数的误用】
- 1.10 【having 排除聚组结果】
- 1.11 【分组函数的嵌套使用】
- 【总结】
1.1 【常用分组函数类型】
1.2 【分组函数基本语法】
1.3 【使用 avg、 max、 min、 sum 函数】
需求:查询 **emp **表销售人员工资的平均值、最大值、最小值、工资总和
-- 查询 emp 表销售人员工资的平均值、最大值、最小值、工资总和SCOTT@orcl>select avg(sal),max(sal),min(sal),sum(sal) from emp;
日期类型、字符类型列不能使用 avg、 **sum **函数,可以使用 max、 **min **函数
1.4 【使用 COUNT 函数】
需求: 查询 **30 **号部门的总人数
-- 查询 30 号部门的总人数SCOTT@orcl>select * from emp where deptno=30;SCOTT@orcl>select count(*) from emp where deptno=30;
SCOTT@orcl>select count(empno) from emp where deptno=30;SCOTT@orcl>select count(comm) from emp where deptno=30;
【说明】count(comm): 不统计含有空值的行;COUNT(*)返回表中行的总数, 包括重复行与数据列中含有空值的行, 而其他分组函数的统计都不
包括空值的行。
1.4.1 count(distinct)
SCOTT@orcl>select distinct mgr from emp;SCOTT@orcl>select count(distinct mgr) from emp;
1.5 【分组函数和空值】
SCOTT@orcl>select count(comm) from emp;
需求:查询所有 **14 **名员工的平均奖金
-- 查询所有 14 名员工的平均奖金SCOTT@orcl>select avg(comm) from emp;
SCOTT@orcl>select avg(nvl(comm,0)) from emp;
1.6【group by 创建聚组数据】
计算每个部门的平均工资,需要指定分组的列。
1.6.1 【group by 子句基本语法】
1.7 【使用 group by 子句】
SCOTT@orcl>select avg(sal) from emp;SCOTT@orcl>select deptno,avg(sal) from emp group by deptno;
SCOTT@orcl>select deptno,avg(sal) from emp;
**select **语句中,没有使用分组函数的列必须在 **group by **子句中
SCOTT@orcl>select avg(sal) from emp group by deptno;
**group by **后面的列可以不出现在 **select **语句中
SCOTT@orcl>select deptno dnum,avg(sal) from emp group by dnum;
**group by **后面不允许使用列的别名
1.8 【根据多个列进行分组】
需求:查询每个部门中,每种工作的工资总和。
-- 查询每个部门中,每种工作的工资总和。SCOTT@orcl>select deptno,job,sum(sal) from emp2group by deptno,job order by deptno;
1.9 【分组函数的误用】
SCOTT@orcl>select deptno,count(ename) from emp;
**select **语句中有分组函数,没有在分组函数中出现的列必须在 **group by **子句中
SCOTT@orcl>select deptno,avg(sal) from emp2where avg(sal) >20003group by deptno;
不能在 **where **子句中对聚组列作出限定,应使用 **having **子句
1.10 【having 排除聚组结果】
SCOTT@orcl>select deptno,avg(sal) from emp2having avg(sal)>20003group by deptno;
需求:查询部门最高工资大于 **2900 **的部门
-- 查询部门最高工资大于 2900 的部门SCOTT@orcl>select deptno,max(sal) from emp2group by deptno3having max(sal)>2900;SCOTT@orcl>select deptno,max(sal) from emp2having max(sal)>29003group by deptno;
**having **子句可以放在 **group by **子句前面。
1.11 【分组函数的嵌套使用】
SCOTT@orcl>select max(avg(sal)) from emp group by deptno;
分组函数最多嵌套两层**(两个函数)**,嵌套时必须有 group by
SCOTT@orcl>select count(max(avg(sal))) from emp group by deptno;
嵌套三层失败
【总结】
分组函数: avg/max/min/sum/count
分组函数(聚合函数)要处理空值;select 子句中没有被分组函数包括的列,必须出现在 group by 后面;group by 子句中的列可以不出现在 select 语句中;group by 子句中不能使用列的别名;
如果对分组函数做限制,不能用 where,需要用 having,having 子句可以写在 group by 子句前;
分组函数最多嵌套两层(两个函数)。