MySQL UNION 操作符的使用小結(jié)
MySQL 中的 UNION 操作符用于合并兩個(gè)或多個(gè) SELECT 語句的結(jié)果集,生成一個(gè)單一的結(jié)果集。它常用于從多個(gè)表或查詢中提取數(shù)據(jù)并進(jìn)行整合。以下是其詳細(xì)說明,我將從基本概念、語法、規(guī)則、示例和注意事項(xiàng)等方面逐步解釋。
1.UNION 操作符簡(jiǎn)介
UNION操作符將多個(gè)SELECT語句的結(jié)果合并為一個(gè)結(jié)果集。- 默認(rèn)情況下,
UNION會(huì)自動(dòng)去除重復(fù)行(即結(jié)果中只保留唯一行)。如果不需要去重,可以使用UNION ALL。 - 它適用于需要組合相關(guān)數(shù)據(jù)但存儲(chǔ)在不同表或查詢中的場(chǎng)景,例如合并銷售記錄或用戶數(shù)據(jù)。
2.基本語法
UNION 的基本語法結(jié)構(gòu)如下:
SELECT column1, column2, ... FROM table1 UNION [ALL] SELECT column1, column2, ... FROM table2 [UNION [ALL] SELECT column1, column2, ... FROM table3 ...] [ORDER BY ...] [LIMIT ...];
- 關(guān)鍵詞解釋:
SELECT:每個(gè)UNION必須包含至少兩個(gè)SELECT語句。UNION或UNION ALL:UNION去重,UNION ALL保留所有行(包括重復(fù))。ORDER BY:可選項(xiàng),用于對(duì)整個(gè)結(jié)果集排序(必須放在所有SELECT語句后)。LIMIT:可選項(xiàng),限制返回的行數(shù)。
- 注意:所有
SELECT語句的列數(shù)和順序必須一致。
3.使用規(guī)則和限制
- 列數(shù)和順序:
- 每個(gè)
SELECT語句必須返回相同數(shù)量的列,記為 $n$(其中 $n$ 是列數(shù))。 - 對(duì)應(yīng)列的數(shù)據(jù)類型必須兼容(例如,整數(shù)列不能與字符串列直接合并)。
- 每個(gè)
- 列名處理:
- 結(jié)果集的列名默認(rèn)使用第一個(gè)
SELECT語句的列名。 - 如果列名不同,后續(xù)
SELECT的列名會(huì)被忽略。
- 結(jié)果集的列名默認(rèn)使用第一個(gè)
- 重復(fù)行處理:
UNION:自動(dòng)去除重復(fù)行(基于所有列的值比較)。UNION ALL:保留所有行,不檢查重復(fù),性能更高。
- 其他限制:
UNION不能用于合并INSERT,UPDATE, 或DELETE語句。- 如果使用
ORDER BY或LIMIT,它們必須放在最后一個(gè)SELECT語句后。 - 子查詢中可以使用
UNION。
4.UNION vs UNION ALL
- 區(qū)別:
UNION:執(zhí)行去重操作,適用于需要唯一結(jié)果的場(chǎng)景。例如,合并用戶 ID 列表時(shí)去除重復(fù)。UNION ALL:不執(zhí)行去重,適用于需要完整數(shù)據(jù)或性能優(yōu)先的場(chǎng)景。例如,合并日志記錄時(shí)保留所有條目。
- 性能考慮:
UNION由于需要去重,可能比UNION ALL慢,尤其當(dāng)數(shù)據(jù)量大時(shí)。- 在不需要去重時(shí),優(yōu)先使用
UNION ALL以提高效率。
5.示例演示
以下是一個(gè)簡(jiǎn)單示例,展示如何合并兩個(gè)表的數(shù)據(jù):
- 場(chǎng)景:有兩個(gè)表
employees和contractors,都包含name和salary列。需要合并所有人員的姓名和工資。
-- 創(chuàng)建示例表(實(shí)際使用時(shí)無需此步)
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;
- 結(jié)果解釋:
- 原始數(shù)據(jù):
employees有 ('Alice', 50000), ('Bob', 60000);contractors有 ('Bob', 60000), ('Charlie', 70000)。 UNION輸出:去重后結(jié)果為 ('Alice', 50000), ('Bob', 60000), ('Charlie', 70000)。注意 'Bob' 只出現(xiàn)一次。- 如果使用
UNION ALL:結(jié)果為 ('Alice', 50000), ('Bob', 60000), ('Bob', 60000), ('Charlie', 70000)。
- 原始數(shù)據(jù):
6.注意事項(xiàng)
- 性能優(yōu)化:
- 對(duì)大表使用
UNION時(shí),確保SELECT語句高效(例如,添加索引)。 - 優(yōu)先用
UNION ALL除非需要去重。
- 對(duì)大表使用
- 排序和分頁:
ORDER BY必須放在最后,影響整個(gè)結(jié)果集。例如:SELECT name FROM table1 UNION SELECT name FROM table2 ORDER BY name;
LIMIT同樣放在最后,限制總行數(shù)。
- 數(shù)據(jù)類型兼容:
- 如果列類型不兼容(如
INT和VARCHAR),MySQL 會(huì)嘗試隱式轉(zhuǎn)換,但可能導(dǎo)致錯(cuò)誤或數(shù)據(jù)丟失。建議手動(dòng)轉(zhuǎn)換,例如:SELECT CAST(age AS CHAR) AS info FROM users UNION SELECT name FROM employees;
- 如果列類型不兼容(如
- 錯(cuò)誤處理:
- 常見錯(cuò)誤包括列數(shù)不匹配(Error 1222)或類型不兼容(Error 1265)。檢查每個(gè)
SELECT語句的結(jié)構(gòu)。
- 常見錯(cuò)誤包括列數(shù)不匹配(Error 1222)或類型不兼容(Error 1265)。檢查每個(gè)
- 適用場(chǎng)景:
- 適合數(shù)據(jù)報(bào)表、分析查詢。
- 不適合高頻事務(wù)處理,因?yàn)樗赡苡绊懶阅堋?/li>
通過以上說明,您應(yīng)該能理解 UNION 操作符的核心用法。在實(shí)際應(yīng)用中,根據(jù)需求選擇 UNION 或 UNION ALL,并注意優(yōu)化查詢。
到此這篇關(guān)于MySQL UNION 操作符的使用小結(jié)的文章就介紹到這了,更多相關(guān)MySQL UNION 操作符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Centos 7下使用RPM包安裝MySQL 5.7.9教程
這篇文章主要為大家詳細(xì)介紹了Centos 7下使用RPM包安裝MySQL 5.7.9的教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
MySQL中distinct和count(*)的使用方法比較
這篇文章主要針對(duì)MySQL中distinct和count(*)的使用方法比較,對(duì)兩者之間的使用方法、效率進(jìn)行了詳細(xì)分析,感興趣的小伙伴們可以參考一下2015-11-11
mysql報(bào)錯(cuò)ERROR 2003(HY000)問題及解決過程
這段文章主要描述了在修改MySQL配置文件后遇到連接故障的解決過程,通過重新啟動(dòng)服務(wù)、重新注冊(cè)服務(wù)以及恢復(fù)數(shù)據(jù)目錄等步驟成功解決2026-06-06
MySQL中基本的用戶和權(quán)限管理方法小結(jié)
這篇文章主要介紹了MySQL中基本的用戶和權(quán)限管理方法小結(jié),是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08
MySQL中必須了解的13個(gè)關(guān)鍵字總結(jié)
這篇文章主要為大家詳細(xì)介紹了MySQL中必須了解學(xué)會(huì)的13個(gè)關(guān)鍵字,文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們掌握MySQL有一定的幫助,需要的可以了解下2023-09-09
MySQL中CURRENT_TIMESTAMP時(shí)間戳的使用詳解
這篇文章主要給大家介紹了關(guān)于MySQL中CURRENT_TIMESTAMP時(shí)間戳的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03

