oracle多表查询(三)

统计分组函数

 之前介绍了count()函数,他的作用是统计数据量,它是统计函数的一员,常用的统计函数有:

count()求数据量

sum()数学求和

avg()求平均值

max()求最大值

min()求最小值

测试:求公司所有员工的总薪资和每个员工的平均薪资

select avg(sal) 平均薪资, sum(sal) 总工资 from EMP

注意 count()函数的返回值永远是数字,其他的统计函数可能会存在返回值为null的情况 但是count()返回得最起码也是0(永远是确切数字)

分组查询

当数据重复出现的时候,我们在有分组的必要。例如一群人,按照年龄可以分为18以上和18以下,按性别可以分男女,即为只有数据重复的时候,才分组。

基本语法:

select  ~ from ~ where ~ group by ~ order by~;

范例:按照部门编号分组,求出每个部门的人数,平均工资

select DEPTNO 部门编号, count(EMPNO) 部门人数,trunc(avg(sal)) 平均薪资 from EMP GROUP BY DEPTNO

范例:按照职位分组,求出每个职位的最高和最低工资
SELECT job 职位, max(sal) 最高工资, min(sal) FROM EMP GROUP BY job;

这里需要注意,分组函数可以不加group by单独使用,但是此时便不允许同时查询其他的属性,例如,我们查询一共有几种工作:
SELECT count(DISTINCT JOB) FROM EMP

如果单纯只是多个分组函数的累计也是可以的,例如我们查询一共有多少员工,员工的最高工资,公司第一个员工入职时间:
select count(EMPNO),max(SAL),min(HIREDATE) FROM EMP;

但是如果我们要查询,员工的平均工资,所有员工的姓名,这时....

如果要使用分组函数,那么“select”后面只能追加分组条件的列以及分组函数。

范例:查询出每个部门的名称、部门的人数、平均工资
SELECT d.DNAME 部门名称,count(e.EMPNO) 部门人数,coalesce(trunc(avg(e.sal)),0)  平均工资
FROM DEPT d,EMP e WHERE e.DEPTNO(+)=d.DEPTNO GROUP BY d.DNAME ORDER BY 1;

范例:要求显示每个部门的编号、名称、位置、部门的人数、平均工资
SELECT d.DEPTNO 部门编号,d.DNAME 部门名称,d.LOC 部门位置,count(e.EMPNO) 部门员工,coalesce(trunc(avg(e.SAL)),0) 平均工资
FROM EMP e, DEPT d WHERE e.DEPTNO(+)=d.DEPTNO GROUP BY d.DEPTNO,d.DNAME,d.LOC order by 1;

由此我们发现,分组条件可以不止一个列,其实 只要部门编号是10的,部门名称一定是C,部门位置一定是地球,由此我们可以把他们三个列看作一个整体进行分组操作


原文地址:https://www.cnblogs.com/HUCHEN/p/9985946.html