UNION 與 UNION ALL 均用於將多個 SELECT 結果集合併,核心差異在於**是否去重**。
CREATE TABLE student (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE student1 (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SELECT id, name FROM student
UNION ALL
SELECT id, name FROM student1;
結果:保留所有行,包含重複的 id=1, name='Jack'。
SELECT id, name FROM student
UNION ALL
SELECT 0 AS id, name FROM student1;
結果:student1 所有行的 id 顯示為 0,便於區分來源。
SELECT id, name FROM student
UNION
SELECT id, name FROM student1;
結果:重複行(如 id=2, name='Jack')僅保留一行,**來源為 student1 的 Jack 被去除**。
| 操作 | 去重 | 效能 | 適用場景 |
|---|---|---|---|
| UNION | 是(排序+唯一) | 較慢 | 業務要求結果唯一、資料量較小 |
| UNION ALL | 否 | 快(無排序) | 已知無重複、或允許重複、大數據量合並 |
SELECT 必須**欄位數相同**、**對應位置類型兼容**。ORDER BY、LIMIT 需加括號包裹整個 UNION,或放在最後一個 SELECT(MySQL 8.0+ 支援全局 ORDER BY)。CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci。