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

MySQL 中 UNION 的用法詳解

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

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

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

  • 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 表中分別查詢 namephone 字段,然后把兩個查詢結(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 的含義是:

  1. 先從 users 表中取 id 最大的 10 條數(shù)據(jù);
  2. 再從 admins 表中取 id 最大的 10 條數(shù)據(jù);
  3. 最后把兩部分結(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 時,會把 UNIONJOIN 混淆。

它們的區(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é)一下:

  1. UNION 用于合并多個 SELECT 查詢結(jié)果;
  2. UNION 默認(rèn)會去除重復(fù)行;
  3. UNION ALL 不會去重,性能通常更好;
  4. 多個 SELECT 的列數(shù)必須一致;
  5. 對應(yīng)列的數(shù)據(jù)類型最好保持兼容;
  6. 最終結(jié)果的列名由第一個 SELECT 決定;
  7. ORDER BY 寫在最后時,是對整個合并結(jié)果排序;
  8. 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導(dǎo)入sql文件常用的方法及適用場景

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

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

    深入了解SQL注入

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

    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的結(jié)合使用

    這篇文章主要介紹了MySQL子查詢在HAVING/SELECT字句中使用、及相關(guān)子查詢和WITH/EXISTS字句的使用,具有一定的參考價值,感興趣的可以了解一下
    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帳號,你能看到所有用戶的當(dāng)前連接。如果是其它普通帳號,只能看到自己占用的連接
    2012-11-11
  • MySQL快速插入大量數(shù)據(jù)的解決方案和代碼示例

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

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

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

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

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

    最近需要批量更新大量數(shù)據(jù),習(xí)慣了寫sql,所以還是用sql來實現(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í)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評論

新乐市| 蒲江县| 株洲县| 柳林县| 栾川县| 华坪县| 安平县| 凭祥市| 托里县| 莱西市| 丹阳市| 辽中县| 内丘县| 二连浩特市| 四子王旗| 铁力市| 利辛县| 宜兴市| 伊吾县| 安岳县| 龙里县| 砚山县| 仙居县| 富裕县| 洛川县| 久治县| 清涧县| 从化市| 东乡县| 喀什市| 乐安县| 普兰县| 永川市| 安庆市| 武邑县| 正阳县| 岫岩| 美姑县| 蕲春县| 托克托县| 丹寨县|