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