ROWNUM的概念
ROWNUM是 一個(gè)虛假的列。它將被分配為 1,2,3,4,...N,N 是行的數(shù)量。一個(gè)ROWNUM值不是被永久的分配給一行 (這是最容易被誤解的)。表中的某一行并沒(méi)有標(biāo)號(hào);你不可以查詢ROWNUM值為5的行——根本沒(méi)有這個(gè)概念。另一個(gè)容易搞糊涂的問(wèn)題是ROWNUM值是 何時(shí)被分配的。ROWNUM值的分配是在查詢的謂詞解析之后,任何排序和聚合之前進(jìn)行的。ROWNUM值只有當(dāng)被分配之后才會(huì)增長(zhǎng)。這就是為什么下面的查 詢永遠(yuǎn)都不會(huì)返回結(jié)果:
select * from countries where rownum>1;
ROWNUM > 1對(duì)于第一行來(lái)說(shuō)并不是真值,ROWNUM沒(méi)有增長(zhǎng)到 2。所以,沒(méi)有比1大的ROWNUM.永遠(yuǎn)都不要使用’ROWNUM>?‘和’ROWNUM=2…N’這樣的條件。

用rownum顯示排序結(jié)果的前N條記錄
FROM/WHERE子句先被執(zhí)行.
根據(jù)FROM/WHERE子句輸出的行, ROWNUM被分配給他們并自增長(zhǎng).
SELECT 被應(yīng)用.
GROUP BY 被應(yīng)用.
HAVING is 被應(yīng)用.
ORDER BY 被應(yīng)用.
這就是為什么下面的SQL幾乎總是錯(cuò)誤的:
select rownum,job_title,min_salary
from jobs where rownum<3 order by min_salary;
正確的寫(xiě)法:
        select rownum,tmp.* from (
        select job_title,min_salary
        from jobs order by min_salary) tmp
        where rownum<=3;

用ROWNUM實(shí)現(xiàn)分頁(yè)
select * from
        (select /*+ FIRST_ROWS(n) */ a.*,
        ROWNUM rnum
        from (your_query_goes_here, with order by) a
        where ROWNUM <=
        :MAX_ROW_TO_FETCH )
where rnum >= :MIN_ROW_TO_FETCH;
FIRST_ROWS(N)使優(yōu)化器考慮最短時(shí)間獲得前N條記錄.
:MAX_ROW_TO_FETCH 某一頁(yè)中結(jié)果集的最后一行。如果你每頁(yè)顯示10行,要顯示第6頁(yè),那么此值取60。
:MIN_ROW_TO_FETCH 某一頁(yè)中結(jié)果集的第一行。如果你每頁(yè)顯示10行,要顯示第6頁(yè),那么此值取50。

ROWNUM對(duì)性能的影響
ROWNUM可以避免oracle在磁盤(pán)上進(jìn)行排序。rownum無(wú)法避免全表掃描的發(fā)生,但是它可以避免對(duì)整個(gè)表數(shù)據(jù)的排序操作,在指定了rownum后,排序操作在內(nèi)存中可以輕松完成。