對於rownum來說它是oracle系統順序分配為從查詢返回的行的編號返回的第一行分配的是第二行是依此類推這個偽字段可以用於限制查詢返回的總行數而且rownum不能以任何表的名稱作為前綴
舉例說明
例如表student(學生)表表結構為
ID varchar() 學號
name varchar() 姓名
create table student (ID varchar() name varchar());
insert into student values(張一);
insert into student values(王二);
insert into student values(李三);
insert into student values(趙四);
commit;
() rownum 對於等於某值的查詢條件
如 果希望找到學生表中第一條學生的信息可以使用rownum=作為條件但是想找到學生表中第二條學生的信息使用rownum=結果查不到數據因 為rownum都是從開始但是以上的自然數在rownum做等於判斷是時認為都是false條件所以無法查到rownum = n(n>的自然數)
SQL> select rownumidname from student where rownum=;(可以用在限制返回記錄條數的地方保證不出錯如隱式游標)
SQL> select rownumidname from student where rownum=;
ROWNUM ID NAME
張一
SQL> select rownumidname from student where rownum =;
ROWNUM ID NAME
()rownum對於大於某值的查詢條件
如果想找到從第二行記錄以後的記錄當使用rownum>是查不出記錄的原因是由於rownum是一個總是從開始的偽列Oracle 認為rownum> n(n>的自然數)這種條件依舊不成立所以查不到記錄
SQL> select rownumidname from student where rownum >;
ROWNUM ID NAME
那如何才能找到第二行以後的記錄呀可以使用以下的子查詢方法來解決注意子查詢中的rownum必須要有別名否則還是不會查出記錄來這是因為rownum不是某個表的列如果不起別名的話無法知道rownum是子查詢的列還是主查詢的列
SQL>select * from(select rownum no idname from student) where no>;
NO ID NAME
李三
趙四
SQL> select * from(select rownumidname from student)where rownum>;
ROWNUM ID NAME
()rownum對於小於某值的查詢條件
如果想找到第三條記錄以前的記錄當使用rownum<是能得到兩條記錄的顯然rownum對於rownum<n((n>的自然數)的條件認為是成立的所以可以找到記錄
SQL> select rownumidname from student where rownum <;
ROWNUM ID NAME
張一
王二
綜 上幾種情況可能有時候需要查詢rownum在某區間的數據那怎麼辦呀從上可以看出rownum對小於某值的查詢條件是人為true的rownum對 於大於某值的查詢條件直接認為是false的但是可以間接的讓它轉為認為是true的那就必須使用子查詢例如要查詢rownum在第二行到第三行之 間的數據包括第二行和第三行數據那麼我們只能寫以下語句先讓它返回小於等於三的記錄行然後在主查詢中判斷新的rownum的別名列大於等於二的記 錄行但是這樣的操作會在大數據集中影響速度
SQL> select * from (select rownum noidname from student where rownum<= ) where no >=;
NO ID NAME
王二
李三
()rownum和排序
Oracle中的rownum的是在取數據的時候產生的序號所以想對指定排序的數據去指定的rowmun行數據就必須注意了
SQL> select rownum idname from student order by name;
ROWNUM ID NAME
李三
王二
張一
趙四
可以看出rownum並不是按照name列來生成的序號系統是按照記錄插入時的順序給記錄排的號rowid也是順序分配的為了解決這個問題必須使用子查詢
SQL> select rownum idname from (select * from student order by name);
ROWNUM ID NAME
李三
王二
張一
趙四
這樣就成了按name排序並且用rownum標出正確序號(有小到大)
筆者在工作中有一上百萬條記錄的表在jsp頁面中需對該表進行分頁顯示 便考慮用rownum來作下面是具體方法(每頁
顯示條)
select * from tabname where rownum< order by name 但卻發現oracle卻不能按自己的意願來執行而是先隨便取條記錄然後再 order by後經咨詢oracle說rownum確實就這樣想用的話只能用子查詢 來實現先排序後rownum方法如下
select * from (select * from tabname order by name) where rownum<但這樣一來效率會較低很多
後經筆者試驗只需在order by 的字段上加主鍵或索引即可讓oracle先按 該字段排序然後再rownum方法不變
select * from tabname where rownum< order by name
取得某列中第N大的行
select column_name from
(select table_name*dense_rank() over (order by column desc) rank from table_name)
where rank = &N
假如要返回前條記錄
select * from tablename where rownum<;(或是rownum <= 或是rownum != )
假如要返回第條記錄
select * from tablename
where …
and rownum<
minus
select * from tablename
where …
and rownum<
order by name
選出結果後用name排序顯示結果(先選再排序)
注意只能用以上符號(<<=!=)
select * from tablename where rownum != ;返回的是前9條記錄
不能用>>==Betweenand由於rownum是一個總是從開始的偽列Oracle 認為這種條件 不成立查不到記錄
另外這個方法更快
select * from (
select rownum ra from yourtable
where rownum <=
order by name )
where r >
這樣取出第條記錄!(先選再排序再選)
要先排序再選則須用select嵌套內層排序外層選rownum是隨著結果集生成的一旦生成就不會變化了同時生成的結果是依次遞加的沒有就永遠不會有rownum 是在 查詢集合產生的過程中產生的偽列並且如果where條件中存在 rownum 條件的話則:
假如 判定條件是常量則
只能 rownum = <= 大於 的自然數 = 大於 的數是沒有結果的 大於一個數也是沒有結果的
即 當出現一個 rownum 不滿足條件的時候則 查詢結束 this is stop key!
: 當判定值不是常量的時候
若條件是 = var 則只有當 var 為 的時候才滿足條件這個時候不存在 stop key 必須進行 full scan 對每個滿足其他where條件的數據進行判定
From:http://tw.wingwit.com/Article/program/Oracle/201311/17923.html