本文以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。