開發 MIS 或 Web 應用時,面對大量資料不可一次撈取所有記錄,需採用分頁查詢。本文整理 SQL Server、Oracle、MySQL 三大資料庫最常用的分頁語法,以「從第 M 筆開始取 N 筆」為例說明。
SELECT *
FROM (
SELECT TOP N *
FROM (
SELECT TOP (M + N - 1) * FROM 資料表 ORDER BY 主鍵 DESC
) t1
) t2
ORDER BY 主鍵 ASC
範例: 從 Sys_option(主鍵 sys_id)第 10 筆起取 20 筆:
SELECT *
FROM (
SELECT TOP 20 *
FROM (
SELECT TOP 29 * FROM Sys_option ORDER BY sys_id DESC
) t1
) t2
ORDER BY sys_id ASC
SELECT *
FROM (
SELECT ROWNUM r, t1.* FROM 資料表 t1 WHERE ROWNUM < M + N
) t2
WHERE t2.r >= M
範例: 同樣從第 10 筆取 20 筆:
SELECT *
FROM (
SELECT ROWNUM R, t1.* FROM Sys_option WHERE ROWNUM < 30
) t2
WHERE t2.R >= 10
SELECT * FROM 資料表 LIMIT M, N
範例:
SELECT * FROM sys_option LIMIT 10, 20
| 資料庫 | 關鍵字 | 語法複雜度 | 適用版本 |
|---|---|---|---|
| SQL Server | TOP 巢狀 | 較高 | 2000/2005/2008+ |
| Oracle | ROWNUM | 中等 | 8i/9i/10g/11g+ |
| MySQL | LIMIT | 最低 | 3.23+ |
實務上建議搭配 ORDER BY 確保分頁順序穩定;SQL Server 2012+ 可直接使用 OFFSET ... FETCH 簡化語法。