oracle的rownum和rowid区别
来源:互联网 发布:济南淘宝纸盒 编辑:程序博客网 时间:2024/05/22 17:10
做过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,因此上述查询语句不会有任何查询结果,所以如果想要使上述结果有满足条件的结果集,必须使用子查询,代码如下:
[html] view plain copy
SELECT * FROM (SELECT ROWNUM nums,emp.* FROM emp) WHERE nums > 5 AND nums <= 10; --使用了伪列nums
子查询部分固定表里面数据的记录编号,外层查询过滤子查询里面固定的记录编号就可以实现Oracle分页!
二、ROWID伪列
同ROWNUM伪列不同的是,它是物理存在的,ROWID是一种数据类型,它使用基于64位编码的18个字符来唯一标识一条记录物理位置的一个ID,类似于Java中一个对象的哈希码,都是为了唯一标识对应对象的物理位置,需要注意的是ROWID虽然可以在表中进行查询,但是其值并未存储在表中,所以不支持增删改操作,下面看个例子:
[html] view plain copy
SELECT ROWNUM,ROWID,empno,ename,job FROM emp WHERE ROWNUM <= 5;
结果如下:
可以看到ROWID确实由18个字符组成,组成结构如下:
数据对象编号
文件编号
块编号
行编号
OOOOOO
FFF
BBBBBB
RRR
至于ROWID的作用,由于ROWID用来唯一标识表中数据的唯一性,所以可以利用这个特性去除重复,举个例子,首先运行下述两行代码:
[html] view plain copy
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官方文档!,在此不多做叙述!
rowid是数据库的一个伪列,建立表的时候数据库会自动为每个表建立ROWID列
伪列如同数据表的列,但它实际上不存储在表中,你可以从这些伪列中提取值,但你不能将值插入、更新或者删除它们 。
用来唯一标识一行记录。 rowid是存储每条记录的实际物理地址,对记录的访问是基于ROWID。 对数据库中记录行的检索方式就是使用rowid来进行查找。
- Oracle查询 rownum和rowid的区别
- oracle中rownum和rowid的区别
- oracle中rowid和rownum的区别
- oracle中rownum和rowid的区别 .
- oracle中rowid和rownum的区别
- oracle中rownum和rowid的区别
- oracle中rownum和rowid的区别
- oracle中rownum和rowid的区别
- oracle中rownum和rowid的区别
- oracle中rownum和rowid的区别
- oracle中rownum和rowid的区别
- oracle的rownum和rowid区别
- Oracle的rownum和rowid
- oracle的rowid和rownum
- Oracle 的ROWID 和 ROWNUM
- rowid 和 rownum 的区别
- Rowid和Rownum的区别
- Rowid和Rownum的区别
- C++友元函数和友元类
- QT 嵌入exe应用程序 并获取鼠标事件 mouse keyboard event
- Axure RP 8最新激活码
- js中基本类型操作-----数组基本操作、字符串操作、json操作
- 数据库_1
- oracle的rownum和rowid区别
- 压力测试工具JMeter入门教程
- QSettings读写注册表、配置文件
- HTTP第一篇【HTTP基础概念、与HTTP相关的协议】
- 第三周项目一(1)
- [工具设置]Git常用命令大全,迅速提升你的Git水平
- builtwith在python3 中的修改过程
- 解读The Python Tutorial(六)
- ExoPlayer里里外外之:流媒体播放与数据结构