oracle中rownum和rowid的區別

2021-10-08 09:25:18 字數 1317 閱讀 8553

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

我們在處理一張表中重覆記錄時經常用到他,當然你也可以用乙個很原始的方法,就是將有重覆記錄的表中的資料導到另外一張表中,最後再倒回去。

sql>create table stu_tmp as select distinct* from stu;

sql>truncate table sut;        //清空表記錄

sql>insert into stu select * from stu_tmp;    //將臨時表中的資料新增回原表但是要是stu的表資料是百萬級或是更大的千萬級的,那這樣的方法顯然是不明智的,因此我們可以根據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);

這樣就可以了。

Oracle中查詢rownum和rowid的區別

在查詢中,我們可以注意到,類似於 select xx from table where rownum n n 1 這樣的查詢是有正確含義的,而 select xx from table where rownum n 這樣的查詢只在n 1的時候成立,select xx from table where...

Oracle中查詢rownum和rowid的區別

在查詢中,我們可以注意到,類似於 select xx from table where rownum n n 1 這樣的查詢是有正確含義的,而 select xx from table where rownum n 這樣的查詢只在n 1的時候成立,select xx from table where...

oracle中rownum和rowid的區別

rownum和rowid都是偽列,但是兩者的根本是不同的,rownum是根據sql查詢出的結果給每行分配乙個邏輯編號,所以你的sql不同也就會導致最終rownum不同,但是rowid是物理結構上的,在每條記錄insert到資料庫中時,都會有乙個唯一的物理記錄 例如 aaamgzaaeaaaaagaa...