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。
Oracle查询部门工资最高员工的两种方法 1、MAX()函数 2、RANK()函数的更多相关文章
- MySQL关闭查询缓存(QC)的两种方法
MySQL Query Cache 会缓存select 查询,安装时默认是开启的,但是如果对表进行INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP ...
- 【转】oracle 中随机取一条记录的两种方法
oracle 中随机取一条记录的两种方法 V_COUNT INT:=0; V_NUM INT :=0; 1:TBL_MYTABLE 表中要有一个值连续且唯一的列FID BEGIN SELECT COU ...
- oracle rename数据文件的两种方法
oracle rename数据文件的两种方法 2012-12-11 20:44 10925人阅读 评论(0) 收藏 举报 分类: oracle(98) 版权声明:本文为博主原创文章,未经博主允许不 ...
- 问题:oracle select into;结果:oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解
oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解 (2011-07-08 08:59:47) 转载▼ 标签: it 分类: oracle 我们经常会遇 ...
- Oracle中spool命令实现的两种方法比较
---恢复内容开始--- 要输出符合要求格式的数据文件只需在select时用字符连接来规范格式.比如有如下表 SQL>; select id,username,password from myu ...
- 用easyui实现查询条件的后端传递并自动刷新表格的两种方法
用easyui实现查询条件的后端传递并自动刷新表格的两种方法 搜索框如下: 通过datagrid的load方法直接传递参数并自动刷新表格 通过ajax的post函数传递参数并通过loadData方法将 ...
- oracle多表关联删除的两种方法
oracle多表关联删除的两种方法 第一种使用exists方法 delete from tableA where exits ( select 1 from tableB Where tableA.i ...
- C++连接mysql数据库的两种方法
本文主要介绍了C++连接mysql数据库的两种方法,希望通过本文,能对你有所帮助,一起来看. 现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用a ...
- php导出表格两种方法 ——PhpExcel的列子
php常用的导出表格有两种方法,第一种是输出表格,这种方法打开的时候有警告提示,一般导出表格会用phpexcel,这个导出比较灵活,而且还可以设置表格的样式. 第一种导出例子 /** * 执行导出 * ...
随机推荐
- 如何利用shell或者awk二维数组实现9x9乘法表?
第一种:利用shell for循环来实现. for i in `seq 1 9`do for j in `seq 1 9` do if [ $i -ge $j ] then echo -en &quo ...
- 让vim更加智能化
从此,让我的vim更加的智能化,整整用了一个周日,基本是值得的: "新建.c\.cpp\.python\.sh等文件时,使用定义的函数SetTitle,自动插入文件头 func SetTit ...
- Spring框架各模块功能介绍
一. Spring是什么? Spring由Rod johnson开发: 是一个非常活跃的开源框架: 它帮助分离项目组件(对象)之间的依赖关系: 它的主要目的是简化企业开发 二. Spring的核心概念 ...
- Android 格式化分区命令
mkfs.vfat /dev/block/mmcblk0pxxxx 格式化某分区为vfat格式 busybox mkfs.vfat /dev/block/mmcblk0pxxx ...
- JV默认是如何处理异常
main函数收到这个问题时,有两种处理方式: a:自己将该问题处理,然后继续运行 b:自己没有针对的处理方式,只有交给调用main的jvm来处理 jvm有一个默认的异常处理机制,就将该异常进行处理. ...
- ISO/IEC 9899:2011 条款6.4.6——标点符号
6.4.6 标点符号 语法 1.以下之一 [ ] ( ) { } . -> ++ -- & * + - ...
- Quartz调度系统入门和调度高可用实现方案
** 版本:2.2.1 ** Hello world: https://www.jianshu.com/p/810400e6a274
- spark "main" java.lang.ArrayIndexOutOfBoundsException: 10582
升级 你的 paranamer 到2.8 ,这是由于你的jdk版本1.8导致 <!-- https://mvnrepository.com/artifact/com.thoughtworks.p ...
- 在过滤器中获取在web.xml配置的初始化参数
在过滤器中获取在web.xml配置的初始化参数 例如 <filter> <filter-name>cross-origin</filter-name> < ...
- Python的Asyncore异步Socket模块及实现端口转发的例子
Python的Asyncore异步Socket模块及实现端口转发的例子 Asyncore模块提供了以异步的方式写入套接字服务客户端和服务器的基础结构. 只有两种方式使一个程序在单处理器上实现" ...