| 功能 | SQL Server (T-SQL) | MySQL | PostgreSQL / Oracle 12c+ |
|---|---|---|---|
| 前 N 行 | SELECT TOP (N) * FROM tbl ORDER BY id; | SELECT * FROM tbl ORDER BY id LIMIT N; | SELECT * FROM tbl ORDER BY id FETCH FIRST N ROWS ONLY; |
| 跳過 M 行取 N 行 (分頁) | SELECT * FROM tbl ORDER BY id OFFSET M ROWS FETCH NEXT N ROWS ONLY; (2012+) | SELECT * FROM tbl ORDER BY id LIMIT N OFFSET M; 或 LIMIT M, N | SELECT * FROM tbl ORDER BY id OFFSET M LIMIT N; |
| 帶變量參數化 | OFFSET @offset ROWS FETCH NEXT @page_size ROWS ONLY | LIMIT ?, ? (Prepared Statement) | 同標準 |
-- SQL Server 2012+
SELECT * FROM users ORDER BY user_id OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY;
-- MySQL / MariaDB / PostgreSQL / SQLite
SELECT * FROM users ORDER BY user_id LIMIT 3 OFFSET 3;
-- 或 MySQL 專用簡寫
SELECT * FROM users ORDER BY user_id LIMIT 3, 3; -- OFFSET, COUNT
OFFSET 1000000 LIMIT 10 要求引擎**掃描並丟棄前 100 萬行**,隨著偏移量增大線性變慢。
WHERE (sort_col, pk) > (last_sort, last_pk) ORDER BY sort_col, pk LIMIT N。**無 OFFSET 掃描,深翻頁性能恆定**。SELECT * FROM tbl
WHERE id >= (SELECT id FROM tbl ORDER BY id LIMIT 1000000, 1)
ORDER BY id LIMIT 10;
子查詢只掃描索引定位起始 ID,外層主鍵範圍查詢極快。
SELECT * FROM tbl INNER JOIN (SELECT id FROM tbl ORDER BY id LIMIT 1000000, 10) t2 USING (id) — 內層只掃描索引取 ID,外層回表少量行。TOP (N) → LIMIT N;OFFSET ... FETCH → LIMIT ... OFFSET ...。ORDER BY 的分頁結果**不確定**,兩者皆要求。**遷移時補全業務唯一排序鍵**。TOP (N) WITH TIES 保留並列值,MySQL 無直接對應,**需窗口函數** RANK() OVER (ORDER BY ...) <= N (8.0+)。TOP (10) PERCENT,MySQL 需計算總數 COUNT(*) * 0.1 再 LIMIT。setMaxRows 對應 LIMIT,但分頁仍需手寫 LIMIT ?, ?。TOP (SQL Server) / FETCH (標準) / LIMIT (MySQL/PG) 核心邏輯一致:**排序 + 截取**。分頁核心痛點在 **OFFSET 掃描**,跨數據庫通用優化鍵是 **Keyset Pagination** 或 **覆蓋索引定位**。遷移時注意 ORDER BY 完整性、WITH TIES 等高級特性的功能對等實現。