Oracle rownum、rowid 详解

1 概述

伪列
rownum:记录的编号
会变化,如:使用 order by 时
rowid:记录的物理地址
不变化,除非 row movement
编号有 1 才有 2。rownum >=2 无数据返回
基于 64 位编码的 18 个字符显示

2 详解

2.1 rownum

select t.empno, 
       t.ename, 
       t.hiredate, 
       rownum 
  from scott.emp t;

select t.empno, 
       t.ename, 
       t.hiredate, 
       rownum 
  from scott.emp t 
 order by t.hiredate;

查询截图:(rownum 不一定是连续的哦)
在这里插入图片描述

原因:sql 语句执行顺序:先 select 后 order by
解决:再嵌套查询一次,如:select rownum from (上述)
扩展:Oracle sql 语句执行顺序【面试题】

2.2 rowid

select rowid, -- base 64位 编码,18 个字符显示
       -- 数据对象: dba_objects.object_id
       dbms_rowid.rowid_object(rowid) object_id,
       -- 相对文件: dba_data_files.relative_fno
       dbms_rowid.rowid_relative_fno(rowid) relative_fno,
       -- 数据块: dba_extents.(block_id + blocks - 1)
       dbms_rowid.rowid_block_number(rowid) block_number, 
       -- 行: dba_tab_columns.column_id 
       dbms_rowid.rowid_row_number(rowid) row_number
  from scott.emp;

查询截图:
在这里插入图片描述

解释说明:

base 64 编码
A-Z	0-25
a-z	26-51
0-9	52-61
+/	62-63

计算公式:d*(b^p)
d: 字符对应的十进制编码值
b: 64
p: 从右至左,每个对象从 0 开始计数


AAAR3sAAEAAAACXAAA
数据对象id(6位):AAAR3s
   0*64^5 + 0*64^4 + 0*64^3 + 17*64^2 + 54*64^1 + 44*64^0 = 73196
   
文件id(3位):AAE
   0*64^2 + 0*64^1 + 4*64^0 = 4

块id(6位):AAAACX
   2*64^1 + 23 = 151 
  
行id(3位):AAA = 0

base 64 码表:

索引字符索引字符索引字符索引字符
0A26a52162+
1B27b53263/
2C28c543
3D29d554
4E30e565
5F31f576
6G32g587
7H33h598
8I34i609
9J35j
10K36k
11L37l
12M38m
13N39n
14O40o
15P41p
16Q42q
17R43r
18S44s
19T45t
20U46u
21V47v
22W48w
23X49x
24Y50y
25Z51z

3 扩展

3.1 Oracle 分页查询详解(rownum 实现)

3.2 Oracle 高效删除重复数据(rowid)

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼丸丶粗面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值