分頁查詢是應用系統中最常見的需求,但 Oracle、MySQL、SQL Server 三大主流資料庫的語法截然不同。本文以「每頁 10 筆、查詢第 2 頁」為例,條列三者核心語法與實際 SQL 範例,供開發快速參考。
currentPage:目前頁碼(從 1 起算)pageRecord:每頁筆數核心邏輯: 使用 TOP 搭配 NOT IN 子查詢排除前 N 筆。
-- 通用範本
SELECT TOP @pageRecord *
FROM addressbook
WHERE id NOT IN (
SELECT TOP (@currentPage - 1) * @pageRecord id
FROM addressbook
)
第 2 頁實際 SQL(每頁 10 筆):
SELECT TOP 10 *
FROM addressbook
WHERE id NOT IN (
SELECT TOP 10 id
FROM addressbook
)
註:SQL Server 2012+ 可使用 OFFSET ... FETCH 標準語法,效能更佳。
核心邏輯: 使用 LIMIT offset, count,直觀易懂。
-- 通用範本
SELECT * FROM addressbook
LIMIT (@currentPage - 1) * @pageRecord, @pageRecord
第 2 頁實際 SQL:
SELECT * FROM addressbook LIMIT 10, 10
核心邏輯: 利用 ROWNUM 偽欄位搭配巢狀子查詢「先取前 N 筆,再排除前 M 筆」。
-- 通用範本
SELECT * FROM (
SELECT ROWNUM rn, t.*
FROM addressbook t
WHERE ROWNUM <= @currentPage * @pageRecord
)
WHERE rn > (@currentPage - 1) * @pageRecord
第 2 頁實際 SQL:
SELECT * FROM (
SELECT ROWNUM rn, t.*
FROM addressbook t
WHERE ROWNUM <= 20
)
WHERE rn > 10
註:Oracle 12c+ 支援標準 OFFSET ... FETCH,寫法與 PostgreSQL、SQL Server 2012+ 一致。
| 資料庫 | 關鍵字句 | 適用版本 | 備註 |
|---|---|---|---|
| SQL Server | TOP + NOT IN / OFFSET FETCH | 2005+ / 2012+ | 新版建議用 OFFSET FETCH |
| MySQL | LIMIT offset, count | 所有版本 | 語法最簡潔 |
| Oracle | ROWNUM 巢狀查詢 / OFFSET FETCH | 11g 前 / 12c+ | 舊版寫法較繁瑣 |
掌握三者差異,即可在跨資料庫專案中游刃有餘地實作分頁功能。