天天看點

Oracle中rowid與rownum的差別

Oracle中rowid和rownum都是僞列,但含義完全不同。rowid是實體位址,用于定位Oracle中具體資料的存儲位置,而rownum則是sql語句的輸出結果排序。通俗的講:rowid是相對不變的,rownum會變化,尤其是使用order by的時候。

需要注意的是rownum的用法:

select *  from  emp   where rownum<n   //有意義的查詢

select *  from  emp   where rownum=n   //隻有在n=1的時候該語句是有意義的 

select *  from  emp   where rownum>n   //該語句沒有意義,當n=0的時候傳回所有值,當n!=0的時候傳回空集

原因在于oracle對rownum的處理上,rownum是在查詢語句得到結果集的時候産生的,用于标記結果集順序的一個字段,這個字段被稱為‘僞數列’,也就是事實上并不存在的一個數列。它的特點是按順序标記,而且是逐次遞加的,換句話說就是隻有rownum=1的記錄,才會出現rownum=2的記錄。

我們可以看出使用rownum是有使用限制的,但是我們常常可以遇到這樣的需求‘查詢第xx條到第xx條的記錄’,比如頁面的分頁處理,當遇到這類需求的時候我們如何構造出我們所需要的結果集呢?    

我們需要利用子查詢,在構造臨時表的時候把rowid構造成一個實際的字段

select  t1.*,t1.rn  from(

select t.*,rownum  rn    from  (

select *  from  emp  

)   t

)   t1    where t1.rn>3   and t1.rn<6