Oracle中的rownum
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【 Oracle中rownum的用法 】Oracle
- Oracle中的Rownum 欄位Oracle
- oracle的rownumOracle
- ORACLE 中ROWNUM用法總結!Oracle
- ORACLE 中ROWNUM用法總結Oracle
- Oracle ROWNUMOracle
- oracle中rownum和rowid的區別Oracle
- Oracle中rownum和row_number()Oracle
- ORACLE 中ROWNUM用法總結! (轉)Oracle
- oracle中基於ROWNUM的查詢的返回Oracle
- Oracle中rownum與rowid使用上的問題Oracle
- ORACLE 中ROWNUM(偽列)用法解析(轉載)Oracle
- 【Oracle】-【ROWNUM與索引】-索引對ROWNUM檢索的影響Oracle索引
- Oracle的rownum原理和使用Oracle
- oracle偽列rownumOracle
- Oracle:On ROWNUM and Limiting ResultsOracleMIT
- lightdb -- Oracle相容 -- rownumOracle
- oracle中rownum,sql server中top函式,mysql中limit[轉載]OracleServer函式MySqlMIT
- Oracle Rownum分頁改寫Oracle
- 關於Oracle偽列rownumOracle
- oracle 使用rownum進行分頁的陷阱Oracle
- Oracle中rownum對錶的掃描方式效能上的影響深入探究Oracle
- 【oracle rowid與rownum的使用與區別 】Oracle
- oracle 使用rownum進行分頁的陷阱(2)Oracle
- 淺析Oracle(rownum)和Mysql(limit)分頁的區別OracleMySqlMIT
- SQL中rownum和order by的執行順序的問題SQL
- Oracle rownum 分頁引起的效率問題及優化思路Oracle優化
- 隨機獲取oracle資料庫中的任意一行資料(rownum)示例介紹隨機Oracle資料庫
- oracle rownum分頁與顯示記錄小測Oracle
- rownum 詳解
- Oracle rownum 分頁引起的效率問題及最佳化思路Oracle
- rownum偽列的應用
- oracle 使用leading, use_nl, rownum調優例子Oracle
- rowid和rownum的區別
- [轉]oracle 使用leading, use_nl, rownum調優例子Oracle
- 【實驗】【SQL】排序與rownum的關係暨利用rownum處理一實際需求SQL排序
- rownum—top-N分析
- ROWID與ROWNUM的簡介與對比