04-Oracle学习_group by 和 having

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

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

你可能感兴趣的:(by,having,oracle学习,group)