最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL 中 UNION 的用法詳解

 更新時(shí)間:2026年07月02日 09:12:56   作者:jianjinwssy  
本文詳細(xì)介紹了MySQL中UNION的基本用法及常見場景,包括去重與不重復(fù)、列數(shù)與數(shù)據(jù)類型兼容、結(jié)果排序等內(nèi)容,感興趣的可以了解一下

在 MySQL 中,UNION 是一個(gè)非常常用的查詢關(guān)鍵字,主要用于合并多個(gè) SELECT 查詢的結(jié)果集

很多初學(xué)者容易把 UNIONJOIN 混淆。簡單來說:

  • UNION 是把結(jié)果上下拼接
  • JOIN 是把表數(shù)據(jù)左右關(guān)聯(lián)

本文就來系統(tǒng)總結(jié)一下 MySQL 中 UNION 的基本用法、注意事項(xiàng)以及常見場景。

一、UNION 是什么?

UNION 用于合并兩個(gè)或多個(gè) 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 表中分別查詢 namephone 字段,然后把兩個(gè)查詢結(jié)果合并成一個(gè)結(jié)果集。

二、UNION 默認(rèn)會(huì)去重

在 MySQL 中,UNION 默認(rèn)會(huì)去掉重復(fù)的數(shù)據(jù)行。

例如:

SELECT 1 AS id
UNION
SELECT 1 AS id;

查詢結(jié)果為:

id
--
1

雖然兩個(gè)查詢都返回了 1,但是最終結(jié)果中只保留了一行。

也就是說:

UNION

等價(jià)于:

UNION DISTINCT

默認(rèn)行為就是去重。

三、UNION ALL 不會(huì)去重

如果希望保留所有查詢結(jié)果,包括重復(fù)數(shù)據(jù),可以使用 UNION ALL。

例如:

SELECT 1 AS id
UNION ALL
SELECT 1 AS id;

查詢結(jié)果為:

id
--
1
1

可以看到,兩條重復(fù)的數(shù)據(jù)都被保留下來了。

在實(shí)際開發(fā)中,如果你確定數(shù)據(jù)不會(huì)重復(fù),或者業(yè)務(wù)上允許重復(fù),建議優(yōu)先使用 UNION ALL

原因是:
UNION ALL 不需要進(jìn)行去重操作,性能通常比 UNION 更好。

四、UNION 的使用要求

使用 UNION 時(shí),需要注意幾個(gè)基本規(guī)則。

1. 每個(gè) SELECT 查詢的列數(shù)必須相同

正確寫法:

SELECT id, name FROM users
UNION
SELECT id, name FROM admins;

錯(cuò)誤寫法:

SELECT id, name FROM users
UNION
SELECT id FROM admins;

第一個(gè)查詢返回兩列,第二個(gè)查詢只返回一列,列數(shù)不一致,MySQL 無法合并結(jié)果。

2. 對應(yīng)列的數(shù)據(jù)類型應(yīng)該兼容

例如:

SELECT id, name FROM users
UNION
SELECT id, title FROM articles;

這條 SQL 在語法上可能沒有問題,因?yàn)閮蓚€(gè)查詢都返回兩列。

但是從業(yè)務(wù)含義上看,第二列一邊是用戶名 name,一邊是文章標(biāo)題 title,語義可能并不統(tǒng)一。

因此,在使用 UNION 時(shí),不僅要保證列數(shù)一致,也要盡量保證對應(yīng)列的數(shù)據(jù)含義一致。

3. 最終結(jié)果的列名取第一個(gè) 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é)果集的字段名由第一個(gè) 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 是對兩個(gè)查詢合并之后的整體結(jié)果進(jìn)行排序。

如果想讓每個(gè)查詢內(nèi)部先排序或限制條數(shù),可以使用括號(hào)。

例如:

(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 的含義是:

  1. 先從 users 表中取 id 最大的 10 條數(shù)據(jù);
  2. 再從 admins 表中取 id 最大的 10 條數(shù)據(jù);
  3. 最后把兩部分結(jié)果合并,并按照 id 倒序排序。

六、UNION 的常見使用場景

假設(shè)有兩張學(xué)生表:

students_2024
students_2025

現(xiàn)在想把兩個(gè)年份的學(xué)生數(shù)據(jù)合并查詢出來,可以這樣寫:

SELECT id, name, '2024' AS year FROM students_2024
UNION ALL
SELECT id, name, '2025' AS year FROM students_2025;

這里額外加了一個(gè)固定字段:

'2024' AS year

和:

'2025' AS year

這樣可以清楚地知道每一行數(shù)據(jù)來自哪一年。

查詢結(jié)果可能類似:

id | name | year
---|------|------
1  | 張三 | 2024
2  | 李四 | 2024
1  | 王五 | 2025
2  | 趙六 | 2025

這種寫法在分表查詢、歷史數(shù)據(jù)合并、報(bào)表統(tǒng)計(jì)中都很常見。

七、UNION 和 JOIN 的區(qū)別

很多人剛學(xué) SQL 時(shí),會(huì)把 UNIONJOIN 混淆。

它們的區(qū)別其實(shí)很簡單。

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

在實(shí)際項(xiàng)目中,UNION ALL 的使用頻率通常更高,因?yàn)樗粫?huì)進(jìn)行去重處理,性能相對更好。

