首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL UNION 與 ORDER BY 共用報錯?正確用法與分頁技巧全解析

     編輯:MySQL 資料庫相關知識

很多開發者在使用 UNION 合併結果集時,習慣在每個子查詢後加 ORDER BY,結果報錯:Incorrect usage of UNION and ORDER BY。其實 UNION 允許 ORDER BY,但有嚴格位置限制。

核心規則

  1. ORDER BY 必須放在最後一個子查詢之後,且整條語句只能出現一次。
  2. 這個 ORDER BY 作用於 整個合併後的結果集,而非最後一個子查詢。

錯誤 vs 正確示例

-- ❌ 錯誤:子查詢中使用 ORDER BY
SELECT * FROM t WHERE id > 10 ORDER BY id DESC
UNION
SELECT * FROM t WHERE id < 9 ORDER BY id DESC;

-- ✅ 正確:ORDER BY 放在最後,對全量結果排序
SELECT * FROM t WHERE id > 10
UNION
SELECT * FROM t WHERE id < 9
ORDER BY id DESC;

深度驗證:UNION 不會保留子查詢順序

建立測試數據:

SELECT * FROM t WHERE id = 4
UNION
SELECT * FROM t WHERE id = 2
UNION
SELECT * FROM t WHERE id = 1
UNION
SELECT * FROM t WHERE id = 5
UNION
SELECT * FROM t WHERE id = 3;

若 UNION 只是簡單拼接,結果應為 4,2,1,5,3;實際返回卻是 1,2,3,4,5(主鍵順序)。證明 資料庫會統一優化整條語句,而非逐個執行子查詢再拼接。

UNION 結果集分頁:TOP/LIMIT 失效,用 ROWCOUNT 或子查詢

直接在第一個子查詢加 LIMIT 2 只會限制該子查詢輸出,不影響整體結果。解決方案:

方案一:外層包裹子查詢(通用、標準)

SELECT * FROM (
    SELECT * FROM t WHERE id = 4
    UNION
    SELECT * FROM t WHERE id = 1
    UNION
    SELECT * FROM t WHERE id = 2
    UNION
    SELECT * FROM t WHERE id = 3
    ORDER BY id ASC
) AS u LIMIT 2;

方案二:SET ROWCOUNT(SQL Server / Sybase 專用)

SET ROWCOUNT 2;
SELECT * FROM t WHERE id = 4
UNION
SELECT * FROM t WHERE id = 1
UNION
SELECT * FROM t WHERE id = 2
UNION
SELECT * FROM t WHERE id = 3
ORDER BY id ASC;

ROWCOUNT 作用於最終結果集,比 TOP 更規範。MySQL 請用方案一。

總結

  • UNION + ORDER BY:ORDER BY 僅能放末尾,排序整體結果。
  • 分頁/截取:必須用子查詢包裹整個 UNION 再 LIMIT。
  • 同理適用於 UNION ALL。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved