Oracle的rownum用法

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

1、(1)查找前n條數據

select * from student where rownum <= n
  (2)查詢大於第n條記錄(n>1)

 如果想找到從第二行記錄以後的記錄,當使用rownum>2是查不出記錄的,原因是由於rownum是一個總是從1開始的僞列,Oracle 認爲rownum> n(n>1的自然數)這種條件依舊不成立,所以查不到記錄。  

  但是,可使用以下的子查詢方法來解決。子查詢中的rownum必須要有別名,否則還是不會查出記錄來,這是因爲rownum不是某個表的列,如果不起別名的話,無法知道rownum是子查詢的列還是主查詢的列。 

select * from(select rownum rowno,id,name,age from student) <span style="font-family: Arial, Helvetica, sans-serif;">where rowno>n</span>

2、rownum和order by

(1)對非主鍵字段進行排序

             select * from student where rownum<10 order by name  --name爲非主鍵字段

  卻發現oracle卻不能按自己的意願來執行,而是先隨便取10條記錄,然後再order by。

  如果需要對非主鍵字段排序再取前n條數據,只能用子查詢來實現先排序,後rownum,可以用下方式實現:

             select * from (select * from tabname order by name) where rownum<10

  但這樣一來,效率會低很多。

出現這種原因是:Oracle先按物理存儲位置(rowid)順序取出滿足rownum條件的記錄,即物理位置上的前5條數據,然後在對這些數據按照order By的字段進行排序,而不是我們所期望的先排序、再取特定記錄數。

(2)對主鍵字段進行排序

  在使用rownum時,只有當order By的字段是主鍵時,查詢結果纔會先排序再計算rownum。

 select * from student where rownum<10 order by name   --name爲主鍵

 

發佈了29 篇原創文章 · 獲贊 23 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章