rowid和rownum的區別

路途中的人2012發表於2016-03-14
rowid和rownum都是序列,但含義完全不同。rowid是實體地址,用於定位oracle中具體資料的物理儲存位置,rownum則是sql的輸出結果排序。通俗的講:rowid是相對不變的,rownum會變化,尤其是使用order by的時候
rowid:用於定位資料表中某條資料的位置,是唯一的,也不會改變
rownum表示查詢某條記錄在整個結果集中的位置,同一條記錄查詢條件不同對應的rownum是不同的而rowid是不會變的

rowid:
SQL> select * from cheng1;

NAME          ID
----- ----------
eeee          28
nnnn           1
cccc            1
aaaa          30

SQL> select rowid,name,id from cheng1;

ROWID              NAME          ID
------------------ ----- ----------
AAAXmlAABAAAO5iAAA eeee          28
AAAXmlAABAAAO5iAAD nnnn           1
AAAXmlAABAAAO5iAAE cccc           1
AAAXmlAABAAAO5iAAF aaaa          30

SQL> select name,id from cheng1 where rowid='AAAXmlAABAAAO5iAAE';

NAME          ID
----- ----------
cccc           1

SQL> select name,id from cheng1 where rowid='AAAXmlAABAAAO5iAAA';

NAME          ID
----- ----------
eeee          28

rownum:在oracle中,要按特定條件查詢前n條記錄,用rownum就可以了。select * from cheng1 where rownum<3;這裡要注意的是不能對rownum用''>'',也就是說如果
用select * from cheng1 where rownum>3;查詢的結果是失敗的。

SQL> select rownum,name,id from  cheng1;


    ROWNUM NAME          ID
---------- ----- ----------
         1 eeee          28
         2 ffff           1
         3 aaaa          30

SQL> select * from cheng1 where rownum<3;


NAME          ID
----- ----------
eeee          28
ffff           1

SQL> select * from cheng1 where rownum>2;

no rows selected

對應rownum來說它是oracle系統順序分配為從查詢返回的行的編號,返回的第一行分配的是1,第二行是2,以此內推,這個偽欄位可以用於限制查詢返回的總行數,
因為rownum都是從1開始,但是1以上的自然數在rownum做判斷時認為都是false條件,所有無法查到rownum=n(n>1的自然數)。
rownum對應大於某值的查詢條件,如果想找從第二行記錄以後的記錄,當使用rownum>2是查不出記錄的,原因是由於rownum是一個總是從1開始的偽劣,oracle認為
rownum>n(n>1的自然數)這種條件不成立,所以查不到SQL> select * from cheng1 where rownum>2;
那如何才能找到第二行以後的記錄。可以使用以下的子查詢方法來決解。注意子查詢中的rownum必須有別名,否則還是不會查出記錄來,這是因為rownum不是某個
的列,如果不起別名的話,無法知道rownum是子查詢還是主查詢的列。
SQL> select * from (select rownum no,name,id from cheng1) where no>2;

        NO NAME          ID
---------- ----- ----------
         3 aaaa          30
rownum對於小於某值的查詢條件如果想找到第三條記錄以前的記錄,當使用rownum<3是能得到2條記錄的。顯然rownum對於rownum1的自然數)的條件認為是成
立的所有可以找到記錄。綜上幾種情況,可能有時候需要查詢rownum在某區間的資料,哪怎麼辦,從上可以看出rownum對小於謀值的查詢條件是人為true的,rownum
對大於某值的查詢條件直接認為是false的,但是可以間接的讓它轉為認為是true的。那就必須使用

子查詢。
列於查詢第1條到第3條中間的記錄:
SQL> select * from (select rownum nn,name,id from cheng1 where rownum<3) where nn>1;

       NN NAME          ID
---------- ----- ----------
         2 ffff           1
 






   






來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29067253/viewspace-2057327/,如需轉載,請註明出處,否則將追究法律責任。

相關文章