第五章:Oracle的分组函数与数据分组

之前介绍过的SQL函数包含当行函数和多行函数。这里分组函数就是多行函数,作用于一组数据,并且对一组数据返回一个值。常用的分组函数有:avg、sum、min、max、count、vm_concat。另外,在关系数据库中,使用数据分组可以取得表数据的汇总信息。数据分组是通过分组函数、group by以及having等子句共同实现的。


一、Oracle的分组函数

--求平均值avg
select avg(sal) from emp;

--求和sum
select sum(sal) from emp;

--求最大值max
select max(sal) from emp;

--求最小值min
select min(sal) from emp;

--计数函数count
select count(*) from emp;
select count(empno) from emp;

--统计一下部门的个数
select count(deptno) from emp;
--在分组函数中通过distinct关键字来去除重复的记录
select count(distinct deptno) from emp;

--行转列wm_concat
select wm_concat(ename) from emp;

--求员工的平均工资
select sum(sal)/count(*) 方法一, sum(sal)/count(sal) 方法二, avg(sal) 方法三 from emp;
--求员工的平均补助
select sum(comm)/count(*) 方法一, sum(comm)/count(comm) 方法二, avg(comm) 方法三 from emp;

select count(*),count(nvl(comm,0)) from emp;

select comm from emp;
--不忽略空值
select avg(nvl(comm,0)) from emp;
--忽略空值
select avg(comm) from emp;


二、Oracle的数据分组—group by

--求出每个部门的平均工资,要求显示:部门号,部门的平均工资
select deptno,avg(sal) from emp group by deptno;
--注意:在select列表中所有未包含在组函数中的列都应该包含在group by子句中

--多列分组
--按不同的部门,不同的职位,计算员工的平均工资
select deptno,job,avg(sal) from emp group by deptno,job order by deptno;

--求出每个部门的平均工资,要求显示:每个部门的平均工资。
select avg(sal)from emp group by deptno;
--注意:包含在group by子句中的列不必包含在select列表中

--求出每个部门的员工姓名,要求显示:部门编号、员工姓名
select deptno,wm_concat(ename)from emp group by deptno;

三、Oracle的数据分组—having

--求平均工资大于2500的部门,要求显示:部门号,平均工资

--select deptno,avg(sal) from emp where avg(sal)>2500 group by deptno;

--如果条件中包含分组函数,需要通过having子句对分组结果进行过滤
select deptno,avg(sal) from emp group by deptno having avg(sal)>2500;
--注意:不能在where子句中使用组函数,可以在having子句中使用组函数

--在条件中如果没有分组函数,推荐使用where子句,可以先过滤后分组来提高效率
select deptno,avg(sal) from emp where deptno=10 group by deptno;
--注意:如果条件中没有组函数,正常使用where语句就可以

--求部门平均工资的最大值
--嵌套分组函数要与group by子句一起使用
select max(avg(sal)) from emp group by deptno;


--补充
--where使得分组记录数大大降低,从而提高效率
--从SQL优化角度看,尽量使用where子句,先过滤后分组
发布了15 篇原创文章 · 获赞 15 · 访问量 5001

猜你喜欢

转载自blog.csdn.net/weixin_44337241/article/details/104650657