首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle ROWNUM 深度解析:分頁、排序與常見陷阱

     編輯:Oracle 資料庫相關知識

ROWNUM 是 Oracle 為查詢結果集動態分配的偽欄位,從 1 開始遞增。理解其產生時機(在 WHERE 過濾之前)是避開陷阱的關鍵。

核心特性速查表

條件類型行為說明
ROWNUM = 1✅ 可用只取第一筆,常用於限制筆數
ROWNUM = N (N>1)❌ 無資料因 ROWNUM 從 1 開始,永遠無法直接等於 N
ROWNUM > N❌ 無資料同理,第一筆即被過濾,後續無法產生
ROWNUM < N✅ 可用可取前 N-1 筆

正確分頁寫法(經典三層嵌套)

SELECT * FROM (
  SELECT t.*, ROWNUM rn FROM (
    SELECT * FROM your_table ORDER BY id
  ) t
  WHERE ROWNUM <= :end_row
) WHERE rn >= :start_row;

關鍵點:

  • 最內層先排序,確保順序確定。
  • 中間層賦予 ROWNUM 並限制上限(ROWNUM <= end)。
  • 最外層以別名 rn 過濾下限。

排序陷阱

-- 錯誤:ROWNUM 依插入順序產生,非排序後順序
SELECT ROWNUM, id, name FROM student ORDER BY name;

-- 正確:子查詢先排序,外層再加 ROWNUM
SELECT ROWNUM, id, name FROM (SELECT * FROM student ORDER BY name);

進階提示

  • Oracle 12c+ 可直接用 OFFSET ... FETCH NEXT ... 標準語法,更簡潔高效。
  • 大資料集分頁建議搭配索引或游標分頁(Keyset Pagination)避免深分頁效能劣化。

掌握 ROWNUM 產生機制,分頁查詢不再踩坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved