限制查詢回傳筆數是大表查詢、分頁顯示的基本需求。各資料庫語法不同,無統一標準。
| 資料庫 | 關鍵字 | 語法範例 | 備註 |
|---|---|---|---|
| SQL Server / MS Access | TOP | SELECT TOP 10 * FROM tableSELECT TOP 50 PERCENT * FROM table | 支援百分比 |
| MySQL / MariaDB / PostgreSQL / SQLite | LIMIT | SELECT * FROM table LIMIT 10SELECT * FROM table LIMIT 10 OFFSET 20 | OFFSET 可分頁 |
| Oracle 12c+ | FETCH FIRST | SELECT * FROM table FETCH FIRST 10 ROWS ONLY | 標準 SQL:2008 |
| Oracle 11g 及之前 | ROWNUM | SELECT * FROM table WHERE ROWNUM <= 10 | 需配合子查詢分頁 |
| DB2 | FETCH FIRST | SELECT * FROM table FETCH FIRST 10 ROWS ONLY |
SELECT * FROM Persons LIMIT 5;
SELECT * FROM Persons LIMIT 10 OFFSET 20; -- 第 3 頁,每頁 10 筆
SELECT * FROM Persons LIMIT 20, 10; -- 同 OFFSET 20 LIMIT 10
ROWNUM 是查詢結果產生時的流水號,不可直接用於範圍過濾(如 ROWNUM BETWEEN 11 AND 20 會無結果)。正確分頁需巢狀子查詢:
SELECT * FROM (
SELECT a.*, ROWNUM rn FROM (
SELECT * FROM Persons ORDER BY id
) a WHERE ROWNUM <= 20
) WHERE rn > 10;
Oracle 12c+ 建議直接用 FETCH FIRST。
+----+---------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+---------------+---------------------------+-------+---------+ | 1 | Google | https://www.google.cm/ | 1 | USA | | 2 | 淘寶 | https://www.taobao.com/ | 13 | CN | | 3 | 菜鳥教程 | https://www.runoob.com/ | 5000 | USA | | 4 | 微博 | https://weibo.com/ | 20 | CN | | 5 | Facebook | https://www.facebook.com/ | 3 | USA | | 7 | stackoverflow | https://stackoverflow.com/ | 0 | IND | +----+---------------+---------------------------+-------+---------+
SELECT * FROM Websites LIMIT 2;
輸出結果:

SELECT TOP 50 PERCENT * FROM Websites;
(需在 SQL Server 環境執行)
LIMIT 1000000, 10 需掃描前 100 萬筆。解法:
WHERE id > last_seen_id ORDER BY id LIMIT 10。COUNT(*) 另查,或用資料庫近似值(如 MySQL EXPLAIN rows)。現代資料庫(PostgreSQL、Oracle 12c+、DB2、SQL Server 2012+)支援標準語法:
SELECT * FROM table ORDER BY id OFFSET 20 ROWS FETCH FIRST 10 ROWS ONLY;
建議新專案採用標準語法,提升可移植性。