Oracle查询部门工资最高员工的两种方法 1、MAX()函数 2、RANK()函数

  本文以SCOTT用户下初始的EMP表为参考。代码可直接使用。
  查询EMP表结构的语句如下,【代码1】:

DESC EMP;

  EMP表结构如下:【结果1】:

SQL> DESC EMP;
 名称                                                              是否为空? 类型
 ----------------------------------------------------------------- -------- --------------------------------------------
 EMPNO                                                             NOT NULL NUMBER(4)
 ENAME                                                                      VARCHAR2(10)
 JOB                                                                        VARCHAR2(9)
 MGR                                                                        NUMBER(4)
 HIREDATE                                                                   DATE
 SAL                                                                        NUMBER(7,2)
 COMM                                                                       NUMBER(7,2)
 DEPTNO                                                                     NUMBER(2)

  本文只选取其中的4列作为参考,分别是EMPNO,ENAME,SAL,DEPTNO。
  按照工资降序排序的查询语句如下,【代码2】:

SELECT EMPNO,ENAME,SAL,DEPTNO
FROM EMP
ORDER BY SAL DESC;

  排序结果如下,【结果2】:

SQL> SELECT EMPNO,ENAME,SAL,DEPTNO
  2  FROM EMP
  3  ORDER BY SAL DESC;

     EMPNO ENAME             SAL     DEPTNO
---------- ---------- ---------- ----------
      7839 KING             5000         10
      7902 FORD             3000         20
      7788 SCOTT            3000         20
      7566 JONES            2975         20
      7698 BLAKE            2850         30
      7782 CLARK            2450         10
      7499 ALLEN            1600         30
      7844 TURNER           1500         30
      7934 MILLER           1300         10
      7521 WARD             1250         30
      7654 MARTIN           1250         30
      7876 ADAMS            1100         20
      7900 JAMES             950         30
      7369 SMITH             800         20

已选择14行。

  现在我想查询出每个部门的工资最高的员工,应该怎么做呢?继续……

方法1(嵌套查询 & MAX()函数 & 自身连接)

  查询每个部门中工资最高的员工,并按照部门号升序排序,【代码3】:

SELECT EMPNO,ENAME,SAL,DEPTNO
FROM EMP E1
WHERE
    SAL = (
        SELECT MAX(SAL)
        FROM EMP E2
        WHERE E1.DEPTNO=E2.DEPTNO
    )
ORDER BY DEPTNO;

  查询结果如下,【结果3】:

SQL> SELECT EMPNO,ENAME,SAL,DEPTNO
  2  FROM EMP E1
  3  WHERE
  4      SAL = (
  5          SELECT MAX(SAL)
  6          FROM EMP E2
  7          WHERE E1.DEPTNO=E2.DEPTNO
  8      )
  9  ORDER BY DEPTNO;

     EMPNO ENAME             SAL     DEPTNO
---------- ---------- ---------- ----------
      7839 KING             5000         10
      7788 SCOTT            3000         20
      7902 FORD             3000         20
      7698 BLAKE            2850         30

方法2(嵌套查询 & RANK()函数 & 列表分区)

  查询每个部门中工资最高的员工,并按照部门号升序排序,【代码4】:

SELECT EMPNO,ENAME,SAL,DEPTNO
FROM (
    SELECT
        RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) R,
        EMPNO,ENAME,SAL,DEPTNO
    FROM EMP
)
WHERE R=1
ORDER BY DEPTNO;

  查询结果如下,【结果4】:

SQL> SELECT EMPNO,ENAME,SAL,DEPTNO
  2  FROM (
  3      SELECT
  4          RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) R,
  5          EMPNO,ENAME,SAL,DEPTNO
  6      FROM EMP
  7  )
  8  WHERE R=1
  9  ORDER BY DEPTNO;

     EMPNO ENAME             SAL     DEPTNO
---------- ---------- ---------- ----------
      7839 KING             5000         10
      7788 SCOTT            3000         20
      7902 FORD             3000         20
      7698 BLAKE            2850         30

备注:

  • 环境:Windows 10
  • 软件:Oracle 11g R2。
posted @ 2019-05-09 19:24  wowpH  阅读(2917)  评论(0编辑  收藏  举报