Oracle資料庫中的分頁查詢

chuimber發表於2024-07-17

分頁關鍵詞rownum

和MySQL不同,MySQL中使用Limit進行分頁實現,比如select * from t limit 10,5實現了查詢(10,10+5]範圍內的資料。Oracle資料庫不支援limit關鍵字,但是有rownum這一虛擬欄位。

rownum

  1. rownum是一個偽列,由資料庫自己建立。
  2. rownum會在條件滿足後、結果集確定後自動編排。

比如select * from t where rownum < 5可以實現前4條資料的查詢。
但是rownum並不能簡單的實現理想的分頁,比如select * from t where rownum <= 15 and rownum > 10來實現上面的mysql同效果的語句是不可取的。因為rownum僅支援<、<=等。

一般情況下,使用rownum > 的語句會導致查詢的結果為空。

  • 因為如上所說,rownum是一個偽列,且會在條件滿足時編排,當 where rownum>1時,會依次對結果每行進行條件校驗,第一行不滿足就會捨棄,第二行又變成第一行導致rownum重新編排,以此類推,每一行都因不符條件被捨棄,返回的結果必定為空。
  • 由此推出,當執行where rownum > 0 or rownum >= 1 時,是可以正常返回結果集,只是沒什麼意義

實現分頁查詢

知道了rownum的用法就可以實現分頁查詢了,因為不能使用rownum > 的用法,因此可以透過以下這種方式實現分頁

SELECT * FROM (
    SELECT td.* , ROWNUM RN FROM table_demo td WHERE ROWNUM <= 15) 
WHERE RN > 10

TIPS

  1. 因為是偽列,不能在select語句後使用rownum的別名,比如select td.* , rownum rn from table_demo td where rn <= 10
  2. 子句中的oredr by 可以接rownum別名
  3. 分頁查詢的巢狀查詢中父語句將子句的結果集又重新做了查詢,子集中的偽列在頂層查詢中視為了真列,可以使用別名

相關文章