分頁查詢是 Web 應用核心需求,但不同數據庫語法差異巨大。本文整理 MySQL、SQL Server、Oracle 三大主流數據庫的標準分頁寫法。
SELECT * FROM table_name LIMIT (page_no - 1) * page_size, page_size;
page_no:當前頁碼(從 1 開始)page_size:每頁條數LIMIT 0, 10SELECT * FROM table_name ORDER BY id OFFSET (page_no - 1) * page_size ROWS FETCH NEXT page_size ROWS ONLY;
SELECT TOP page_size * FROM table_name
WHERE id NOT IN (
SELECT TOP (page_no - 1) * page_size id FROM table_name ORDER BY id
) ORDER BY id;
ORDER BY 保證確定性SELECT * FROM (
SELECT A.*, ROWNUM RN FROM (
SELECT * FROM table_name ORDER BY id
) A WHERE ROWNUM <= page_no * page_size
) WHERE RN >= (page_no - 1) * page_size + 1;
SELECT * FROM table_name ORDER BY id OFFSET (page_no - 1) * page_size ROWS FETCH NEXT page_size ROWS ONLY;
WHERE id > last_max_id LIMIT page_size。| 數據庫 | 核心語法 | 版本要求 | 備註 |
|---|---|---|---|
| MySQL | LIMIT offset, count | 所有版本 | 最簡潔,性能較好 |
| SQL Server | OFFSET ... FETCH | 2012+ | 標準 SQL,推薦 |
| SQL Server | TOP + NOT IN | 所有版本 | 舊版兼容,大翻頁慢 |
| Oracle | ROWNUM 嵌套 | 所有版本 | 經典寫法,較繁瑣 |
| Oracle | OFFSET ... FETCH | 12c+ | 標準 SQL,簡潔 |
掌握各數據庫分頁語法差異,結合業務場景選擇優化策略,是後端開發必備基本功。