Oracle 的ROWID 和 ROWNUM
2014-09-19 21:23
309 查看
/article/1444743.html
1、ROWID
ROWID 用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。而对于聚簇表,由于聚簇特性,不同表上的记录由于存储在相同的簇上,因此会拥有相同的ROWID。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。
SQL> select rowid,dept.* from dept ; -->查看表dept中所有记录的rowid
ROWID DEPTNO DNAME LOC
------------------ ---------- -------------- -------------
AAAO0fAAFAAAAlmAAA 10 ACCOUNTING NEW YORK
AAAO0fAAFAAAAlmAAB 20 RESEARCH DALLAS
AAAO0fAAFAAAAlmAAC 30 SALES CHICAGO
AAAO0fAAFAAAAlmAAD 40 OPERATIONS BOSTON
SQL> set autotrace on;
SQL> select * from dept where rowid='AAAO0fAAFAAAAlmAAC'; -->使用rowid访问数据
DEPTNO DNAME LOC
---------- -------------- -------------
30 SALES CHICAGO
Execution Plan
--------------------------------------------
-->执行计划中为TABLE ACCESS BY USER ROWID访问方式
Plan hash value: 3453257278
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 20 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY USER ROWID| DEPT | 1 | 20 | 1 (0)| 00:00:01 |
2、ROWNUM
select
rownum, name from student where rownum=1; 获得第1条记录
select
rownum, name from student where rownum =2; 结果永远为空
select
rownum, name from student where rownum <=10; 取得前10条记录
select
rownum, name from student where rownum >10; 结果永远为空
select
* from(select rownum no, name from student) where no>10;
取得第10条以后的记录
select
* from (select rownum no,
name from student where rownum<=20 ) where no >=10; 取得第10到20条记录
ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。所以您没办法期望得到下面的结果集:
11 aaaaaaaa
12 bbbbbbb
13 ccccccc
.................
rownum >10 没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。或者可以这样理解:
ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。
1、ROWID
ROWID 用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。而对于聚簇表,由于聚簇特性,不同表上的记录由于存储在相同的簇上,因此会拥有相同的ROWID。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。
SQL> select rowid,dept.* from dept ; -->查看表dept中所有记录的rowid
ROWID DEPTNO DNAME LOC
------------------ ---------- -------------- -------------
AAAO0fAAFAAAAlmAAA 10 ACCOUNTING NEW YORK
AAAO0fAAFAAAAlmAAB 20 RESEARCH DALLAS
AAAO0fAAFAAAAlmAAC 30 SALES CHICAGO
AAAO0fAAFAAAAlmAAD 40 OPERATIONS BOSTON
SQL> set autotrace on;
SQL> select * from dept where rowid='AAAO0fAAFAAAAlmAAC'; -->使用rowid访问数据
DEPTNO DNAME LOC
---------- -------------- -------------
30 SALES CHICAGO
Execution Plan
--------------------------------------------
-->执行计划中为TABLE ACCESS BY USER ROWID访问方式
Plan hash value: 3453257278
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 20 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY USER ROWID| DEPT | 1 | 20 | 1 (0)| 00:00:01 |
2、ROWNUM
select
rownum, name from student where rownum=1; 获得第1条记录
select
rownum, name from student where rownum =2; 结果永远为空
select
rownum, name from student where rownum <=10; 取得前10条记录
select
rownum, name from student where rownum >10; 结果永远为空
select
* from(select rownum no, name from student) where no>10;
取得第10条以后的记录
select
* from (select rownum no,
name from student where rownum<=20 ) where no >=10; 取得第10到20条记录
ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。所以您没办法期望得到下面的结果集:
11 aaaaaaaa
12 bbbbbbb
13 ccccccc
.................
rownum >10 没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。或者可以这样理解:
ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。
相关文章推荐
- Oracle中的rownum、rowid
- Oracle基本操作六:子查询,rownum,rowid
- oracle伪列 rowid和rownum
- oracle中rownum和rowid的区别
- Oracle中查询rownum和rowid的区别【转】
- oracle_SQL中ROWID与ROWNUM的使用
- oracle_SQL中ROWID与ROWNUM的使用
- rownum,rowid,row_number()及oracle分页查询.
- Oracle:rowid、rownum(伪列)
- Oracle和SQL中ROWID与ROWNUM的使用
- oracle_SQL中ROWID与ROWNUM的使用
- oracle中 rownum与rowid的理
- Oracle中的rownum和rowid
- oracle库中的rowid和rownum
- oracle之ROWNUM的用法(分页)以及ROWID的用法
- oracle中rownum和rowid的区别
- Oracle中rowid和rownum区别
- Oracle rownum和rowid
- oracle伪列 rowid和rownum
- [转]oracle伪列 rowid和rownum