oracle教程之group by与having语句的用法

发布时间:2020-10-21编辑:脚本学堂
本文详细介绍了oracle中group by与having语句的用法,通过一些例子帮助大家理解group by与having语句的使用方法,有需要的朋友参考下。

一, 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