ORACLE 中 ROWID 与 rownum

一.ROWID 介绍

        ORACLE 中 ROWID 用于定位数据库中记录的一个相对唯一地址值。通常情况下,在该行数据插入到数据库表时就被确定且唯一。ROWID 并不实际存在于表中。简单来说 rowid 就是用于定位数据表中某条数据的唯一位置、也不会改变

rowid值主要包括下面信息:

        数据对象编号,数据文件编号,数据块编号,数据块中行编号

        通常情况下,同一表中所有字段都一样的多行记录使用where 删除数据是会误删所有条件匹配的数据

我们可以根据同一表中 rowid 唯一的规则,可以用来删除表中的重复数据:

删除一条重复数据

-- 查看表中的rowid 
select rowid,tmp .* from 表名 tmp ; 
-- 可根据查到的rowid 删除数据 
DELETE from 表名 WHERE in ('xxx');

删除表中所有重复数据

DELETE FROM 需要去重的表 t1 
WHERE rowid NOT IN ( 
SELECT max(rowid) 
FROM 需要去重的表 t2 
WHERE t1.id = t2.id )

根据一行数据的ROWID能找到一行数据的物理地址信息。从而快速地定位到数据行。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。

B-Tree索引

B-Tree索引的每个索引条目具有两个字段。第一个字段表示索引的键值,对于单列索引来说是一个值;而对于多列索引来说则是多个值组合在一起的。第二个字段表示键值所对应的记录行的ROWID。

索引查询逻辑 索引值→ROWID->将ROWID换算成物理地址->定位到具体数据

二.rownum 介绍

        rownum 表示查询某条记录在结果集中的位置,同一条记录查询条件不同对应的 rownum 是不同的

        当 WHERE ROWNUM = 2 会查不到任何数据 ,因为 ROWNUM 始终是为查询结果编号,并且始终以 1 开始;同理 WHERE ROWNUM > 1 也查不到任何数据;WHERE ROWNUM = 1 能够取到数据

类似以下动作:

表数据

动作

ROWNUM

条件

数据1

取一条数据

1

WHERE ROWNUM = 2

不匹配

取下一条

数据2

取一条数据

1

不匹配

取下一条

……

……

……

……

……

        对于有排序的分页,分段取数据的操作,只能用子查询来实现先排序,后rownum 取别名的方法实现

SELECT * FROM( 
SELECT rownum r , a FROM 需要查询的表 WHERE rownum <= 20 ORDER BY name ) 
WHERE r > 10 ;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值