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。

转载于:https://www.cnblogs.com/wowpH/p/11060794.html

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值