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

SQL 面試必考:分頁查詢第 31-40 行記錄(SQL Server/Oracle/MySQL 多方言寫法)

     編輯:MySQL 綜合教學

題目

表 table1,主鍵 ID 自增但不連續。要求查詢第 31-40 行記錄(按 ID 排序)。

標準 SQL:2008 (MySQL 8.0+, PostgreSQL, Oracle 12c+, SQL Server 2012+)

SELECT * FROM `table1`
ORDER BY `ID`
OFFSET 30 ROWS FETCH NEXT 10 ROWS ONLY;

MySQL 5.x / MariaDB

SELECT * FROM `table1`
ORDER BY `ID`
LIMIT 10 OFFSET 30;

SQL Server 2008/2012 (TOP + 子查詢)

SELECT TOP 10 * FROM (
    SELECT TOP 40 * FROM `table1` ORDER BY `ID`
) AS t ORDER BY `ID` DESC;

Oracle 11g 及以下 (ROWNUM)

SELECT * FROM (
    SELECT a.*, ROWNUM rn FROM (
        SELECT * FROM `table1` ORDER BY `ID`
    ) a WHERE ROWNUM <= 40
) WHERE rn > 30;

效能提醒

  • 大偏移量(如 OFFSET 1000000)會導致全掃描前 N 行,效能急劇下降。
  • 優化方案:游標分頁(記住上一頁最大 ID)→ WHERE id > last_max_id ORDER BY id LIMIT 10。
  • 或使用 延遲關聯:SELECT * FROM t JOIN (SELECT id FROM t ORDER BY id LIMIT 10 OFFSET 30) tmp USING (id) 減少回表。

面試加分點

  1. 說明 LIMIT/OFFSET 與 OFFSET/FETCH 標準化演進。
  2. 指出大偏移量效能問題並給出游標/延遲關聯優化方案。
  3. 補充 ROW_NUMBER() 窗口函數通用寫法(MySQL 8.0+)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved