Oracle rownum、rowid 详解

文章目录

1 概述

1. 异同点
   (1) 相同点:都是 '伪列' -- Oracle 自动加上去的,无法人为操作
   (2) 不同点:rowid  记录的物理地址,相对不变,
   	          rownum 记录的编号,会变化,尤其是使用 order by 的时候
2. rownum:某条记录的编号   -- row num = 行编号
   (1) "编号总是从 1 开始"select 时返回的行的编号,第一行分配 1,第二行分配 2,以此类推
   (2) "rownum >= 2 无数据返回":编号有 1 才有 2,必须从 1 开始
   (3) "编号是变化的"          :如:存在 order by(4) "rowid 访问是最快的" -- 比索引更快!   
3. rowid: 某条记录的物理地址 -- row id = 行标识
   (1) "标识相对不变"insert 时就已经确定,一般不变,除非 "行移动 row movement" 
   (2) "基于 64 位编码的 18 个字符显示":对象号(6+  文件号(3+ 块号(6+ 行号(3(3) 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
       对象号	AAAR3s	17*64^2 + 55*64^1 + 44 = 73196
       文件号	AAE		4
       块号		AAAACX  2*64^1 + 23 = 151 
       行号		AAA		0

 
 

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)

sql 语句执行顺序:
1. from -- 首位,sql入口
2. on
3. join
4. where
5. group by
6. having 
7. select
8. distinct
9. order by

 
 

2.2 rowid

select rowid,
       dbms_rowid.rowid_object(rowid) object_id, -- 数据对象id
       dbms_rowid.rowid_relative_fno(rowid) relative_fno, -- 相对文件id
       dbms_rowid.rowid_block_number(rowid) block_number, -- 数据块id
       dbms_rowid.rowid_row_number(rowid) row_number -- 行id
  from scott.emp;

 
 

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

解释说明:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值