首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

MySQL、SQL Server、Oracle 三大資料庫分頁查詢寫法大全

     編輯:更多程式設計知識

分頁查詢是資料庫應用核心需求,但不同資料庫語法差異極大。本文彙整 MySQL、SQL Server(2000/2005/2012+)、Oracle 三大主流資料庫的分頁寫法,含原理解析、效能比較與最佳實務。

MySQL:LIMIT 子句(最簡潔)

-- 前 10 筆
SELECT * FROM table_name WHERE ... LIMIT 10;
-- 或 LIMIT 0, 10

-- 第 11-30 筆(每頁 20 筆,第 2 頁)
SELECT * FROM table_name WHERE ... LIMIT 10, 20;

-- 通用公式:LIMIT (頁碼-1)*頁大小, 頁大小
  • 第一參數:偏移量(從 0 開始)
  • 第二參數:返回行數上限
  • MySQL 8.0+ 支援標準 SQL OFFSET ... LIMIT ... 語法

SQL Server:版本演進與最佳寫法

SQL Server 2000/2005:TOP + 子查詢

基本 TOP 寫法(效能較差,含 NOT IN):
SELECT TOP 10 * FROM table_name
WHERE id NOT IN (SELECT TOP 20 id FROM table_name ORDER BY id)
ORDER BY id
改良版:MAX(id) 分水嶺法(需主鍵唯一、非複合主鍵):
SELECT TOP @pageSize *
FROM table_name
WHERE id > (
    SELECT MAX(id) FROM (
        SELECT TOP ((@pageNum-1)*@pageSize) id FROM table_name ORDER BY id
    ) AS T
)
ORDER BY id

SQL Server 2005+:ROW_NUMBER() 窗口函數(標準解法)

WITH Paged AS (
    SELECT *,
           ROW_NUMBER() OVER (ORDER BY id) AS rn
    FROM table_name
)
SELECT * FROM Paged
WHERE rn BETWEEN (@pageNum-1)*@pageSize + 1 AND @pageNum*@pageSize
ORDER BY rn;
  • OVER (ORDER BY ...) 定義排序依據,支援複合主鍵
  • CTE(WITH 子句)可讀性佳,效能穩定

SQL Server 2012+:OFFSET-FETCH(ANSI SQL 標準)

SELECT * FROM table_name
ORDER BY id
OFFSET (@pageNum-1)*@pageSize ROWS
FETCH NEXT @pageSize ROWS ONLY;
  • 語法最簡潔,效能最佳化,推薦新專案使用

Oracle:ROWNUM 偽欄位與分析函數

方法一:ROW_NUMBER() 分析函數(支援複雜排序)

SELECT * FROM (
    SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) rn
    FROM table_name t
)
WHERE rn BETWEEN 21 AND 40;

方法二:雙層 ROWNUM(傳統寫法,效能較好)

SELECT * FROM (
    SELECT t.*, ROWNUM rn
    FROM table_name t
    WHERE ROWNUM <= 40
)
WHERE rn >= 21;
  • 內層 ROWNUM <= 40 讓 Oracle 提前停止掃描,減少 I/O
  • 無 ORDER BY 時速度極快,但結果順序不確定
  • 需排序時:內層加 ORDER BY,外層再套 ROWNUM

⚠️ Oracle 10g+ 注意:含 ORDER BY 分頁可能導致相同記錄跨頁重複

建議加上唯一鍵作為第二排序鍵:ORDER BY id, unique_col。

效能比較與選擇建議

資料庫推薦寫法適用版本備註
MySQLLIMIT / OFFSET-FETCH全版本 / 8.0+簡潔高效
SQL ServerOFFSET-FETCH2012+標準語法,最佳效能
SQL ServerROW_NUMBER()2005+相容舊版
Oracle雙層 ROWNUM全版本大資料量首選
OracleROW_NUMBER()10g+需複雜排序時

通用最佳實務

  • 分頁查詢必須帶 ORDER BY,否則結果順序不穩定
  • 深分頁(大偏移量)效能下降,考慮 Keyset Pagination(游標分頁):WHERE id > last_seen_id ORDER BY id LIMIT 20
  • 避免 SELECT *,僅查詢所需欄位
  • 確保排序欄位有索引
  • 總筆數查詢(COUNT(*))可分離快取,避免每頁重複計算

掌握各資料庫分頁寫法差異,能針對不同環境寫出高效、可維護的分頁邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved