oracle rownum 学习
?
?
1、為什么不直接用? SELECT a.*,rownum? FROM CIP_Test_User a?? ORDER BY ID desc進行排序?
?? 因為rownum計算比ORDER BY ID desc 更有優先級,rownum的值不會按照排序后的記錄順序重新計算,所
以如果這樣做要取排序后的記錄肯定是有錯誤的。
2、為什么要先取 ROWNUM <? 5,再循環一次取ROWNUM >1?用下面的語句行不行?
?SELECT list.*, rownum as RNUM FROM (
? SELECT a.*,rownum? FROM CIP_Test_User a?? ORDER BY ID desc)
? list WHERE ROWNUM <? 5 and ROWNUM >1
驗證結果:取出的記錄為0行。
因為1:當用rownum做為條件時,只能用小于、小于等于、等于(只能等于1),而用大于、大于等于是沒有結果的。
?????? 因為oracle計算時,當出現一個 rownum 不滿足條件的時候則 查詢結束 this is stop key!
?
?
?
rownum是oracle系統順序分配為從查詢返回的行的編號,返回的第一行分配的是1,第二行是2,依此類推,
這個偽字段可以用于限制查詢返回的總行數,而且rownum不能以任何表的名稱作為前綴。
(1) rownum 對于等于某值的查詢條件
如果希望找到學生表中第一條學生的信息,可以使用rownum=1作為條件。但是想找到學生表中第二條學
生的信息,使用rownum=2結果查不到數據。因為rownum都是從1開始,但是1以上的自然數在rownum做等于判
斷是時認為都是false條件,所以無法查到rownum = n(n>1的自然數)。
(2)rownum對于大于某值的查詢條件
如果想找到從第二行記錄以后的記錄,當使用rownum>2是查不出記錄的,原因是由于rownum是一個總是
從1開始的偽列,Oracle 認為rownum> n(n>1的自然數)這種條件依舊不成立,所以查不到記錄
??? SQL> select rownum,id,name from student where rownum >2;
ROWNUM ID???? NAME
---------- ------ ---------------------------------------------------
??? 那如何才能找到第二行以后的記錄呀。可以使用以下的子查詢方法來解決。注意子查詢中的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 * from(select rownum,id,name from student)where rownum>2;
ROWNUM ID???? NAME
---------- ------ ---------------------------------------------------
??? (3)rownum對于小于某值的查詢條件
如果想找到第三條記錄以前的記錄,當使用rownum<3是能得到兩條記錄的。顯然rownum對于rownum<n
((n>1的自然數)的條件認為是成立的,所以可以找到記錄。
SQL> select rownum,id,name from student where rownum <3;
ROWNUM ID???? NAME
---------- ------ ---------------------------------------------------
1 200001 張一
2 200002 王二
??? 綜上幾種情況,可能有時候需要查詢rownum在某區間的數據,那怎么辦呀從上可以看出rownum對小于某值的查詢條件是人為true 的,rownum對于大于某值的查詢條件直接認為是false的,但是可以間接的讓它轉為認為是true的。那就必須使用子查詢。例如要查詢rownum 在第二行到第三行之間的數據,包括第二行和第三行數據,那么我們只能寫以下語句,先讓它返回小于等于三的記錄行,然后在主查詢中判斷新的rownum的別名列大于等于二的記錄行。但是這樣的操作會在大數據集中影響速度。
SQL> select * from (select rownum no,id,name from student where rownum<=3 ) where no >=2;
NO ID???? NAME
---------- ------ ---------------------------------------------------
2 200002 王二
3 200003 李三
?? (4)rownum和排序
“select * from tabname where rownum<20 order by name" 但卻發現oracle卻不能按自己的意愿來執行,而是先隨便取20條記錄,然后再 order by,后經咨詢oracle,說rownum確實就這樣,想用的話,只能用子查詢 來實現先排序,后rownum,方法如下:
"select * from (select * from tabname order by name) where rownum<20",但這樣一來,效率會較低很多。
但是,在order by 的字段上加主鍵或索引即可讓oracle先按 該字段排序,然后再rownum;方法不變:
“select * from tabname where rownum<20 order by name"
參考網址:http://www.examda.com/oracle/zhonghe/20091209/100421867.html
總結
以上是生活随笔為你收集整理的oracle rownum 学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装vmware 6.52 Red H
- 下一篇: bean的属性类型----ibatis类