一條sql語句引發的遐想:select t.*, t.rowid from STUDENT t


       在學習oracle 過程當中,當在看tables時,比如STUDENT,右擊——查看——查詢,會自動有這樣的一條查詢語句:

select t.*, t.rowid from STUDENT_TJB t

       其中,作為一個sql小白,我想問的就是rowid是什么用法,還有t.*定位的什么表還是用戶呢?

       經過查詢資料,獲得了幾個重要的知識點:

 一、 ROWID(行ID)

      ROWID也是一種數據類型,但是這種數據類型是Oracle 服務器使用並管理的。它具有以下幾個特性:

  •  ROWID是數據庫每一行的唯一標識符。
  •  ROWID作為列值是隱式存儲的。
  •  ROWID不直接給出行的物理地址,但是可以用ROWID來定位行。
  •  ROWID提供了最快速地訪問表中行的方法。

查詢以下STUDENT表中的ROWID: select rowid from STUDENT; 結果如下:

 

      可以看出, Oracle的物理擴展ROWID有18位。

      ROWID的每位采用64位編碼,分別用A~Z、a~z、0~9、+、/共64個字符表示。其中,A表示0,B表示1,……Z表示25,

a表示26,……z表示51,0表示52,……,9表示61,+表示62,/表示63。

       例如,

create table test_rowid (id number, row_id rowid); --1.創建一臨時表 
insert into test_rowid values(1,null); --2.插入一行記錄 
update test_rowid set row_id = rowid where id = 1; --修改剛插入的記錄 
select rowid,row_id from test_rowid; --4.查看rowid 

     返回結果為:
  

                  rowid                                 row_id 
            AAAO0DAAJAAAAMYAAA                    AAAO0DAAJAAAAMYAAA

 

       ROWID具體划分可以分為4部分。

       (1).OOOOOO:前6位表示DATA OBJECT NUMBER,將起轉化位數字后匹配DBA_OBJECTS中的DATA_OBJECT_ID,可以確定表信息。

        如上面的例子DATA OBJECT NUMBER是AAAO0D,轉化位數字是14×64×64 +52×64 + 3。 
         輸入以下查詢: 
      

  select owner, object_name from dba_objects 
     where data_object_id = 14*64*64 + 52*64 + 3; 

         返回: 

                 OWNER    OBJECT_NAME 
                 WG        TEST_ROWID 


      (2).FFF:第7到9位表示相對表空間的數據文件號。 
         上面的例子中是AAJ,表示數據文件9。 
      (3).BBBBBB:第10到15位表示這條記錄在數據文件中的第幾個BLOCK中。

         上面的例子是AAAAMY,轉化位數字是12×64+24,表示這條記錄在數據文件中的第792個BLOCK。

      (4).RRR:最后3位表示這條記錄是BLOCK中的第幾條記錄。

         上面的例子是AAA,表示第0條記錄(總是從0開始計數)。

 二、select t.* ,rowid.t from 表 t

      1.

       select t.*   是選出t表的所有信息
       select *     是選出 關鍵字from后面的所有表的信息
       如果from 后面只有一個表,那么兩者無區別。

      2.       

      當from后面只有一個表名時,select t.*,rowid 能用, select *,rowid為什么不能用?提示“未找到要求的FROM關鍵字”。

因為select *,rowid的時候,會把rowid當作表的一個字段來用,而在select t.*,rowid的時候沒有作為所查表的字段。

    3. 

     比如select t.* from table t,那么t就是你查的那張表table的別名,后面寫的時候,table可以用t代替,簡單點,這里的t.*就是查詢table表的所有列名,有多少,查出多少,*就是全部的意思、     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM