Oracle分组查询
关键字: group by (分组) 和 having (过滤)
--统计每个部门的人数 -- group by 用于分组查询,后面跟分组参照字段 --分组查询以后,多行函数功能是统计每组的数据 select * from emp; select count(*) from emp group by deptno; select deptno, count(*) from emp group by deptno; --统计每个部门人数,总工资,最高工资,最低工资,平均工资 select deptno,count(*),sum(sal),max(sal),min(sal),avg(*) from emp group by deptno order by deptno desc; --注意:其中order by deptno desc 是按照部门的降序排列。 --统计每个部门的人数和平均工资,排除部门编号是10的 select deptno,count(*),avg(sal) from emp where deptno <>10 group by deptno ; --where子句不能写到group by 后面 order by 可以写到后面 --统计每个部门的人数,平均工资,排除工资小于2000的部门 select deptno,count(*),avg(sal) from emp where avg(sal) >= 2000 group by deptno order by deptno desc; --这种写法是错误的,分组过滤需要使用having从句!!! ---改进措施: --对分组查询的结果进行过滤,要使用having从句,而不是where having写到group by 后面 与where不一样 select deptno,count(*),avg(sal) from emp group by deptno having avg(sal) >= 2000 order by deptno; ---知识小结: ----select -- from -- where -- group by -- having -- select -- order by 的遵从语法格式顺序; -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----统计每个部门人数,平均工资,排除部门编号为10的和平均工资小于2000的部门 select deptno,count(*),avg(sal) from emp where deptno != 10 group by deptno having avg(sal) <>2000 order by deptno desc; --desc 降序;asc是升序。 --emp表列出工资最小值小于2000的职位 (首先分组,按照职位分组) select job,min(sal) from emp group by job having min(sal) < 2000; --列出平均工资大于1200的部门和工作搭配的组合 deptno job select deptno,job,avg(sal) from emp group by deptno,job having avg(sal) > 1200; --统计人数小于4的部门的平均工资 (按照部门分组) select deptno,count(*),avg(sal) from emp group by deptno having count(*) < 4; --统计各部门最高工资,排除最高工资小于3000的部门 (按照部门排序) select deptno,max(sal) from emp group by deptno having max(sal) >= 3000 order by deptno; -----至此,我们的DQL语句中单表查询结束,后面的牵涉到多表查询。