| 數據庫 | 分頁語法 | 示例 |
|---|---|---|
| MySQL | LIMIT offset, count | SELECT * FROM t LIMIT 10, 20 (跳過 10 行,取 20 行) |
| Oracle | ROWNUM + 子查詢 | SELECT * FROM (SELECT t.*, ROWNUM rn FROM t) WHERE rn BETWEEN 11 AND 30 |
| Oracle 12c+ | OFFSET ... FETCH | SELECT * FROM t OFFSET 10 ROWS FETCH NEXT 20 ROWS ONLY |
| SQL Server | OFFSET ... FETCH (2012+) | SELECT * FROM t ORDER BY id OFFSET 10 ROWS FETCH NEXT 20 ROWS ONLY |
| PostgreSQL | LIMIT / OFFSET | SELECT * FROM t LIMIT 20 OFFSET 10 |
LIMIT 20 -- 前 20 行
LIMIT 10, 20 -- 跳過 10 行,取 20 行 (第 11-30 行)
LIMIT 20 OFFSET 10 -- 同義詞,可讀性更好
-- 錯誤:ROWNUM 在 WHERE 前賦值
SELECT * FROM t WHERE ROWNUM BETWEEN 11 AND 20; -- 永遠無結果
-- 正確:子查詢先賦值 ROWNUM
SELECT * FROM (
SELECT t.*, ROWNUM rn FROM t
) WHERE rn BETWEEN 11 AND 20;
MyBatis/Hibernate/JPA 內部根據 Dialect 自動轉換分頁語法,開發者使用統一 API:
// MyBatis
// Java
PageHelper.startPage(pageNum, pageSize);
List list = mapper.page();