Oracle高级查询
高级查询在数据库的开发过程中应用广泛,从分组查询、多表查询和子查询三个方面介绍Oracle的高级查询。
分组查询
分组查询是按照一定的规则进行分组,分组以后数据会聚合,需要使用聚合函数,但是使用聚合函数不一定要分组,分组的关键字是group by。
常用的聚合函数有:最大值max(),最小值min(),平均值avg(),总和sum(),统计个数count()
count函数使用列名时会自动忽略空值
nvl函数可以防止count自动忽略空值,它的作用是当comm为空时返回0,因为0是非空,所以会进入统计总数。
group by子查询
在select 列表中所有未包含在聚合函数中的列都应该包含在group by子句中。
单列分组
求每个部门的平均工资,显示部门号,部门的平均工资。
select deptno,avg(sal) from emp group by deptno order by deptno
多列分组
按部门,不同职位,统计员工的工资总和
select detpno,job,sum(sal) from emp group by deptno,job order by deptno
过滤分组
having子句的使用
where与having的区别
- where子句中不能使用聚合函数,先过滤后分组
- having子句中可以使用聚合函数,先分组后过滤
注意:从SQL优化的角度上看,尽量使用where,因为where使得分组记录数大大降低,从而提高效率。
求平均工资大于2000的部门
select deptno,avg(sal) from emp where(avg(sal)) > 2000 group by deptno
where子句中不能使用聚合函数,所以报错,改成having xxx子句即可。
select deptno,avg(sal) from emp group by deptno having(avg(sal)) > 2000
在分组查询中使用order by
求每个部门的平均工资,显示部门号,部门的平均工资,按照工资升序排列。
select deptno,avg(sal) from emp group by deptno order by avg(sal)
也可以按列的别名排序
select deptno,avg(sal) avgsal from emp group by d