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的區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
libxml2剖析(2):編譯
我还在迷路
2018-08-27 20:04:11
libxml2 主要函數用法
我还在迷路
2018-08-27 20:04:11
windows 編譯libxml2 64位及32位都可以使用
我还在迷路
2018-08-27 20:04:11
socket編程 及select poll epoll示例
我还在迷路
2018-08-27 20:04:09
libxml2剖析(3):使用教程
我还在迷路
2018-08-27 20:04:09
const的思考
duchuanying
2018-08-27 19:55:25
深入理解C語言指針的奧祕
duchuanying
2018-08-27 19:55:25
C/C++ 程序設計員應聘常見面試試題深入剖析
duchuanying
2018-08-27 19:55:24
內核模式下獲取SSDT服務索引代碼
毛主席夸帅
2018-08-27 19:54:14
獲取Windows系統版本號以及位數(兼容Win8)
毛主席夸帅
2018-08-27 19:54:13
[Win32]獲取當前系統可用磁盤空間最大的盤符
毛主席夸帅
2018-08-27 19:54:02
使用pl/sql圖形化工具連接Oracle數據庫後顯示自己創建的表或者指定顯示錶
entomb
2018-08-27 20:02:39