當需將多個結構相同的查詢結果合併為單一結果集時,UNION 是標準 SQL 解法。
SELECT col1, col2 FROM table1
UNION [ALL]
SELECT col1, col2 FROM table2
...;
強制要求:
SELECT **欄位數量相同**SELECT 的別名作為結果集欄位名| 特性 | UNION | UNION 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;
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 ... LIMIT 10 下推到各分支| 方案 | 適用場景 | 優缺點 |
|---|---|---|
| UNION ALL | 同結構多表/分表查詢 | 標準、高效、可攜 |
| MERGE 引擎表 (MyISAM) | 固定分表結構 | 舊技術、限制多、不推薦新專案 |
| Partitioning 分區表 | 單大表邏輯分區 | 透明查詢、維護成本高、8.0+ 建議 |
| 應用層合併 | 異構資料源、複雜邏輯 | 網路開銷大、記憶體壓力、最後手段 |
核心原則: UNION ALL 是合併同結構結果集的**首選**,去重需求極少見且可在應用層處理。分表查詢配合 UNION ALL + 覆蓋索引,是 MySQL 大數據量分頁/報表的經典架構模式。