目錄
MySQL UNION 操作符詳細說明
1. UNION 操作符簡介
2. 基本語法
3. 使用規則和限制
4. UNION vs UNION ALL
5. 示例演示
6. 注意事項
MySQL UNION 操作符詳細說明
MySQL 中的 UNION
操作符用于合并兩個或多個 SELECT
語句的結果集,生成一個單一的結果集。它常用于從多個表或查詢中提取數據并進行整合。以下是其詳細說明,我將從基本概念、語法、規則、示例和注意事項等方面逐步解釋。
1. UNION 操作符簡介
UNION
操作符將多個SELECT
語句的結果合并為一個結果集。- 默認情況下,
UNION
會自動去除重復行(即結果中只保留唯一行)。如果不需要去重,可以使用UNION ALL
。 - 它適用于需要組合相關數據但存儲在不同表或查詢中的場景,例如合并銷售記錄或用戶數據。
2. 基本語法
UNION
的基本語法結構如下:
SELECT column1, column2, ... FROM table1
UNION [ALL]
SELECT column1, column2, ... FROM table2
[UNION [ALL]
SELECT column1, column2, ... FROM table3 ...]
[ORDER BY ...]
[LIMIT ...];
- 關鍵詞解釋:
SELECT
:每個UNION
必須包含至少兩個SELECT
語句。UNION
或UNION ALL
:UNION
去重,UNION ALL
保留所有行(包括重復)。ORDER BY
:可選項,用于對整個結果集排序(必須放在所有SELECT
語句后)。LIMIT
:可選項,限制返回的行數。
- 注意:所有
SELECT
語句的列數和順序必須一致。
3. 使用規則和限制
- 列數和順序:
- 每個
SELECT
語句必須返回相同數量的列,記為 $n$(其中 $n$ 是列數)。 - 對應列的數據類型必須兼容(例如,整數列不能與字符串列直接合并)。
- 每個
- 列名處理:
- 結果集的列名默認使用第一個
SELECT
語句的列名。 - 如果列名不同,后續
SELECT
的列名會被忽略。
- 結果集的列名默認使用第一個
- 重復行處理:
UNION
:自動去除重復行(基于所有列的值比較)。UNION ALL
:保留所有行,不檢查重復,性能更高。
- 其他限制:
UNION
不能用于合并INSERT
,UPDATE
, 或DELETE
語句。- 如果使用
ORDER BY
或LIMIT
,它們必須放在最后一個SELECT
語句后。 - 子查詢中可以使用
UNION
。
4. UNION vs UNION ALL
- 區別:
UNION
:執行去重操作,適用于需要唯一結果的場景。例如,合并用戶 ID 列表時去除重復。UNION ALL
:不執行去重,適用于需要完整數據或性能優先的場景。例如,合并日志記錄時保留所有條目。
- 性能考慮:
UNION
由于需要去重,可能比UNION ALL
慢,尤其當數據量大時。- 在不需要去重時,優先使用
UNION ALL
以提高效率。
5. 示例演示
以下是一個簡單示例,展示如何合并兩個表的數據:
- 場景:有兩個表
employees
和contractors
,都包含name
和salary
列。需要合并所有人員的姓名和工資。
-- 創建示例表(實際使用時無需此步)
CREATE TABLE employees (name VARCHAR(50),salary INT
);
INSERT INTO employees VALUES ('Alice', 50000), ('Bob', 60000);CREATE TABLE contractors (name VARCHAR(50),salary INT
);
INSERT INTO contractors VALUES ('Bob', 60000), ('Charlie', 70000);-- 使用 UNION 合并并去重
SELECT name, salary FROM employees
UNION
SELECT name, salary FROM contractors
ORDER BY salary DESC;
- 結果解釋:
- 原始數據:
employees
有 ('Alice', 50000), ('Bob', 60000);contractors
有 ('Bob', 60000), ('Charlie', 70000)。 UNION
輸出:去重后結果為 ('Alice', 50000), ('Bob', 60000), ('Charlie', 70000)。注意 'Bob' 只出現一次。- 如果使用
UNION ALL
:結果為 ('Alice', 50000), ('Bob', 60000), ('Bob', 60000), ('Charlie', 70000)。
- 原始數據:
6. 注意事項
- 性能優化:
- 對大表使用
UNION
時,確保SELECT
語句高效(例如,添加索引)。 - 優先用
UNION ALL
除非需要去重。
- 對大表使用
- 排序和分頁:
ORDER BY
必須放在最后,影響整個結果集。例如:SELECT name FROM table1 UNION SELECT name FROM table2 ORDER BY name;
LIMIT
同樣放在最后,限制總行數。
- 數據類型兼容:
- 如果列類型不兼容(如
INT
和VARCHAR
),MySQL 會嘗試隱式轉換,但可能導致錯誤或數據丟失。建議手動轉換,例如:SELECT CAST(age AS CHAR) AS info FROM users UNION SELECT name FROM employees;
- 如果列類型不兼容(如
- 錯誤處理:
- 常見錯誤包括列數不匹配(Error 1222)或類型不兼容(Error 1265)。檢查每個
SELECT
語句的結構。
- 常見錯誤包括列數不匹配(Error 1222)或類型不兼容(Error 1265)。檢查每個
- 適用場景:
- 適合數據報表、分析查詢。
- 不適合高頻事務處理,因為它可能影響性能。
通過以上說明,您應該能理解 UNION
操作符的核心用法。在實際應用中,根據需求選擇 UNION
或 UNION ALL
,并注意優化查詢。