MySQL 中 UNION 的用法詳解
在 MySQL 中,UNION 是一個非常常用的查詢關(guān)鍵字,主要用于合并多個 SELECT 查詢的結(jié)果集。
很多初學(xué)者容易把 UNION 和 JOIN 混淆。簡單來說:
UNION是把結(jié)果上下拼接JOIN是把表數(shù)據(jù)左右關(guān)聯(lián)
本文就來系統(tǒng)總結(jié)一下 MySQL 中 UNION 的基本用法、注意事項以及常見場景。
一、UNION 是什么?
UNION 用于合并兩個或多個 SELECT 語句的查詢結(jié)果。
基本語法如下:
SELECT 列1, 列2 FROM 表A UNION SELECT 列1, 列2 FROM 表B;
例如:
SELECT name, phone FROM customers UNION SELECT name, phone FROM suppliers;
這條 SQL 的意思是:
從 customers 表和 suppliers 表中分別查詢 name 和 phone 字段,然后把兩個查詢結(jié)果合并成一個結(jié)果集。
二、UNION 默認(rèn)會去重
在 MySQL 中,UNION 默認(rèn)會去掉重復(fù)的數(shù)據(jù)行。
例如:
SELECT 1 AS id UNION SELECT 1 AS id;
查詢結(jié)果為:
id -- 1
雖然兩個查詢都返回了 1,但是最終結(jié)果中只保留了一行。
也就是說:
UNION
等價于:
UNION DISTINCT
默認(rèn)行為就是去重。
三、UNION ALL 不會去重
如果希望保留所有查詢結(jié)果,包括重復(fù)數(shù)據(jù),可以使用 UNION ALL。
例如:
SELECT 1 AS id UNION ALL SELECT 1 AS id;
查詢結(jié)果為:
id
--
1
1
可以看到,兩條重復(fù)的數(shù)據(jù)都被保留下來了。
在實際開發(fā)中,如果你確定數(shù)據(jù)不會重復(fù),或者業(yè)務(wù)上允許重復(fù),建議優(yōu)先使用 UNION ALL。
原因是:UNION ALL 不需要進(jìn)行去重操作,性能通常比 UNION 更好。
四、UNION 的使用要求
使用 UNION 時,需要注意幾個基本規(guī)則。
1. 每個 SELECT 查詢的列數(shù)必須相同
正確寫法:
SELECT id, name FROM users UNION SELECT id, name FROM admins;
錯誤寫法:
SELECT id, name FROM users UNION SELECT id FROM admins;
第一個查詢返回兩列,第二個查詢只返回一列,列數(shù)不一致,MySQL 無法合并結(jié)果。
2. 對應(yīng)列的數(shù)據(jù)類型應(yīng)該兼容
例如:
SELECT id, name FROM users UNION SELECT id, title FROM articles;
這條 SQL 在語法上可能沒有問題,因為兩個查詢都返回兩列。
但是從業(yè)務(wù)含義上看,第二列一邊是用戶名 name,一邊是文章標(biāo)題 title,語義可能并不統(tǒng)一。
因此,在使用 UNION 時,不僅要保證列數(shù)一致,也要盡量保證對應(yīng)列的數(shù)據(jù)含義一致。
3. 最終結(jié)果的列名取第一個 SELECT 的列名
例如:
SELECT id AS user_id, name AS user_name FROM users UNION SELECT id AS admin_id, name AS admin_name FROM admins;
最終結(jié)果中的列名是:
user_id | user_name
而不是:
admin_id | admin_name
也就是說,UNION 最終結(jié)果集的字段名由第一個 SELECT 決定。
五、UNION 中的 ORDER BY 和 LIMIT
如果想對合并后的最終結(jié)果排序,可以把 ORDER BY 寫在最后。
例如:
SELECT id, name FROM users UNION ALL SELECT id, name FROM admins ORDER BY id DESC;
這里的 ORDER BY id DESC 是對兩個查詢合并之后的整體結(jié)果進(jìn)行排序。
如果想讓每個查詢內(nèi)部先排序或限制條數(shù),可以使用括號。
例如:
(SELECT id, name FROM users ORDER BY id DESC LIMIT 10) UNION ALL (SELECT id, name FROM admins ORDER BY id DESC LIMIT 10) ORDER BY id DESC;
這條 SQL 的含義是:
- 先從
users表中取id最大的 10 條數(shù)據(jù); - 再從
admins表中取id最大的 10 條數(shù)據(jù); - 最后把兩部分結(jié)果合并,并按照
id倒序排序。
六、UNION 的常見使用場景
假設(shè)有兩張學(xué)生表:
students_2024 students_2025
現(xiàn)在想把兩個年份的學(xué)生數(shù)據(jù)合并查詢出來,可以這樣寫:
SELECT id, name, '2024' AS year FROM students_2024 UNION ALL SELECT id, name, '2025' AS year FROM students_2025;
這里額外加了一個固定字段:
'2024' AS year
和:
'2025' AS year
這樣可以清楚地知道每一行數(shù)據(jù)來自哪一年。
查詢結(jié)果可能類似:
id | name | year
---|------|------
1 | 張三 | 2024
2 | 李四 | 2024
1 | 王五 | 2025
2 | 趙六 | 2025
這種寫法在分表查詢、歷史數(shù)據(jù)合并、報表統(tǒng)計中都很常見。
七、UNION 和 JOIN 的區(qū)別
很多人剛學(xué) SQL 時,會把 UNION 和 JOIN 混淆。
它們的區(qū)別其實很簡單。
UNION:上下合并結(jié)果
SELECT name FROM customers UNION SELECT name FROM suppliers;
可以理解為:
customers 查詢結(jié)果
+
suppliers 查詢結(jié)果
它是把多批結(jié)果合并成更多行。
JOIN:左右關(guān)聯(lián)字段
SELECT orders.id, users.name FROM orders JOIN users ON orders.user_id = users.id;
可以理解為:
訂單信息 + 用戶信息
它是根據(jù)關(guān)聯(lián)條件,把多張表的數(shù)據(jù)拼接到同一行中。
八、UNION 和 UNION ALL 如何選擇?
一般可以按照下面的原則選擇:
如果需要去重,使用:
UNION
如果不需要去重,使用:
UNION ALL
在實際項目中,UNION ALL 的使用頻率通常更高,因為它不會進(jìn)行去重處理,性能相對更好。
只有在確實需要去除重復(fù)數(shù)據(jù)時,才使用 UNION。
九、總結(jié)
本文主要介紹了 MySQL 中 UNION 的用法。
總結(jié)一下:
UNION用于合并多個SELECT查詢結(jié)果;UNION默認(rèn)會去除重復(fù)行;UNION ALL不會去重,性能通常更好;- 多個
SELECT的列數(shù)必須一致; - 對應(yīng)列的數(shù)據(jù)類型最好保持兼容;
- 最終結(jié)果的列名由第一個
SELECT決定; ORDER BY寫在最后時,是對整個合并結(jié)果排序;UNION是上下拼接,JOIN是左右關(guān)聯(lián)。
一句話記憶:
UNION 合并結(jié)果并去重,UNION ALL 合并結(jié)果不去重;列數(shù)要一致,類型要兼容,字段名看第一個 SELECT。
到此這篇關(guān)于MySQL 中 UNION 的用法詳解的文章就介紹到這了,更多相關(guān)MySQL UNION用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL Left JOIN時指定NULL列返回特定值詳解
我們有時會有這樣的應(yīng)用,需要在sql的left join時,需要使值為NULL的列不返回NULL而時某個特定的值,比如0。這個時候,用is_null(field,0)是行不通的,會報錯的,可以用ifnull實現(xiàn),但是COALESE似乎更符合標(biāo)準(zhǔn)2013-07-07
MySQL子查詢與HAVING/SELECT的結(jié)合使用
這篇文章主要介紹了MySQL子查詢在HAVING/SELECT字句中使用、及相關(guān)子查詢和WITH/EXISTS字句的使用,具有一定的參考價值,感興趣的可以了解一下2023-06-06
UCenter info: MySQL Query Error SQL:SELECT value FROM [Table
大家先看下數(shù)據(jù)庫權(quán)限問題,然后再進(jìn)行如下操作。2011-09-09
MySql狀態(tài)查看方法 MySql如何查看連接數(shù)和狀態(tài)?
如果是root帳號,你能看到所有用戶的當(dāng)前連接。如果是其它普通帳號,只能看到自己占用的連接2012-11-11
MySQL快速插入大量數(shù)據(jù)的解決方案和代碼示例
在這篇博客中,我們將深入探討如何高效插入大量數(shù)據(jù)到MySQL數(shù)據(jù)庫,無論你是數(shù)據(jù)庫新手還是經(jīng)驗豐富的開發(fā)者,這篇文章都將為你提供實用的解決方案和代碼示例,幫助你解決插入3萬條數(shù)據(jù)需要20多秒的問題,需要的朋友可以參考下2024-08-08

