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。
一、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;這就能夠了

二、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);
這樣就能夠了。
sql

相關文章
相關標籤/搜索