Oracle rownum方式分頁和rownum解析

數據僞列指的是用戶不需要處理的列,而是由oracle自行維護的數據列,在oracle中有兩個數據僞列:ROWNUM、ROWID.


對於rownum來說它是oracle系統順序分配爲從查詢返回的行的編號,返回的第一行分配的是1,第二行是2,依此類推,這個僞字段可以用於限制查詢返回的總行數,而且rownum不能以任何表的名稱作爲前綴。

create table student (ID char(6), name VARCHAR2(100));
insert into student values('200001',‘張一’);
insert into student values('200002',‘王二’);
insert into student values('200003',‘李三’);
insert into student values('200004',‘趙四’);

(1) rownum 對於等於某值的查詢條件

如果希望找到學生表中第一條學生的信息,可以使用rownum=1作爲條件。但是想找到學生表中第二條學生的信息,使用rownum=2結果查不到數據。因爲rownum都是從1開始,但是1以上的自然數在rownum做等於判斷是時認爲都是false條件,所以無法查到rownum = n(n>1的自然數)。


(2)rownum對於大於某值的查詢條件

   如果想找到從第二行記錄以後的記錄,當使用rownum>2是查不出記錄的,原因是由於rownum是一個總是從1開始的僞列


(3)rownum對於小於某值的查詢條件

如果想找到第三條記錄以前的記錄,當使用rownum<3是能得到兩條記錄的。顯然rownum對於rownum<n((n>1的自然數)的條件認爲是成立的,所以可以找到記錄。
可以使用以下的子查詢方法來解決。注意子查詢中的rownum必須要有別名,否則還是不會查出記錄來,這是因爲rownum不是某個表的列,如果不起別名的話,無法知道rownum是子查詢的列還是主查詢的列。
SQL>select * from(select rownum no ,id,name from student) where no>2;
        NO ID     NAME
---------- ------ ---------------------------------------------------
         3 200003 李三
         4 200004 趙四

如果不使用子查詢,在同一個句子中使用別名:

SQL> select id ident,name from sale where ident=200001;

ORA-00904: "IDENT": 標識符無效

可以理解爲數據庫是先看where部分,而不理解在select中定義的別名.


(4)rownum對於區間的查詢條件

rownum對小於某值的查詢條件是人爲true的,rownum對於大於某值的查詢條件直接認爲是false的,但是可以間接的讓它轉爲認爲是true的。那就必須使用子查詢。
SQL> select * from (select rownum no,id,name from student where rownum<=3 ) where no >=2;
        NO ID     NAME
---------- ------ ---------------------------------------------------
         2 200002 王二
         3 200003 李三
SQL> select * from (select rownum no,id,name from sale where rownum>=2 ) where no <=3;
        NO ID     NAME
---------- ------ ---------------------------------------------------


(5)rownum和排序

Oracle中的rownum的是在取數據的時候產生的序號,所以想對指定排序的數據去指定的rowmun行數據就必須注意了。
SQL> select rownum ,id,name from student order by name;
    ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
         3 200003 李三
         2 200002 王二
         1 200001 張一
         4 200004 趙四
可以看出,rownum並不是按照name列來生成的序號。系統是按照記錄插入時的順序給記錄排的號,rowid也是順序分配的。爲了解決這個問題,必須使用子查詢
SQL> select rownum ,id,name from (select * from student order by name);
    ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
         1 200003 李三
         2 200002 王二
         3 200001 張一
         4 200004 趙四
這樣就成了按name排序,並且用rownum標出正確序號(有小到大),此處只是改變了查詢結果顯示錶的rownum,如果查詢本表,rownum仍然是不變的.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章