只有在確實(shí)需要去除重復(fù)數(shù)據(jù)時(shí),才使用 UNION。

九、總結(jié)

本文主要介紹了 MySQL 中 UNION 的用法。

總結(jié)一下:

  1. UNION 用于合并多個(gè) SELECT 查詢結(jié)果;
  2. UNION 默認(rèn)會(huì)去除重復(fù)行;
  3. UNION ALL 不會(huì)去重,性能通常更好;
  4. 多個(gè) SELECT 的列數(shù)必須一致;
  5. 對應(yīng)列的數(shù)據(jù)類型最好保持兼容;
  6. 最終結(jié)果的列名由第一個(gè) SELECT 決定;
  7. ORDER BY 寫在最后時(shí),是對整個(gè)合并結(jié)果排序;
  8. UNION 是上下拼接,JOIN 是左右關(guān)聯(lián)。

一句話記憶:

UNION 合并結(jié)果并去重,UNION ALL 合并結(jié)果不去重;列數(shù)要一致,類型要兼容,字段名看第一個(gè) SELECT。

到此這篇關(guān)于MySQL 中 UNION 的用法詳解的文章就介紹到這了,更多相關(guān)MySQL UNION用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql導(dǎo)入sql文件常用的方法及適用場景

    mysql導(dǎo)入sql文件常用的方法及適用場景

    在日常學(xué)習(xí)和工作,難免不了使用Mysql數(shù)據(jù)庫,有時(shí)候需要導(dǎo)入導(dǎo)出數(shù)據(jù)庫,或者其中的數(shù)據(jù)表,這篇文章主要介紹了mysql導(dǎo)入sql文件常用的方法及適用場景,需要的朋友可以參考下
    2025-08-08
  • 深入了解SQL注入

    深入了解SQL注入

    本篇文章通過SQL和MYSQL的對比,以及SQL注入的原理等方面詳細(xì)分析了SQL注入相關(guān)知識(shí)點(diǎn),對此有興趣的朋友學(xué)習(xí)下。
    2018-02-02
  • MySQL Left JOIN時(shí)指定NULL列返回特定值詳解

    MySQL Left JOIN時(shí)指定NULL列返回特定值詳解

    我們有時(shí)會(huì)有這樣的應(yīng)用,需要在sql的left join時(shí),需要使值為NULL的列不返回NULL而時(shí)某個(gè)特定的值,比如0。這個(gè)時(shí)候,用is_null(field,0)是行不通的,會(huì)報(bào)錯(cuò)的,可以用ifnull實(shí)現(xiàn),但是COALESE似乎更符合標(biāo)準(zhǔn)
    2013-07-07
  • MySQL子查詢與HAVING/SELECT的結(jié)合使用

    MySQL子查詢與HAVING/SELECT的結(jié)合使用

    這篇文章主要介紹了MySQL子查詢在HAVING/SELECT字句中使用、及相關(guān)子查詢和WITH/EXISTS字句的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-06-06
  • UCenter info: MySQL Query Error SQL:SELECT value FROM [Table]vars WHERE noteexists

    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)?

    MySql狀態(tài)查看方法 MySql如何查看連接數(shù)和狀態(tài)?

    如果是root帳號(hào),你能看到所有用戶的當(dāng)前連接。如果是其它普通帳號(hào),只能看到自己占用的連接
    2012-11-11
  • MySQL快速插入大量數(shù)據(jù)的解決方案和代碼示例

    MySQL快速插入大量數(shù)據(jù)的解決方案和代碼示例

    在這篇博客中,我們將深入探討如何高效插入大量數(shù)據(jù)到MySQL數(shù)據(jù)庫,無論你是數(shù)據(jù)庫新手還是經(jīng)驗(yàn)豐富的開發(fā)者,這篇文章都將為你提供實(shí)用的解決方案和代碼示例,幫助你解決插入3萬條數(shù)據(jù)需要20多秒的問題,需要的朋友可以參考下
    2024-08-08
  • 詳解mysql 獲取當(dāng)前日期及格式化

    詳解mysql 獲取當(dāng)前日期及格式化

    本篇文章主要介紹了mysql 獲取當(dāng)前日期及格式化,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • MySQL批量更新的四種方式總結(jié)

    MySQL批量更新的四種方式總結(jié)

    最近需要批量更新大量數(shù)據(jù),習(xí)慣了寫sql,所以還是用sql來實(shí)現(xiàn),下面這篇文章主要給大家總結(jié)介紹了關(guān)于MySQL批量更新的四種方式,需要的朋友可以參考下
    2023-01-01
  • Mysql巧用join優(yōu)化sql的方法詳解

    Mysql巧用join優(yōu)化sql的方法詳解

    這篇文章主要給大家介紹了關(guān)于Mysql巧用join優(yōu)化sql的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評論

江都市| 茂名市| 南京市| 云林县| 姚安县| 晋江市| 泗水县| 嘉义市| 青海省| 化隆| 辽阳市| 高邮市| 修水县| 商丘市| 腾冲县| 岳普湖县| 沅江市| 子洲县| 客服| 罗山县| 涿鹿县| 盐山县| 鄂托克旗| 台南市| 故城县| 花莲县| 合川市| 建德市| 蒲城县| 永昌县| 万宁市| 滨州市| 育儿| 垫江县| 翁牛特旗| 青龙| 楚雄市| 汶上县| 吉木乃县| 个旧市| 南通市|