Oracle中ROWNUM伪列和ROWID伪列的用法与区别
做过Oracle分页的人都知道由于Oracle中没有像MySql中limit函数以及SQLServer中的top关键字等,所以只能通过伪列的方式去满足分页功能,
在此,不谈分页方法,只从根本上去介绍这两个伪列的用法与原理,同样还是以scott用户的emp表为例;
一、ROWNUM伪列
ROWNUM 是Oracle进行查询获取到结果集之后,再加上去的一个伪列(获取一条记录加一个rownum),这个伪列对符合条件的结果添加一个从1开始的序列号,先看一个例子:
select rownum,empno,ename,job FROM EMP WHERE ROWNUM < 8;
结果如下:
ROWNUM是动态的,也就是必须先有查询到的结果集,然后再给这个结果集加上一个列。 例如:第一条记录的ROWNUM的值为1 ,第二条是2,以此类推。 如果此时这样写:
SELECT ENAME,ROWNUM FROM EMP WHERE ROWNUM > 5 AND ROWNUM <= 10; --查询结果为空集
当生成结果集时,Oracle首先会产生一条ROWNUM为1的记录,显然不符合条件,那么同样会继续产生第二条记录,同样标识ROWNUM为1,该条记录同样继续被过滤掉,后续生成的ROWNUM依然为1,因此上述查询语句不会有任何查询结果, 导致最后sql产生的结果集时空集。 所以如果想要使上述结果有满足条件的结果集,必须使用子查询,代码如下:
SELECT * FROM (SELECT ROWNUM rn, a.* FROM emp a) a WHERE a.rn > 5 AND a.rn <= 10;
如果需要查询到结果,需要使用子查询:
SELECT rownum,a.* FROM
(SELECT ROWNUM rn,a.* FROM EMPLOYEES a WHERE rownum <= 20) a
WHERE a.rn > 5 ;
--注意: 1.rownum只能用< 或者<=
2. <或者<=经常放在子查询里面
二、ROWID伪列
同ROWNUM伪列不同的是,ROWID是物理存在的,是实际存在的一个列,ROWID是一种数据类型,它使用基于64位编码的18个字符来唯一标识一条记录物理位置的一个ID,类似于Java中一个对象的哈希码,都是为了唯一标识对应对象的物理位置,需要注意的是ROWID虽然可以在表中进行查询,但是其值并未存储在表中,所以不支持增删改操作,下面看个例子:
SELECT ROWNUM,ROWID,empno,ename,job FROM emp WHERE ROWNUM <= 5;

可以看到ROWID确实由18个字符组成,组成结构如下:
| 数据对象编号 | 文件编号 | 块编号 | 行编号 |
| OOOOOO | FFF | BBBBBB | RRR |
至于ROWID的作用,由于ROWID用来唯一标识表中数据的唯一性,所以可以利用这个特性去除重复,举个例子,首先运行下述两行代码:
CREATE TABLE dept_bak AS SELECT * FROM dept; INSERT INTO dept_bak SELECT * FROM dept;
得到一个如下的数据库表

很明显,数据有重复的,但是ROWID肯定不会重复的,那么就可以利用这个特性去重,简单示例代码如下:
DELETE FROM dept_bak WHERE ROWID NOT IN( SELECT MIN(ROWID) FROM dept_bak GROUP BY DEPTNO);
Oracle中ROWNUM伪列和ROWID伪列的用法与区别的更多相关文章
- oracle中rownum和rowid的区别
rownum和rowid的区别总括: rownum和rowid都是伪列,但是两者的根本是不同的. rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownu ...
- Oracle中rownum和rowid的理解
rownum,rowid都叫伪列. 但是,rownum是逻辑上的编号,且其值总是从1开始,每行的rounum不是固定的.而rowid是“物理”编号.若数据库文件没有移动,则每行的 rowid一般是固定 ...
- oracle中rownum和rowid的区别【转】
rownum和rowid的区别总括: rownum和rowid都是伪列,但是两者的根本是不同的. rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownu ...
- ORACLE 中ROWNUM用法总结(转)
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- ORACLE 中ROWNUM用法总结!
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- Oracle中rownum的基本用法
Oracle中rownum的基本用法 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且r ...
- ORACLE 中ROWNUM
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- 转:ORACLE 中ROWNUM用法总结!
oracle 分页查询语句:select * from (select u.*,rownum r from (select * from userifno) u where rownum<大值) ...
- oracle中rownum和row_number()
row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内 ...
- Oracle中rownum用法警示
今天调试代码,发现分页查询时使用Oracle中rownum的between......and用法的bug,特此总结: 参考资料:http://blog.csdn.net/lg312200538/art ...
随机推荐
- PATB 1028. 人口普查(20)
1028. 人口普查(20) 注意特判合理人数为0,否则格式错误.很暴力的sort排序找出最大最小. 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Stan ...
- CDH 5.15.2 离线安装
一.前置准备 1. 基础信息 1.1 机器 机器名 服务 hadoop1 主节点 hadoop2 data.task hadoop3 data.task 1.2 服务版本 服务 版本 cdh 5.15 ...
- Windows使用Python统一设置解析器路径
碰到的问题: .py文件放在cgi-bin文件夹下面,这个.py文件都要设置"#!python.exe路径"来告诉CGI如何找解析器解析这个.py的文件,我是想知道这个路径可否统一 ...
- django基础知识之HTML转义:
HTML转义 Django对字符串进行自动HTML转义,如在模板中输出如下值: 视图代码: def index(request): return render(request, 'temtest/in ...
- 对http请求进行过滤处理,转换成接收着需要的格式
需要在Global.asax的Application中进行初始化处理 这样:GlobalConfiguration.Configuration.MessageHandlers.Add(new Defa ...
- Bzoj 3124: [Sdoi2013]直径 题解
3124: [Sdoi2013]直径 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1222 Solved: 580[Submit][Status] ...
- [NOIP2003] 传染病控制题解
问题 F: [NOIP2003] 传染病控制 时间限制: 1 Sec 内存限制: 128 MB 题目描述 [问题背景] 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范 ...
- android surfaView surfaHolder video 播放
主文件 package cn.com.sxp;import android.app.Activity;import android.media.AudioManager;import android. ...
- 缓存实践Cache Aside Pattern
Cache Aside Pattern旁路缓存,是对缓存应用的一个总结,包括读数据方案和写数据方案. 读数据方案 先读cache,如果命中则返回 如果miss则读db 将db的数据存入缓存 写数据方案 ...
- golang http json http://www.alexedwards.net/blog/golang-response-snippets
http://www.alexedwards.net/blog/golang-response-snippets https://gist.github.com/andreagrandi/97263a ...