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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM