Oracle数据库——ROWNUM

前言

  刚学到了ROWNUM的用法,网上一搜,结果发现了有很多帖子,写的都很全。本着好记性不如烂笔头的原则,我还是决定自己手打一遍,当然下面也附上了我参考的链接。你可以尽情学习。

参考博客

一叶笑天的博客

IT·达人的博客

Cadence_D的博客

正题

  这里以SCOTT用户已经创建好了的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)

  EMP表有8列,这里只选取其中的三列(EMPNO,ENAME,SAL)分别是(编号,姓名,工资)来说明,按照工资降序查询结果如下【结果2】:

SQL> SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL DESC;

     EMPNO ENAME             SAL
---------- ---------- ----------
7839 KING 5000
7902 FORD 3000
7788 SCOTT 3000
7566 JONES 2975
7698 BLAKE 2850
7782 CLARK 2450
7499 ALLEN 1600
7844 TURNER 1500
7934 MILLER 1300
7521 WARD 1250
7654 MARTIN 1250
7876 ADAMS 1100
7900 JAMES 950
7369 SMITH 800 已选择14行。
1、 查询工资最高的员工

  嵌套查询,内层SELECT语句将EMP表按照工资的降序排序,外层SELECT语句从排序的表中取出第一条记录。查询语句如下,【代码3】:

SELECT *
FROM (
SELECT EMPNO,ENAME,SAL
FROM EMP
ORDER BY SAL DESC
)
WHERE ROWNUM=1;

  查询结果如下,【结果3】:

SQL> SELECT *
2 FROM (
3 SELECT EMPNO,ENAME,SAL
4 FROM EMP
5 ORDER BY SAL DESC
6 )
7 WHERE ROWNUM=1; EMPNO ENAME SAL
---------- ---------- ----------
7839 KING 5000
2、查询工资排名第5名的员工(降序)

  使用3层嵌套查询。第1层(最里层)SELECT语句将EMP表按照工资降序排序,第2层(中间层)将排序好的表重新生成伪列,并增加ROWNUM伪列,别名为NO,第3层(最外层)取出生成伪列后的表的第5条记录即为所查询的人。【代码4】:

SELECT EMPNO,ENAME,SAL
FROM (
SELECT ROWNUM NO,EMPNO,ENAME,SAL
FROM (
SELECT EMPNO,ENAME,SAL
FROM EMP
ORDER BY SAL DESC
)
)
WHERE NO=5;

  查询结果如下,【结果4】:

SQL> SELECT EMPNO,ENAME,SAL
2 FROM (
3 SELECT ROWNUM NO,EMPNO,ENAME,SAL
4 FROM (
5 SELECT EMPNO,ENAME,SAL
6 FROM EMP
7 ORDER BY SAL DESC
8 )
9 )
10 WHERE NO=5; EMPNO ENAME SAL
---------- ---------- ----------
7698 BLAKE 2850
3、查询工资最高的前5名员工

  第1层SELECT语句将EMP表按照工资降序排序,第2层语句从排好序的表中取出前面5行记录。【代码5】:

SELECT *
FROM (
SELECT EMPNO,ENAME,SAL
FROM EMP
ORDER BY SAL DESC
)
WHERE ROWNUM<6;

  查询结果如下,【结果5】:

SQL> SELECT *
2 FROM (
3 SELECT EMPNO,ENAME,SAL
4 FROM EMP
5 ORDER BY SAL DESC
6 )
7 WHERE ROWNUM<6; EMPNO ENAME SAL
---------- ---------- ----------
7839 KING 5000
7788 SCOTT 3000
7902 FORD 3000
7566 JONES 2975
7698 BLAKE 2850
4、查询工资最高的第5至9名员工

  第1层SELECT语句将EMP表按照工资降序排序,第2层取出排序好的前9行记录,第3层取出这9行记录中的后面5行记录即为查询结果。【代码6】:

SELECT EMPNO,ENAME,SAL
FROM (
SELECT ROWNUM NO,EMPNO,ENAME,SAL
FROM (
SELECT EMPNO,ENAME,SAL
FROM EMP
ORDER BY SAL DESC
)
WHERE ROWNUM<10
)
WHERE NO>4;

  查询结果如下,【结果6】:

SQL> SELECT EMPNO,ENAME,SAL
2 FROM (
3 SELECT ROWNUM NO,EMPNO,ENAME,SAL
4 FROM (
5 SELECT EMPNO,ENAME,SAL
6 FROM EMP
7 ORDER BY SAL DESC
8 )
9 WHERE ROWNUM<10
10 )
11 WHERE NO>4; EMPNO ENAME SAL
---------- ---------- ----------
7698 BLAKE 2850
7782 CLARK 2450
7499 ALLEN 1600
7844 TURNER 1500
7934 MILLER 1300

  看完上面的4道例题,不知道各位有没有看出点端倪来。如果没有继续看下面的例题

5、查询工资最高的第2名员工

  同第2题。【代码7】:

SELECT EMPNO,ENAME,SAL
FROM (
SELECT ROWNUM NO,EMPNO,ENAME,SAL
FROM (
SELECT EMPNO,ENAME,SAL
FROM EMP
ORDER BY SAL DESC
)
)
WHERE NO=2;

  查询结果如下,【结果7】:

SQL> SELECT EMPNO,ENAME,SAL
2 FROM (
3 SELECT ROWNUM NO,EMPNO,ENAME,SAL
4 FROM (
5 SELECT EMPNO,ENAME,SAL
6 FROM EMP
7 ORDER BY SAL DESC
8 )
9 )
10 WHERE NO=2; EMPNO ENAME SAL
---------- ---------- ----------
7902 FORD 3000

  OK,你确定是这1条记录吗?其实有2名员工的工资都是3000,(见代码2),那这里查询工资最高的第2名到底应该是谁呢?这就不属于本博客(ROWNUM专题)讨论的范围了,因此下面仅仅提供代码和简单说明,更多内容见参考博客

  RANK()函数将值相同的记录返回相同的编号,但是相同编号的记录依然占据着初始的序号。当你查询工资最高的第3名时(见代码9),提示未选定行,而不是这一条记录 7566 JONES 2975。【代码8】:

SELECT EMPNO,ENAME,SAL
FROM (
SELECT
RANK() OVER(ORDER BY SAL DESC) NO,
EMPNO,ENAME,SAL
FROM EMP
)
WHERE NO=2;

  查询结果如下,【结果8】:

SQL> SELECT EMPNO,ENAME,SAL
2 FROM (
3 SELECT
4 RANK() OVER(ORDER BY SAL DESC) NO,
5 EMPNO,ENAME,SAL
6 FROM EMP
7 )
8 WHERE NO=2; EMPNO ENAME SAL
---------- ---------- ----------
7788 SCOTT 3000
7902 FORD 3000
6、查询工资最高的第3名员工

  查询工资排名第3名的员工,【代码9】:

SELECT EMPNO,ENAME,SAL
FROM (
SELECT
RANK() OVER(ORDER BY SAL DESC) NO,
EMPNO,ENAME,SAL
FROM EMP
)
WHERE NO=3;

  查询结果如下,【结果9】:

SQL> SELECT EMPNO,ENAME,SAL
2 FROM (
3 SELECT
4 RANK() OVER(ORDER BY SAL DESC) NO,
5 EMPNO,ENAME,SAL
6 FROM EMP
7 )
8 WHERE NO=3; 未选定行

  RANK()DENSE_RANK()的其他参考:RANK()和DENSE_RANK()

重点

  ROWNUM是伪列,总是先有结果集才有ROWNUM的,因此它总是从1开始,如果你查询大于1的,它总是将条件置为FALSE,所以永远都查不到大于1的行,要想查询后面的行,必须要用嵌套查询,先进行一个排序,或者用别名。ROWNUM主要用于分页查询时使用。

最后

  以上是一个简单小结,想深入了解的可以去看看我附的别人的博客链接,个人认为他们写的挺好的。跳转到参考博客


  更新时间:2019年5月8日22:39:26

