首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

三大主流數據庫分頁查詢語句對比:MySQL、SQL Server、Oracle

     編輯:MySQL 綜合教學

三大主流數據庫分頁查詢語句對比:MySQL、SQL Server、Oracle

分頁查詢是 Web 應用核心需求,但不同數據庫語法差異巨大。本文整理 MySQL、SQL Server、Oracle 三大主流數據庫的標準分頁寫法。

1. MySQL:LIMIT 子句(最簡潔)

SELECT * FROM table_name 
LIMIT (page_no - 1) * page_size, page_size;
  • page_no:當前頁碼(從 1 開始)
  • page_size:每頁條數
  • 偏移量從 0 開始,故第一頁為 LIMIT 0, 10

2. SQL Server:OFFSET-FETCH(2012+)或 TOP+NOT IN(舊版)

現代寫法(SQL Server 2012+ 推薦)

SELECT * 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 保證確定性
  • 子查詢性能隨頁碼增大而下降,大翻頁慎用

3. Oracle:ROWNUM 嵌套查詢(經典)或 OFFSET-FETCH(12c+)

經典寫法(通用版本)

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;
  • 內層排序 → 中層賦予 ROWNUM → 外層篩選範圍
  • ROWNUM 從 1 起算,且必須在排序後生成

現代寫法(Oracle 12c+)

SELECT * FROM table_name 
ORDER BY id 
OFFSET (page_no - 1) * page_size ROWS 
FETCH NEXT page_size ROWS ONLY;

性能優化通用建議

  • 避免大偏移量:深分頁(如第 10000 頁)導致掃描大量無用行。改用「游標分頁」:WHERE id > last_max_id LIMIT page_size。
  • 覆蓋索引:查詢列僅包含索引列,避免回表。
  • 避免 SELECT *:只取需要列,減少網絡傳輸與 I/O。

語法對比總結表

數據庫核心語法版本要求備註
MySQLLIMIT offset, count所有版本最簡潔,性能較好
SQL ServerOFFSET ... FETCH2012+標準 SQL,推薦
SQL ServerTOP + NOT IN所有版本舊版兼容,大翻頁慢
OracleROWNUM 嵌套所有版本經典寫法,較繁瑣
OracleOFFSET ... FETCH12c+標準 SQL,簡潔

掌握各數據庫分頁語法差異,結合業務場景選擇優化策略,是後端開發必備基本功。

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