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

MySQL UNION 與 UNION ALL 完整對比:語法、去重機制、全站搜尋實戰案例

     編輯:MySQL 綜合教學

核心差異

特性UNIONUNION ALL
去重是(排序+唯一)否
效能慢(臨時表+排序+唯一檢查)快(直接追加)
結果行數≤ 所有分支行數之和= 所有分支行數之和
適用場景分支間可能重複,需唯一結果分支業務互斥、或允許重複

語法規則

  • 所有 SELECT 欄位數、順序、型別相容
  • 結果欄名以第一個 SELECT為準
  • ORDER BY / LIMIT 只能在最外層,子查詢需加括號

教學範例:中美員工表

SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA;

結果(7 行,Carter, Thomas 僅保留 1 筆):

SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA;

結果(8 行,Carter, Thomas 出現 2 次):

-- 搜尋關鍵字「調整圖片」
(SELECT id, subject FROM article WHERE active=1 AND subject LIKE '%調整圖片%' ORDER BY add_time DESC)
UNION ALL
(SELECT id, class_name AS subject FROM web_class WHERE active=1 AND class_name LIKE '%調整圖片%' ORDER BY class_id DESC)
UNION
(SELECT id, subject FROM article WHERE active=1 AND (subject LIKE '%調整%' OR subject LIKE '%圖片%') ORDER BY add_time DESC);

邏輯解析

  1. 分支 1:文章精確匹配
  2. 分支 2:分類精確匹配(不同表,業務互斥 → UNION ALL)
  3. 分支 3:文章分詞兜底(包含分支 1 結果 → UNION 去重)

效能優化建議

  1. 預設用 UNION ALL,除非確知有重複且業務要求去重
  2. 大結果集 UNION 會產生大臨時表並排序,極耗記憶體/磁碟
  3. 可用 EXPLAIN 觀察 select_type=UNION RESULT 的 type=ALL、rows 大小
  4. MySQL 8.0:UNION 可下推條件到分支,減少臨時表寫入量

小結

UNION = 去重、UNION ALL = 直疊。全站搜尋案例展示:異表互斥用 ALL、同表兜底用 DISTINCT。養成「先寫 ALL,確認有重複再改 UNION」習慣,效能穩健。

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