Oracle中ROWNUM伪列和ROWID伪列的用法与区别

原创 2016年08月30日 17:05:45

做过Oracle分页的人都知道由于Oracle中没有像MySql中limit函数以及SQLServer中的top关键字等,所以只能通过伪列的方式去满足分页功能,在此,不谈分页方法,只从根本上去介绍这两个伪列的用法与原理,同样还是以scott用户的emp表为例;

一、ROWNUM伪列

ROWNUM伪列是Oracle首先进行查询获取到结果集之后在加上去的一个伪列,这个伪列对符合条件的结果添加一个从1开始的序列号,先看一个例子:

SELECT ROWNUM,empno,ename,job FROM emp WHERE deptno = 30;

结果如下:


可以看到确实添加了一列从1开始的序列号,那么有了这个伪列,就可以完成好多提取数据的工作,比如提取emp表中前5条数据,SQL如下:

SELECT ROWNUM,empno,ename,job FROM emp WHERE ROWNUM < 6;

ROWNUM是动态的,也就是必须先有查询到的结果集,然后再给这个结果集加上一个列,比如给结果集中的第一条数据的ROWNUM的值为1,依次类推,如果此时这样写:

SELECT ROWNUM,empno,ename,job FROM emp WHERE ROWNUM > 5 AND ROWNUM <= 10;
当生成结果集时,Oracle首先会产生一条ROWNUM为1的记录,显然不符合条件,那么同样会继续产生第二条数据,同样标识ROWNUM为1,该条记录同样继续被过滤掉,后续生成的ROWNUM依然为1,因此上述查询语句不会有任何查询结果,所以如果想要使上述结果有满足条件的结果集,必须使用子查询,代码如下:

SELECT * FROM (SELECT ROWNUM nums,emp.* FROM emp) WHERE nums > 5 AND nums <= 10;
子查询部分固定表里面数据的记录编号,外层查询过滤子查询里面固定的记录编号就可以实现Oracle分页!

二、ROWID伪列

同ROWNUM伪列不同的是,它是物理存在的,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官方文档!,在此不多做叙述!

相关文章推荐

Oracle的伪列

昨天做了一个Oracle PL/SQL 相关的测试,其中有一道这样的题目: 下列那些是Oracle的伪列(ACD)  A、ROWID   B、ROW_NUMBER()  C、LEV...
  • ziwen00
  • ziwen00
  • 2013年09月14日 09:42
  • 11288

Oracle几个常用的伪列(Pseudo-column)使用

Oracle的Pseudo-column,常被翻译成伪列,也有人翻译成虚拟字段。常常有我们的数据操作中带来一些意想不到的效果. 常用到的主要有 sysdate, systimestamp,RowN...

oracle伪列 rowid和rownum

转载:http://dbua.iteye.com/blog/971874 整理ROWID一 一,什么是伪列RowID? 1,首先是一种数据类型,唯一标识一条记录物理位置的一个id,基于64位编码...
  • lxzo123
  • lxzo123
  • 2011年09月28日 18:51
  • 2021

Rowid和Rownum的区别

 Rowid和Rownum对于数据库开发人员来说基本很少用到,因为在企业数据库开发中大多都是进行数据批处理,但是对于其他数据库人员来说还是会用到的。rowid和rownum都是虚列,但含义完全不同。r...
  • yzxz
  • yzxz
  • 2009年09月13日 07:43
  • 21149

oracle中rownum和rowid的区别

rownum和rowid都是伪列,但是两者的根本是不同的,rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownum不同,但是rowid是物理结构上的,在...

oracle中rowid的用法 (全面)

oracle中rowid的用法 分类: Oracle Fundamental 2013-10-25 14:52 34人阅读 评论(0) 收藏 举报 ROWID数据块DUMPBASE64编码 ...
  • haiross
  • haiross
  • 2013年11月11日 14:33
  • 49575

Oracle中的rownum,ROWID的 用法

1.ROWNUM的使用——TOP-N分析 使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM。 ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上...

MySql数据库 sql查询增加序号的伪列

在查询数据库的时候,我们有时候需要对查询出来的数据加上序列,1,2,3,……n 例如:我们根据表的某个字段排序后,要对这些数据加上序列,这个时候序号常常不是我们建表时设置好的自增的主键id,怎么办呢...
  • sam_jet
  • sam_jet
  • 2014年12月12日 14:01
  • 11036

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

plsql中Rowid的用法

ROWID的用法: ROWID是数据的详细地址,通过rowid,oralce可以快速的定位某行具体的数据的位置。 select a.*,rowid from 表名 a where 列名='...
  • stalin_
  • stalin_
  • 2017年06月27日 20:13
  • 682
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle中ROWNUM伪列和ROWID伪列的用法与区别
举报原因:
原因补充:

(最多只允许输入30个字)