Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL UNION用法

MySQL 中 UNION 的用法详解

作者:jianjinwssy

本文详细介绍了MySQL中UNION的基本用法及常见场景,包括去重与不重复、列数与数据类型兼容、结果排序等内容,感兴趣的可以了解一下

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

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

本文就来系统总结一下 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用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文