SELECT col1, col2 FROM table1 WHERE condition
UNION [ALL]
SELECT col1, col2 FROM table2 WHERE condition;
UNION:去重(預設),需排序比較,較慢UNION ALL:保留重複,直接合併結果集,**效能高得多**,無去重需求時優先使用若兩表結構不同,直接 UNION 會報錯:The used SELECT statements have a different number of columns。
SELECT password, username, email, ip
FROM table1
WHERE username LIKE '123'
UNION ALL
SELECT password, username, '', '' -- 用空字串佔位 email、ip
FROM table2
WHERE username LIKE '123';
SELECT id, name, email, created_at, status
FROM users_old
WHERE status = 1
UNION ALL
SELECT id, name, email, created_at, 1 AS status -- 新表無 status,給預設值 1
FROM users_new
WHERE is_active = 1;
SELECT col_a, col_b, col_c, col_d
FROM table_a
UNION ALL
SELECT col_a, col_b, NULL AS col_c, NULL AS col_d
FROM table_b;
建議: 明確指定別名(AS col_c),避免驅動程式映射錯誤。
(SELECT ... LIMIT 1000) UNION ALL (SELECT ... LIMIT 1000) 避免全表掃描UNION ALL 不支援 LIMIT offset, rows 高效分頁,需應用層游標式分頁| 操作 | 耗時 | 臨時表 | 排序 |
|---|---|---|---|
| UNION | 3.2s | 是 | filesort |
| UNION ALL | 0.4s | 否 | 無 |