MySQL 中 UNION 的用法详解

 更新时间:2026年07月02日 09:12:56   作者:jianjinwssy  
本文详细介绍了MySQL中UNION的基本用法及常见场景,包括去重与不重复、列数与数据类型兼容、结果排序等内容,感兴趣的可以了解一下

在 MySQL 中,UNION 是一个非常常用的查询关键字,主要用于合并多个 SELECT 查询的结果集

很多初学者容易把 UNIONJOIN 混淆。简单来说:

  • UNION 是把结果上下拼接
  • JOIN 是把表数据左右关联

本文就来系统总结一下 MySQL 中 UNION 的基本用法、注意事项以及常见场景。

一、UNION 是什么?

UNION 用于合并两个或多个 SELECT 语句的查询结果。

基本语法如下:

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 字段,然后把两个查询结果合并成一个结果集。

二、UNION 默认会去重

在 MySQL 中,UNION 默认会去掉重复的数据行。

例如:

SELECT 1 AS id
UNION
SELECT 1 AS id;

查询结果为:

id
--
1

虽然两个查询都返回了 1,但是最终结果中只保留了一行。

也就是说:

UNION

等价于:

UNION DISTINCT

默认行为就是去重。

三、UNION ALL 不会去重

如果希望保留所有查询结果,包括重复数据,可以使用 UNION ALL

例如:

SELECT 1 AS id
UNION ALL
SELECT 1 AS id;

查询结果为:

id
--
1
1

可以看到,两条重复的数据都被保留下来了。

在实际开发中,如果你确定数据不会重复,或者业务上允许重复,建议优先使用 UNION ALL

原因是:
UNION ALL 不需要进行去重操作,性能通常比 UNION 更好。

四、UNION 的使用要求

使用 UNION 时,需要注意几个基本规则。

1. 每个 SELECT 查询的列数必须相同

正确写法:

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

错误写法:

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

第一个查询返回两列,第二个查询只返回一列,列数不一致,MySQL 无法合并结果。

2. 对应列的数据类型应该兼容

例如:

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

这条 SQL 在语法上可能没有问题,因为两个查询都返回两列。

但是从业务含义上看,第二列一边是用户名 name,一边是文章标题 title,语义可能并不统一。

因此,在使用 UNION 时,不仅要保证列数一致,也要尽量保证对应列的数据含义一致。

3. 最终结果的列名取第一个 SELECT 的列名

例如:

SELECT id AS user_id, name AS user_name FROM users
UNION
SELECT id AS admin_id, name AS admin_name FROM admins;

最终结果中的列名是:

user_id | user_name

而不是:

admin_id | admin_name

也就是说,UNION 最终结果集的字段名由第一个 SELECT 决定。

五、UNION 中的 ORDER BY 和 LIMIT

如果想对合并后的最终结果排序,可以把 ORDER BY 写在最后。

例如:

SELECT id, name FROM users
UNION ALL
SELECT id, name FROM admins
ORDER BY id DESC;

这里的 ORDER BY id DESC 是对两个查询合并之后的整体结果进行排序。

如果想让每个查询内部先排序或限制条数,可以使用括号。

例如:

(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 条数据;
  2. 再从 admins 表中取 id 最大的 10 条数据;
  3. 最后把两部分结果合并,并按照 id 倒序排序。

六、UNION 的常见使用场景

假设有两张学生表:

students_2024
students_2025

现在想把两个年份的学生数据合并查询出来,可以这样写:

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

这样可以清楚地知道每一行数据来自哪一年。

查询结果可能类似:

id | name | year
---|------|------
1  | 张三 | 2024
2  | 李四 | 2024
1  | 王五 | 2025
2  | 赵六 | 2025

这种写法在分表查询、历史数据合并、报表统计中都很常见。

七、UNION 和 JOIN 的区别

很多人刚学 SQL 时,会把 UNIONJOIN 混淆。

它们的区别其实很简单。

UNION:上下合并结果

SELECT name FROM customers
UNION
SELECT name FROM suppliers;

可以理解为:

customers 查询结果
+
suppliers 查询结果

它是把多批结果合并成更多行。

JOIN:左右关联字段

SELECT orders.id, users.name
FROM orders
JOIN users ON orders.user_id = users.id;

可以理解为:

订单信息 + 用户信息

它是根据关联条件,把多张表的数据拼接到同一行中。

八、UNION 和 UNION ALL 如何选择?

一般可以按照下面的原则选择:

如果需要去重,使用:

UNION

如果不需要去重,使用:

UNION ALL

在实际项目中,UNION ALL 的使用频率通常更高,因为它不会进行去重处理,性能相对更好。

只有在确实需要去除重复数据时,才使用 UNION

九、总结

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

总结一下:

  1. UNION 用于合并多个 SELECT 查询结果;
  2. UNION 默认会去除重复行;
  3. UNION ALL 不会去重,性能通常更好;
  4. 多个 SELECT 的列数必须一致;
  5. 对应列的数据类型最好保持兼容;
  6. 最终结果的列名由第一个 SELECT 决定;
  7. ORDER BY 写在最后时,是对整个合并结果排序;
  8. UNION 是上下拼接,JOIN 是左右关联。

一句话记忆:

UNION 合并结果并去重,UNION ALL 合并结果不去重;列数要一致,类型要兼容,字段名看第一个 SELECT。

到此这篇关于MySQL 中 UNION 的用法详解的文章就介绍到这了,更多相关MySQL UNION用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql导入sql文件常用的方法及适用场景

    mysql导入sql文件常用的方法及适用场景

    在日常学习和工作,难免不了使用Mysql数据库,有时候需要导入导出数据库,或者其中的数据表,这篇文章主要介绍了mysql导入sql文件常用的方法及适用场景,需要的朋友可以参考下
    2025-08-08
  • 深入了解SQL注入

    深入了解SQL注入

    本篇文章通过SQL和MYSQL的对比,以及SQL注入的原理等方面详细分析了SQL注入相关知识点,对此有兴趣的朋友学习下。
    2018-02-02
  • MySQL Left JOIN时指定NULL列返回特定值详解

    MySQL Left JOIN时指定NULL列返回特定值详解

    我们有时会有这样的应用,需要在sql的left join时,需要使值为NULL的列不返回NULL而时某个特定的值,比如0。这个时候,用is_null(field,0)是行不通的,会报错的,可以用ifnull实现,但是COALESE似乎更符合标准
    2013-07-07
  • MySQL子查询与HAVING/SELECT的结合使用

    MySQL子查询与HAVING/SELECT的结合使用

    这篇文章主要介绍了MySQL子查询在HAVING/SELECT字句中使用、及相关子查询和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

    大家先看下数据库权限问题,然后再进行如下操作。
    2011-09-09
  • MySql状态查看方法 MySql如何查看连接数和状态?

    MySql状态查看方法 MySql如何查看连接数和状态?

    如果是root帐号,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接
    2012-11-11
  • MySQL快速插入大量数据的解决方案和代码示例

    MySQL快速插入大量数据的解决方案和代码示例

    在这篇博客中,我们将深入探讨如何高效插入大量数据到MySQL数据库,无论你是数据库新手还是经验丰富的开发者,这篇文章都将为你提供实用的解决方案和代码示例,帮助你解决插入3万条数据需要20多秒的问题,需要的朋友可以参考下
    2024-08-08
  • 详解mysql 获取当前日期及格式化

    详解mysql 获取当前日期及格式化

    本篇文章主要介绍了mysql 获取当前日期及格式化,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-12-12
  • MySQL批量更新的四种方式总结

    MySQL批量更新的四种方式总结

    最近需要批量更新大量数据,习惯了写sql,所以还是用sql来实现,下面这篇文章主要给大家总结介绍了关于MySQL批量更新的四种方式,需要的朋友可以参考下
    2023-01-01
  • Mysql巧用join优化sql的方法详解

    Mysql巧用join优化sql的方法详解

    这篇文章主要给大家介绍了关于Mysql巧用join优化sql的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08

最新评论