Oracle数据库——ROWNUM的更多相关文章

  1. Oracle数据库rownum用法集锦

    Oracle中rownum可以用来限制查询 具体用法: 1.返回查询集合中的第1行 select * from tableName where rownum = 1 2.返回查询集合中的第2行 错误示 ...

  2. oracle数据库rownum讲解(转)

    https://blog.csdn.net/qq_40794266/article/details/78698321

  3. oracle数据库之rownum和rowid用法

    Rownum 和 Rowid是Oracle数据库所特有的,通过他们可以查询到指定行数范围内的数据记录.   以下通过例子讲解: -- 为了方便,首先,查找dept表中的所有. select deptn ...

  4. 各种数据库分页语句整理以及Oracle数据库中的ROWNUM和ORDER BY的区别

    .oracle数据库分页 select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=s ...

  5. 关于Oracle数据库的rownum应用

    它是Oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,以此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀. 如以下语句将无法 ...

  6. 解析oracle的rownum,数据库查询结果返回行数设置

    对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀 ...

  7. Oracle 数据库语句大全

    Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...

  8. [转] JAVA读取excel数据(插入oracle数据库)

    原文地址:http://blog.csdn.net/zczzsq/article/details/16803349 本实例做的是读取execl(只能读取.xls的execl,即只能读取03版的),如果 ...

  9. Oracle数据库基础知识

    oracle数据库plsql developer   目录(?)[-] 一     SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外 ...

随机推荐

  1. Tkinter 之Button标签

    一.参数说明 语法 作用 Button(root,text='xxxx') 按钮图标显示内容 Button(root,text='xxxx',height=2) 组件的高度(所占行数) Button( ...

  2. vue-qr生成下载二维码

    安装vue-qr npm install vue-qr --save 生成二维码实列 <vue-qr ref="Qrcode" :text="qrCodeConfi ...

  3. 2018-2019-2 网络对抗技术 20165231 Exp 8 Web基础

    实验内容 (1).Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. (2).Web前端javascipt(0 ...

  4. Java同步数据结构之ConcurrentSkipListMap/ConcurrentSkipListSet

    引言 上一篇Java同步数据结构之Map概述及ConcurrentSkipListMap原理已经将ConcurrentSkipListMap的原理大致搞清楚了,它是一种有序的能够实现高效插入,删除,更 ...

  5. 【分类算法】朴素贝叶斯(Naive Bayes)

    0 - 算法 给定如下数据集 $$T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\},$$ 假设$X$有$J$维特征,且各维特征是独立分布的,$Y$有$K$种取值.则 ...

  6. Qt编写控件属性设计器5-属性中文

    一.前言 在上一篇文章中就提到过,使用qtpropertybrowser来加载属性,对应加载到的属性是英文的,也就是控件类中Q_PROPERTY描述的变量名称,如何变成中文或者其他语言显示呢?这个就需 ...

  7. mysql 对应数据库服务器配置 所能承受的tps和qps

    总结: 吞吐量实际涵盖了TPS 和 QPS TPS 是指产生事物的请求,比如对数据库 增.删.改 QTP 是对数据库查询动作,无逻辑非事物,比如 查询 假如脚本里面都是get请求,那么出来的吞吐量就是 ...

  8. java通过telnet远程至windows机器执行dos命令

    准备工作,远程windows机器中开启telnet服务,将远程登录用户添加至telnetClients用户组 核心代码: import java.io.IOException; import java ...

  9. SM30维护视图屏蔽按钮

    标准维护视图  GUI状态  ESLG 编辑按钮 AEND 达到效果 DATA: l_act TYPE char1, l_name TYPE dd02v-tabname. DATA: lt_vimex ...

  10. djando模板----第一django模板应用

    Django模板 我们已经知道,模板函数的函数的返回值就是返回给客户端的数据,但如果返回数据很复杂,如果一个非常大的html页面,直接将页面代码固化在python脚本文件中是不合适的,当然 也可以将h ...