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语句中单表查询结束,后面的牵涉到多表查询。
原文地址:https://www.cnblogs.com/superdrew/p/8056622.html