1、rownum的說明oracle
rownum是oracle特有的一個關鍵字。3d
(1)對於基表,在insert記錄時,oracle就按照insert的順序,將rownum分配給每一行記錄,所以在select一個基表的時候,rownum的排序是根據insert記錄的順序顯示的,例如:code
select rownum as rn, t.* from emp t;
(2)對於子查詢,則rownum的順序是根據子查詢的查詢順序進行動態分配的,例如:blog
select rownum as t2_rn, t2.* from (select rownum as t1_rn , t1.* from emp t1 order by t1.sal) t2;
由上圖能夠看到T1_RN和T2_RN的區別。排序
t1中的rownum是根據emp這個基表的默認順序分配的,而內層子循環是根據SAL字段進行排序,因此t2的rownum是根據內層子查詢的記錄順序分配的。class
----------------------------- 分 割 線 -------------------------------------select
2、rownum的一些使用技巧循環
(1)使用rownum限制查詢返回的記錄數技巧
一、例如,咱們如今只想看到emp表中的第一條記錄:im
select * from emp where rownum=1;
將rownum限制爲1,這樣就只能查詢出一條記錄。
二、如今,咱們如今想查看emp中的前2條記錄:
select * from emp where rownum<=2;
將rownum的限制爲2條,這樣就能夠查詢出前2條記錄。
三、假如咱們如今只想查看emp中的第二條記錄,又該如何寫語句呢?
若是咱們先這樣寫:
select * from emp where rownum=2;
where條件爲:rownum=2,來看看查詢結果:
發現沒有查出任何數據,爲何呢?這裏就要對oracle的rownum作進一步的理解。
由於rownum並非看成實體數據存放在每一張表中,而是在每一次select查詢的時候,根據基表的默認insert順序由oracle動態分配的,有1纔有2,若是rownum沒有1,那麼2也就沒有了意義,因此這個查詢就不會有任何結果出來。這個時候咱們就須要利用子查詢和別名列來實現這個需求:
select * from ( select rownum as rn, t.* from emp t where rownum<=2 ) where rn=2 ;
首先經過子查詢,取出emp表的前2條記錄,並將子查詢中的rownum定義爲別名rn,而後在外層查詢中,使用where條件使rn=2便可,查詢出emp表的第二條記錄: