在學習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表的所有列名,有多少,查出多少,*就是全部的意思、