zoukankan      html  css  js  c++  java
  • 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,又被删除,依次类推,便没有了数据。



  • 相关阅读:
    HDU 1058 Humble Numbers
    HDU 1160 FatMouse's Speed
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1003 Max Sum
    HDU 1297 Children’s Queue
    UVA1584环状序列 Circular Sequence
    UVA442 矩阵链乘 Matrix Chain Multiplication
    DjangoModels修改后出现You are trying to add a non-nullable field 'download' to book without a default; we can't do that (the database needs something to populate existing rows). Please select a fix:
    opencv做的简单播放器
    c++文件流输入输出
  • 原文地址:https://www.cnblogs.com/leeeee/p/7276442.html
Copyright © 2011-2022 走看看