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

Oracle、MySQL、SQL Server 三大資料庫分頁查詢語法差異完整比較

     編輯:關於SqlServer

分頁查詢是應用系統中最常見的需求,但 Oracle、MySQL、SQL Server 三大主流資料庫的語法截然不同。本文以「每頁 10 筆、查詢第 2 頁」為例,條列三者核心語法與實際 SQL 範例,供開發快速參考。

共用參數定義

  • currentPage:目前頁碼(從 1 起算)
  • pageRecord:每頁筆數

一、SQL Server(T-SQL)

核心邏輯: 使用 TOP 搭配 NOT IN 子查詢排除前 N 筆。

-- 通用範本
SELECT TOP @pageRecord * 
FROM addressbook 
WHERE id NOT IN (
    SELECT TOP (@currentPage - 1) * @pageRecord id 
    FROM addressbook
)

第 2 頁實際 SQL(每頁 10 筆):

SELECT TOP 10 * 
FROM addressbook 
WHERE id NOT IN (
    SELECT TOP 10 id 
    FROM addressbook
)

註:SQL Server 2012+ 可使用 OFFSET ... FETCH 標準語法,效能更佳。

二、MySQL

核心邏輯: 使用 LIMIT offset, count,直觀易懂。

-- 通用範本
SELECT * FROM addressbook 
LIMIT (@currentPage - 1) * @pageRecord, @pageRecord

第 2 頁實際 SQL:

SELECT * FROM addressbook LIMIT 10, 10

三、Oracle

核心邏輯: 利用 ROWNUM 偽欄位搭配巢狀子查詢「先取前 N 筆,再排除前 M 筆」。

-- 通用範本
SELECT * FROM (
    SELECT ROWNUM rn, t.* 
    FROM addressbook t 
    WHERE ROWNUM <= @currentPage * @pageRecord
) 
WHERE rn > (@currentPage - 1) * @pageRecord

第 2 頁實際 SQL:

SELECT * FROM (
    SELECT ROWNUM rn, t.* 
    FROM addressbook t 
    WHERE ROWNUM <= 20
) 
WHERE rn > 10

註:Oracle 12c+ 支援標準 OFFSET ... FETCH,寫法與 PostgreSQL、SQL Server 2012+ 一致。

快速對照表

資料庫關鍵字句適用版本備註
SQL ServerTOP + NOT IN / OFFSET FETCH2005+ / 2012+新版建議用 OFFSET FETCH
MySQLLIMIT offset, count所有版本語法最簡潔
OracleROWNUM 巢狀查詢 / OFFSET FETCH11g 前 / 12c+舊版寫法較繁瑣

掌握三者差異,即可在跨資料庫專案中游刃有餘地實作分頁功能。

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