mysql 合并结果集(union,union all)

本文探讨了在MySQL中如何使用UNION和UNION ALL合并多个SELECT查询的结果。UNION会删除重复记录,而UNION ALL则保留所有数据,包括重复项。当对合并结果进行进一步操作如ORDER BY或LIMIT时,需对SELECT语句加括号。性能上,UNION ALL通常比UNION更快,适合于不需要去除重复数据的情况。对于大数据量,UNION可能需要磁盘排序,而UNION ALL则没有此步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我需要在一个sql的执行结果中,显示两个或两个以上的where条件的结果(select 列的结构相同)。
考虑使用union,或union all 。

union 与 union all 执行结果不同

UNION 删除重复的记录再返回结果,即对整个结果集合使用了DISTINCT。结果中无重复数据。
UNION ALL 将各个结果合并后就返回,不删除重复记录。如果结果中有重复数据,则包含重复数据。

例如,

mysql> SELECT * FROM world.city where ID=2020 UNION SELECT * FROM world.city where ID=2020;
+------+-------+-------------+--------------+------------+
| ID   | Name  | CountryCode | District     | Population |
+------+-------+-------------+--------------+------------+
| 2020 | Tieli | CHN         | Heilongjiang |     265683 |
+------+-------+-------------+--------------+------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM world.city where ID=2020 UNION ALL SELECT * FROM world.city where ID=2020;
+------+-------+-------------+--------------+------------+
| ID   | Name  | CountryCode | District     | Population |
+------+-------+-------------+--------------+------------+
| 2020 | Tieli | CHN         | Heilongjiang |     265683 |
| 2020 | Tieli | CHN         | Heilongjiang |     265683 |
+------+-------+-------------+--------------+------------+
2 rows in set (0.00 sec)

对UNION,UNION ALL的结果继续处理,需要加括号

比如要对合并后的结果集进行ORDER BY,LIMIT等操作需要对合并对象单个的SELECT语句加上括号。
并且把整体结果的条件ORDER BY,LIMIT等放到最后一个SELECT的括号后面。
例如,

(SELECT * FROM world.city
WHERE CountryCode = 'JPN' AND Name LIKE 'nishi%') 
UNION ALL 
(SELECT * FROM world.city
WHERE CountryCode = 'CHN' AND Population >= 5000000) 
LIMIT 5;

mysql中,UNION,UNION ALL的性能/效率不同

从效率上说,UNION ALL 要比UNION快很多。
所以,如果可以确认合并的结果集中不包含重复的数据的话,或者需要的结果中即使包含重复也无所谓,那么就使用UNION ALL。

  • UNION
    UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算。
    UNION在运行时先取出各个表/各个select的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
  • UNION ALL
    UNION ALL只是简单的将结果合并后就返回。不涉及排序运算。

(以上。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值