Oracle中的rownum

mrhaozi發表於2010-01-14

rownum是Oracle中的偽列,並不真正存在於表中,它只在查詢的時候產生。也就是說表中的資料並沒有一個真正的物理的列去表示一條記錄是第幾行,而只是在查詢中才會對這些行進行標識。那到底rownum是什麼時候賦給行的呢?

rownum是在where條件過濾之後,在任何排序(order by)或聚集(aggregation)之前賦給行的。

同時,只有當rownum被分配給行後才會遞增。

rownum的初始值為1。rownum在查詢中產生後就不再變化

rownum被分配的過程大致如下:

rownum = 1
for x in ( select * from A )
loop
if ( x satisifies the predicate )
then
OUTPUT the row
rownum = rownum + 1
end if;
end loop;

而一個查詢的執行順序大概是這樣的:

Select …, ROWNUM
From t
Where
Group by
Having
Order by

Think of it as being processed in this order:

1.The FROM and WHERE clause go first.
2.ROWNUM is assigned and incremented to each output row from the FROM/WHERE.
3.SELECT is applied.
4.GROUP BY is applied.
5.HAVING is applied.
6.It is sorted.

根據以上規則,我們可對如下的語句進行解釋:

1。select * from t where ROWNUM > 1

當執行該語句時,第一條記錄rownum=1,此時不滿足rownum >1的條件,所以返回零條記錄。

2。select * from t where ROWNUM = 1

該語句會返回1行記錄,因為第一條記錄rownum=1,滿足rownum=1這個條件。

3。select * from t where ROWNUM<5

該語句會返回4行記錄。第一行記錄rownum=1,滿足ROWNUM<5這個條件,此時ROWNUM遞增1,然後繼續比較,直到ROWNUM=4,迴圈結束。

4。select * from t where ROWNUM>=1

同理該語句會返回所有記錄。

5。select * from emp where ROWNUM <= 5 order by sal desc;

該語句的目的是想返回top 5薪水最高的員工資訊,但根據rownum的產生原理,rownum在order by之前就已經產生,所以該語句並不能起到top 5的作用,正確的語法如下:

select * from (select * from emp order by sal desc) where ROWNUM <= 5;

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16396910/viewspace-1030561/,如需轉載,請註明出處,否則將追究法律責任。

相關文章