一, oracle的group by子句
注意:
select 子句里的字段 必须
出现在 group by子句中
或者 出现在组函数中
1, 单字段分组
复制代码 代码示例:
-- 按 部门 分组, 求各部门的平均薪水
SQL> select deptno, avg(sal) from emp
2 group by deptno;
DEPTNO AVG(SAL)
---------- ----------
30 1637.5
20 2347
10 2916.66667
2, 多字段的组合分组
复制代码 代码示例:
-- 按 部门和工种 分组, 求各分组的最大薪水
SQL> select deptno, job, max(sal) from emp
2 group by deptno, job;
DEPTNO JOB MAX(SAL)
---------- ------------------ ----------
20 MANAGER 2975
30 SALESMAN 1500
20 CLERK 1210
30 CLERK 950
3, 求其他字段
复制代码 代码示例:
-- 薪水最高的那个人的名字
SQL> select ename from emp
2 where sal = (select max(sal) from emp);
ENAME
--------------------
KING
-- 每个部门里, 最高薪水
SQL> select deptno, max(sal) from emp group by deptno;
DEPTNO MAX(SAL)
---------- ----------
30 2850
20 3300
10 5000
二, oracle的having子句
having子句实现对组的过滤。
1, 列出 平均薪水 大于 2000 的部门编号
复制代码 代码示例:
SQL> select deptno, avg(sal) from emp group by deptno;
DEPTNO AVG(SAL)
---------- ----------
30 1637.5
20 2347
10 2916.66667
SQL> select deptno, avg(sal) from emp
2 group by deptno
3 having avg(sal) > 2000;
DEPTNO AVG(SAL)
---------- ----------
20 2347
10 2916.66667
2, 注意与总结
having 是对 分组 进行限制
where 是对 单条记录进行限制, 优先于分组
即:
select
from
where
group by
having
order by
3, 练习
薪水大于1200的雇员, 按照部门编号进行分组,
这些分组的平均薪水大于1500,
查询分组的平均工资, 按平均工资的倒序排序
复制代码 代码示例:
SQL> select deptno, avg(sal)
2 from emp
3 where sal > 1200
4 group by deptno
5 having avg(sal) > 1500
6 order by avg(sal) desc;
DEPTNO AVG(SAL)
---------- ----------
10 2916.66667
20 2347
30 1866.66667