oracle中Rowid和Rownum的區別

rowid和rownum都是虛列,但含義完全不同。rowid是物理地址,用於定位oracle中具體數據的物理存儲位置,而rownum則是sql的輸出結果排序。通俗的講:rowid是相對不變的,rownum會變化,尤其是使用order by的時候。
rowid:用於定位數據表中某條數據的位置,是唯一的、也不會改變

rownum:表示查詢某條記錄在整個結果集中的位置, 同一條記錄查詢條件不同對應的 rownum 是不同的而 rowid 是不會變的
rowid:
我們在處理一張表中重複記錄時經常用到它,
sql server中去重:
Select * from stuinfo a where not exists(select 1 from stuinfo where stuName=a.stuName and ID<a.ID)

有另一個想法,既然rowid是唯一的,那爲什麼不用它作爲主鍵呢,還另外定義一個主鍵列呢?
原因一:(RowID可那隨時改變)首先RowID也是僞列,但是他也是唯一的。
他每個值表示數據塊的地址。主鍵是可以做,但是很容易生效,當你對數據進行移動,如導入和導出之類的操作,這個RowID也會隨之改變。所以說RowID不適合做主鍵。
原因二(主鍵也就含有自動創建的唯一索引)索引創建的過程就是由RowID和列值進行綁定,
當數據塊地址發生改變的時候,如刪除一條記錄,那麼索引也會被自動維護,
也就是說RowID會自動改變,這也是ORACLE內部用ROWID的方法

rownum:
在Oracle中,要按特定條件查詢前N條記錄,用個rownum就搞定了。 select * from emp whererownum<= 5 而且書上也告誡,不能對rownum用">",這也就意味着,如果你想用 select * from emp whererownum> 5 則是失敗的。要知道爲什麼會失敗,則需要了解rownum背後的機制:
1.數據庫執行查詢
2.Oracle讀取第一行並調用它排1號。
3.我們過去讀的數據符合標準嗎?如果不符合,那麼Oracle棄行,如果符合,Oracle將返回這行。
4.Oracle讀取下一行提出的行數(2,然後3,然後4,等等)。
5.回到第三步
瞭解了原理,就知道rownum>不會成功,因爲在第三步的時候查詢出的行已經被丟棄,第四步查出來的rownum仍然是1,這樣永遠也不會成功。

同樣道理,rownum如果單獨用=,也只有在rownum=1時纔有用。
rownum可以用在分頁查詢上:
以下是代碼:
  SELECT * FROM

  (

  SELECT A.*, ROWNUM RN

  FROM (SELECT * FROM 表名) A

  WHERE ROWNUM <= 40

  )

  WHERE RN >= 21

  其中最內層的查詢SELECT * FROM 表名錶示不進行翻頁的原始查詢語句。ROWNUM <= 40和RN >= 21控制分頁查詢的每頁的範圍。

  上面給出的這個Oracle分頁查詢語句,在大多數情況擁有較高的效率。分頁的目的就是控制輸出結果集大小,將結果儘快的返回。在上面的分頁查詢語句中,這種考慮主要體現在WHERE ROWNUM <= 40這句上。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章