http://blog.csdn.net/leshami/article/details/6931886
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,又被删除,依次类推,便没有了数据。