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爲主鍵