萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL UNION 合併兩表同結構欄位:語法、去重與效能優化

UNION / UNION ALL:多結果集垂直合併的標準方案

當需將多個結構相同的查詢結果合併為單一結果集時,UNION 是標準 SQL 解法。

基本語法與規則


SELECT col1, col2 FROM table1
UNION [ALL]
SELECT col1, col2 FROM table2
...;

強制要求:

  • 所有 SELECT **欄位數量相同**
  • 對應位置**資料型別相容** (數值/字串/日期)
  • 第一個 SELECT 的別名作為結果集欄位名

UNION vs UNION ALL 核心差異

特性UNIONUNION ALL
去重✅ 移除重複行 (排序+比較)❌ 保留所有行
效能較慢 (臨時表+排序+去重)**極快** (單純串聯)
適用場景業務要求唯一結果集明知無重複、或允許重複、效能優先

實戰範例


-- 熱銷商品 + 新品 合併推薦 (去重)
(SELECT ts.products_id, ts.sort FROM top_selling ts)
UNION
(SELECT na.products_id, na.sort FROM new_arrival na)
ORDER BY RAND()
LIMIT 4;

-- 日誌分表查詢合併 (不去重,效能優先)
SELECT * FROM logs_202301
UNION ALL
SELECT * FROM logs_202302
UNION ALL
SELECT * FROM logs_202303
WHERE created_at > '2023-01-01';

進階用法

加欄位標識來源


SELECT 'top_selling' AS source, products_id, sort FROM top_selling
UNION ALL
SELECT 'new_arrival' AS source, products_id, sort FROM new_arrival;

配合子查詢/CTE 複雜邏輯


WITH ranked AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales DESC) rn
  FROM products
)
SELECT * FROM ranked WHERE rn <= 10
UNION ALL
SELECT * FROM featured_products;

效能優化建議

  • 預設用 UNION ALL:除非確定需要去重,否則無腦加 ALL
  • 子查詢獨立優化**:每個 SELECT 獨立 EXPLAIN,確保用上索引
  • 避免 ORDER BY 在子查詢**:外層統一排序,減少多次排序開銷
  • LIMIT 下推**:MySQL 8.0+ 支援 UNION ... LIMIT 10 下推到各分支

替代方案對比

方案適用場景優缺點
UNION ALL同結構多表/分表查詢標準、高效、可攜
MERGE 引擎表 (MyISAM)固定分表結構舊技術、限制多、不推薦新專案
Partitioning 分區表單大表邏輯分區透明查詢、維護成本高、8.0+ 建議
應用層合併異構資料源、複雜邏輯網路開銷大、記憶體壓力、最後手段

核心原則: UNION ALL 是合併同結構結果集的**首選**,去重需求極少見且可在應用層處理。分表查詢配合 UNION ALL + 覆蓋索引,是 MySQL 大數據量分頁/報表的經典架構模式。

copyright © 萬盛學電腦網 all rights reserved