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