您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

ROWID与ROWNUM的简介与对比

2026/2/8 6:37:07发布12次查看
关于rowid: 在用户向表中插入一行数据时,oracle会自动在这一行数据加上一个rowid,每行都有一个唯一rowid,oracle利用rowid定位数据行。rowid并不显式存储为一列的(伪列--不是存在表中的实际数据,可能是内部采用函数什么的根据行所在块的信息转换的),是
关于rowid:
在用户向表中插入一行数据时,oracle会自动在这一行数据加上一个rowid,每行都有一个唯一rowid,oracle利用rowid定位数据行。rowid并不显式存储为一列的值(伪列--不是存在表中的实际数据,可能是内部采用函数什么的根据行所在块的信息转换的),是访问一个表中行的最快机制。索引中存储的有索引行的值及索引行的rowid的值--实际数据。
oracle rowid分为物理rowid,逻辑rowid。
详见: 通过rowid得到数据块的相关信息
关于rownum:对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。
rownum的使用示例总结如下:使用=时,只有rownum=1有用,=其它数值将返回空集。
使用使用>和>=时,只有>=1时返回全表数据,其它只能返回空集。rownum对于大于某值的查询条件,使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录
小于与小于等于:
bys@ bys3>select * from dept where rownum deptno dname loc
---------- -------------- -------------
10 accounting new york
bys@ bys3>select * from dept where rownum deptno dname loc
---------- -------------- -------------
10 accounting new york
20 research dallas
大于与大于等于:
bys@ bys3>select * from dept where rownum>=1;
deptno dname loc
---------- -------------- -------------
10 accounting new york
20 research dallas
30 sales chicago
40 operations boston
bys@ bys3>select * from dept where rownum>1;
no rows selected
bys@ bys3>select * from dept where rownum>2;
no rows selected
bys@ bys3>select * from dept where rownum>=2;
no rows selected
等于:
bys@ bys3>select * from dept where rownum=1;
deptno dname loc
---------- -------------- -------------
10 accounting new york
bys@ bys3>select * from dept where rownum=2;
no rows selected
不等于:--条件不成立返回空集
bys@ bys3>select * from dept where rownum1;
no rows selected
#############
rownum与rowid在dml操作中的变化示例:系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。
rownum 表示查询某条记录在整个结果集中的位置,在查询的结果集中顺序分配的。
1.查询rowid与rowid中的行号、rownum
bys@ bys3>select rowid,dbms_rowid.rowid_row_number(rowid) rowid_num,rownum,dept.* from dept order by deptno desc;
rowid rowid_num rownum deptno dname loc
------------------ ---------- ---------- ---------- -------------- -------------
aaaft7aaeaaaaifaad 3 4 40 operations boston
aaaft7aaeaaaaifaac 2 3 30 sales chicago
aaaft7aaeaaaaifaab 1 2 20 research dallas
aaaft7aaeaaaaifaaa 0 1 10 accounting new york
以其中一行记录为例分析:
aaaft7aaeaaaaifaac 2 3 30 sales chicago
这一行的rowid是aaaft7aaeaaaaifaac ,按rowid的算法,可以得出数据块中第2行
但是此行的rownum是3,是在查询出的结果集中的排序。很直观的对比出rowid中一行数据在数据块中的第几行与rownum的号码不是同一事物。
2.删除一条数据
bys@ bys3>delete dept where deptno=30;
1 row deleted.
bys@ bys3>commit;
commit complete.
3.查询rowid与rowid中的行号、rownum。发现rowid与rowid中的行号已经删除,但是rownum被自动顺序分配了。
bys@ bys3>select rowid,dbms_rowid.rowid_row_number(rowid) rowid_num,rownum,dept.* from dept order by deptno desc;
rowid rowid_num rownum deptno dname loc
------------------ ---------- ---------- ---------- -------------- -------------
aaaft7aaeaaaaifaad 3 3 40 operations boston
aaaft7aaeaaaaifaab 1 2 20 research dallas
aaaft7aaeaaaaifaaa 0 1 10 accounting new york
4.插入一条数据
bys@ bys3>insert into dept values(99,'chedan','bj');
1 row created.
bys@ bys3>commit;
commit complete.
5.查询rowid与rowid中的行号、rownum。发现rowid与rowid中的行号自动向下分配而不是重用第3步中删除的行的rowid。rownum依然自动顺序分配
bys@ bys3>select rowid,dbms_rowid.rowid_row_number(rowid) rowid_num,rownum,dept.* from dept order by deptno desc;
rowid rowid_num rownum deptno dname loc
------------------ ---------- ---------- ---------- -------------- -------------
aaaft7aaeaaaaifaae 4 4 99 chedan bj
aaaft7aaeaaaaifaad 3 3 40 operations boston
aaaft7aaeaaaaifaab 1 2 20 research dallas
aaaft7aaeaaaaifaaa 0 1 10 accounting new york
关于不同的排序结果使用rownum,rownum显示会不会变化? 实验结果是不会改变的bys@ bys3>select rownum,dept.* from dept;
rownum deptno dname loc
---------- ---------- -------------- -------------
1 10 accounting new york
2 20 research dallas
3 40 operations boston
4 99 chedan bj
bys@ bys3>select rownum,dept.* from dept order by loc;
rownum deptno dname loc
---------- ---------- -------------- -------------
3 40 operations boston
2 20 research dallas
1 10 accounting new york
4 99 chedan bj
查表中最后一行记录的方法:bys@ bys3>select * from dept where rowid in(select max(rowid) from dept);
deptno dname loc
---------- -------------- -------------
40 operations boston
bys@ bys3>select * from dept where rownum deptno dname loc
---------- -------------- -------------
40 operations boston
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product