oracle中rownum和rowid的區別
rownum和rowid都是偽列,但是兩者的根本是不同的,rownum是根據sql查詢出的結果給每行分配一個邏輯編號,所以你的sql不同也就會導致最終rownum不同,但是rowid是物理結構上的,在每條記錄insert到資料庫中時,都會有一個唯一的物理記錄 ,
例如 AAAMgzAAEAAAAAgAAB 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
這裡的AAAMgzAAEAAAAAgAAB物理位置對應了這條記錄,這個記錄是不會隨著sql的改變而改變。
因此,這就導致了他們的使用場景不同了,通常在sql分頁時或是查詢某一範圍內的記錄時,我們會使用rownum。
1、rownum
例如:
查詢2到10範圍內的記錄(這裡包括2和10的記錄)
select *
from (select rownum rn, a.* from emp a) t
where t.rn between 2 and 10;
查詢前三名的記錄
select * from emp a where rownum < 3;這裡我們要注意,直接用rownum查詢的範圍必須要包含1;因為rownum是從1開始記錄的,當然你可以把rownum查出來後放在一個虛表中作為這個虛表的欄位再根據條件查詢。
例如:
select *
from (select rownum rn, a.* from emp a) t
where t.rn > 2;這就可以了
2、rowid
我們在處理一張表中重複記錄時經常用到他,rowid具有唯一性,查詢時效率是很高的。
例如,學生表中的姓名會有重複的情況,但是學生的學號是不會重複的,如果我們要刪除學生表中姓名重複只留學號最大的學生的記錄,怎麼辦呢?
delete from stu a
where rowid not in (select max(rowid)
from stu b
where a.name = b.name
and a.stno < b.stno);
這樣就可以了。
例如 AAAMgzAAEAAAAAgAAB 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
這裡的AAAMgzAAEAAAAAgAAB物理位置對應了這條記錄,這個記錄是不會隨著sql的改變而改變。
因此,這就導致了他們的使用場景不同了,通常在sql分頁時或是查詢某一範圍內的記錄時,我們會使用rownum。
1、rownum
例如:
查詢2到10範圍內的記錄(這裡包括2和10的記錄)
select *
from (select rownum rn, a.* from emp a) t
where t.rn between 2 and 10;
查詢前三名的記錄
select * from emp a where rownum < 3;這裡我們要注意,直接用rownum查詢的範圍必須要包含1;因為rownum是從1開始記錄的,當然你可以把rownum查出來後放在一個虛表中作為這個虛表的欄位再根據條件查詢。
例如:
select *
from (select rownum rn, a.* from emp a) t
where t.rn > 2;這就可以了
2、rowid
我們在處理一張表中重複記錄時經常用到他,rowid具有唯一性,查詢時效率是很高的。
例如,學生表中的姓名會有重複的情況,但是學生的學號是不會重複的,如果我們要刪除學生表中姓名重複只留學號最大的學生的記錄,怎麼辦呢?
delete from stu a
where rowid not in (select max(rowid)
from stu b
where a.name = b.name
and a.stno < b.stno);
這樣就可以了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26477398/viewspace-2122684/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- rowid和rownum的區別
- 【oracle rowid與rownum的使用與區別 】Oracle
- Oracle中rownum與rowid使用上的問題Oracle
- 淺析Oracle(rownum)和Mysql(limit)分頁的區別OracleMySqlMIT
- Oracle中的rownumOracle
- Oracle中rownum和row_number()Oracle
- oracle中的Rowid和UrowidOracle
- 【 Oracle中rownum的用法 】Oracle
- rownum和rowid,row_number一點應用
- oracle中in和exists的區別Oracle
- Oracle中的Rownum 欄位Oracle
- ROWID與ROWNUM的簡介與對比
- Oracle的rownum原理和使用Oracle
- oracle中distinct和group by的區別Oracle
- oracle中 DG和GG的區別Oracle
- Oracle中truncate和delete的區別Oracledelete
- (轉)ORACLE 中IN和EXISTS的區別Oracle
- Oracle中latch和lock的區別Oracle
- Oracle中rowid的用法Oracle
- 【oracle中rowid的用法】Oracle
- sql tuning—分析10與11g在處理rownum及rowid的效能區別—part1SQL
- Oracle中Date和Timestamp的區別Oracle
- Oracle rman中recover和restore的區別:OracleREST
- oracle的rownumOracle
- Oracle中User和Schema的區別和聯絡Oracle
- ORACLE 中ROWNUM用法總結!Oracle
- ORACLE 中ROWNUM用法總結Oracle
- Oracle中sys和system的區別小結Oracle
- 在Oracle中session和process的區別(轉)OracleSession
- Oracle中truncate和delete的區別(例項)Oracledelete
- 唯一index和非唯一index中leaf node裡rowid的一點區別。Index
- Oracle ROWNUMOracle
- 唯一索引和非唯一索引ROWID儲存的區別索引
- ORACLE 中ROWNUM用法總結! (轉)Oracle
- Oracle - @和@@、&與&& 的區別Oracle
- MySQL和Oracle的區別MySqlOracle
- Oracle和MySQL的區別OracleMySql
- oracle中基於ROWNUM的查詢的返回Oracle