oracle伪列用什么访问,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;

结果如下:

img?u=aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTIyMjE0My8yMDE4MTAvMTIyMjE0My0yMDE4MTAyOTE0MjgwMjQ4Ny0xMTQ3MzA5ODUzLnBuZw==

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) aWHERE 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;

img?u=aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTIyMjE0My8yMDE4MTAvMTIyMjE0My0yMDE4MTAyOTE0MzAyMjk1MC0xMjkyNTg1NzE5LnBuZw==

可以看到ROWID确实由18个字符组成,组成结构如下:

数据对象编号

文件编号

块编号

行编号

OOOOOO

FFF

BBBBBB

RRR

至于ROWID的作用,由于ROWID用来唯一标识表中数据的唯一性,所以可以利用这个特性去除重复,举个例子,首先运行下述两行代码:

CREATE TABLE dept_bak AS SELECT * FROMdept;INSERT INTO dept_bak SELECT * FROM dept;

得到一个如下的数据库表

img?u=aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTIyMjE0My8yMDE4MTAvMTIyMjE0My0yMDE4MTAyOTE0MzQ0NDAyNy0xMDEwMDA5MDY2LnBuZw==

很明显,数据有重复的,但是ROWID肯定不会重复的,那么就可以利用这个特性去重,简单示例代码如下:

DELETE FROM dept_bak WHERE ROWID NOT IN( SELECT MIN(ROWID) FROM dept_bak GROUP BY DEPTNO);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值