天天看點

Oracle資料庫中的分頁--rownum

1. 介紹

當我們在做查詢時,經常會遇到如查詢限定行數或分頁查詢的需求,MySQL中可以使用LIMIT子句完成,在MSSQL中可以使用TOP子句完成,那麼在Oracle中,我們如何實作呢?

Oracle提供了一個rownum的僞列,它會根據傳回記錄生成一個序列化的數字。

rownum和rowid都是僞列,但是兩者的根本是不同的。rownum是根據SQL查詢出的結果給每行配置設定一個邏輯編号,是以SQL不同也就會導緻最終rownum不同;rowid是實體結構上的,在每條記錄INSERT到資料庫中時,都會有一個唯一的實體記錄。

2. 限定查詢行數

如果希望限定查詢結果集的前幾條資料,通過ROWNUM可以輕松實作。

示例:

3. 分頁查詢

在資料庫應用系統中,我們會經常使用到分頁功能,如每頁顯示5條記錄,查詢第2頁内容該如何查詢呢?

上面的SQL語句是否能查詢出我們想要的結果呢?

當執行該SQL就會發現,顯示出來的結果要讓你失望了:查不出一條記錄,即使表中有20條記錄。問題是出在哪呢?

因為rownum是對結果集加的一個僞列(即先查到結果集之後再加上去的一個列),簡單的說rownum是對符合條件結果集添加的序列号。它總是從1開始排起的,是以選出的結果中不可能沒有1,而有其他大于1的值。

rownum > 5 AND rownum <= 10 查詢不到記錄,因為如果第一條的 rownum = 1,不滿足條件被去掉,第二條的rownum又成了1,繼續判斷,是以永遠沒有滿足條件的記錄。

任何時候想把 rownum = 1 這條記錄抛棄是不對的,它在結果集中是不可或缺的,少了rownum=1 就像空中樓閣一般不能存在,是以你的 rownum 條件要包含到 1。

那麼,如果想要用 rownum > 5 這種條件的話就要用子查詢,把rownum先生成,然後再對生成結果進行查詢。

4. 使用rownum的注意事項

不能對rownum使用>(大于1的數值)、>=(大于1的數值)、=(大于1的數值),否則無結果。

在使用rownum時,隻有當Order By的字段是主鍵時,查詢結果才會先排序再計算rownum,但是,對非主鍵字段(如:name)進行排序時,結果可能就混亂了。出現混亂的原因是:oracle先按實體存儲位置(rowid)順序取出滿足rownum條件的記錄,即實體位置上的前5條資料,然後在對這些資料按照Order By的字段進行排序,而不是我們所期望的先排序、再取特定記錄數。

5 下面就是利用包來寫的一個分頁的查詢的過程