贝利信息

sql如何用UNION合并两个查询的结果 sql结果合并的基础语句教程

日期:2025-08-18 00:00 / 作者:雪夜

sql中使用union可合并多个select结果集并自动去重,需各select列数相同、数据类型兼容、列序一致;1. 使用union时会去除重复行,如需保留所有行应使用union all;2. union用于合并行(垂直叠加),join用于基于关联列组合列(水平连接),根据需求选择;3. where子句可分别过滤各select结果,写在各自select之后;4. order by只能置于最后一条select语句后,对最终结果排序;5. union去重机制类似distinct,通过哈希或排序实现;6. 数据类型不兼容时应使用cast或convert显式转换类型以确保一致性。

SQL 中使用

UNION
关键字可以将两个或多个
SELECT
语句的结果集合并成一个结果集。这在需要从多个表中提取相似数据并将其组合显示时非常有用。
UNION
会自动去除重复的行,如果想要保留所有行(包括重复的),可以使用
UNION ALL

解决方案

UNION
的基本语法如下:

SELECT column1, column2, ...
FROM table1
WHERE condition1
UNION
SELECT column1, column2, ...
FROM table2
WHERE condition2;

UNION ALL
的基本语法如下:

SELECT column1, column2, ...
FROM table1
WHERE condition1
UNION ALL
SELECT column1, column2, ...
FROM table2
WHERE condition2;

注意事项:

示例:

假设我们有两个表

customers
potential_customers
,它们都有
name
email
列。

customers
表:

name email
Alice alice@example.com
Bob bob@example.com
Carol carol@example.com

potential_customers
表:

name email
David david@example.com
Alice alice@example.com
Eve eve@example.com

使用

UNION
合并这两个表:

SELECT name, email
FROM customers
UNION
SELECT name, email
FROM potential_customers;

结果:

name email
Alice alice@example.com
Bob bob@example.com
Carol carol@example.com
David david@example.com
Eve eve@example.com

使用

UNION ALL
合并这两个表:

SELECT name, email
FROM customers
UNION ALL
SELECT name, email
FROM potential_customers;

结果:

name email
Alice alice@example.com
Bob bob@example.com
Carol carol@example.com
David david@example.com
Alice alice@example.com
Eve eve@example.com

UNION
JOIN
有什么区别?何时应该使用哪个?

UNION
用于合并来自不同表的具有相似结构的行,而
JOIN
用于基于共同的列将来自不同表的行组合在一起。

选择哪个取决于你的需求。如果需要合并行,使用

UNION
。如果需要组合列,使用
JOIN

如何在
UNION
中使用
WHERE
子句进行过滤?

WHERE
子句可以用于过滤每个
SELECT
语句的结果集,然后再进行合并。
WHERE
子句写在每个
SELECT
语句之后。

例如,假设我们只想合并

customers
表中
name
以 "A" 开头的客户和
potential_customers
表中
email
包含 "@example.com" 的潜在客户:

SELECT name, email
FROM customers
WHERE name LIKE 'A%'
UNION
SELECT name, email
FROM potential_customers
WHERE email LIKE '%@example.com%';

UNION
结果集的排序问题:如何使用
ORDER BY

ORDER BY
子句只能放在最后一个
SELECT
语句之后,它会对整个合并后的结果集进行排序。

SELECT name, email
FROM customers
UNION
SELECT name, email
FROM potential_customers
ORDER BY name;

这条语句会将合并后的结果集按照

name
列进行升序排序。注意,
ORDER BY
作用于最终合并后的结果,而不是每个
SELECT
语句的结果。如果需要在排序中使用别名,可以在
ORDER BY
子句中使用。

UNION
DISTINCT
的关系:
UNION
内部是如何去重的?

UNION
默认会去除重复的行,这相当于在合并后的结果集上执行了
DISTINCT
操作。实际上,
UNION
内部实现通常会使用哈希表或者排序等方法来检测重复行,然后只保留唯一的行。如果使用
UNION ALL
,则不会进行去重操作,所有行都会被保留。

如何处理
UNION
中数据类型不兼容的问题?

如果

UNION
SELECT
语句中的列的数据类型不兼容,数据库通常会尝试进行隐式类型转换。但是,这可能会导致数据丢失或错误。为了避免这种情况,应该显式地使用类型转换函数(例如
CAST
CONVERT
)将数据类型转换为兼容的类型。

例如,如果一个

SELECT
语句返回的是整数,而另一个返回的是字符串,可以将整数转换为字符串:

SELECT name, CAST(age AS VARCHAR(10)) AS age
FROM table1
UNION
SELECT name, age
FROM table2;

在这个例子中,

table1
age
列是整数类型,而
table2
age
列是字符串类型。使用
CAST(age AS VARCHAR(10))
table1
age
列转换为字符串类型,使其与
table2
age
列兼容。