Oracle 的ROWID 和 ROWNUM

http://blog.csdn.net/leshami/article/details/6931886


1、ROWID 

ROWID 用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。而对于聚簇表,由于聚簇特性,不同表上的记录由于存储在相同的簇上,因此会拥有相同的ROWID。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。

 

  1. SQL> select rowid,dept.* from dept ;      -->查看表dept中所有记录的rowid                                             
  2.                                                                                                                      
  3. ROWID                  DEPTNO DNAME          LOC                                                                     
  4. ------------------ ---------- -------------- -------------                                                           
  5. AAAO0fAAFAAAAlmAAA         10 ACCOUNTING     NEW YORK                                                                
  6. AAAO0fAAFAAAAlmAAB         20 RESEARCH       DALLAS                                                                  
  7. AAAO0fAAFAAAAlmAAC         30 SALES          CHICAGO                                                                 
  8. AAAO0fAAFAAAAlmAAD         40 OPERATIONS     BOSTON                                                                  

 

  1. SQL> set autotrace on;                                                                                            
  2. SQL> select * from dept where rowid='AAAO0fAAFAAAAlmAAC';  -->使用rowid访问数据                                 
  3.                                                                                                                   
  4.     DEPTNO DNAME          LOC                                                                                     
  5. ---------- -------------- -------------                                                                           
  6.         30 SALES          CHICAGO                                                                                 
  7.                                                                                                                   
  8. Execution Plan                                                                                                    
  9. --------------------------------------------    -->执行计划中为TABLE ACCESS BY USER ROWID访问方式          
  10. Plan hash value: 3453257278                                                                                       
  11.                                                                                                                   
  12. --------------------------------------------------------------------------------                              
  13. | Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |                               
  14. ---------------------------------------------------------------------------------                               
  15. |   0 | SELECT STATEMENT           |      |     1 |    20 |     1   (0)| 00:00:01 |                               
  16. |   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,又被删除,依次类推,便没有了数据。

 


 

posted @ 2014-09-19 21:23  lihui1625  阅读(149)  评论(0编辑  收藏  举报