• 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,又被删除,依次类推,便没有了数据。


  • 相关阅读:
    http
    Hive与HBase的区别与联系
    超好用python库(Pathlib)
    JS中every()和some()的用法
    kubectl create 和 kubectl apply区别
    Servlet/Tomcat/ Spring 之间的关系
    Android Fragment详解
    vue路由钩子拦截器beforeEach和afterEach及页面路由变化路由监听
    Vue + Webpack 将路由文件分拆为多个文件分别管理
    VUE中常用的几种import(模块、文件)引入方式
  • 原文地址:https://www.cnblogs.com/leeeee/p/7276443.html
Copyright © 2020-2023  润新知