SQL Server里头那个union怎么用,联合结果集啥时候派上用场的简单记录
- 问答
- 2025-12-28 12:25:26
- 4
主要参考了微软官方的SQL Server文档中关于集合查询的部分,以及一些常见的数据库教程和实际应用场景的总结,比如在解决报表汇总、数据归档和权限控制等问题时的典型用法。
在SQL Server里,当我们想从数据库里拿数据时,最常用的就是SELECT语句,但有时候,我们需要的数据不是整齐地放在一张表里的,而是零零散散地分布在好几张结构相似的表里,这时候,想把它们合并到一起看,UNION就派上用场了。
UNION的作用很简单,就是用来把两个或多个SELECT语句的结果集“上下”合并在一起,最终变成一个结果集给你,你可以想象成把几张格式一样的表格,一张接一张地摞起来,变成一张更长的表格,这里有个关键点,这些被合并的SELECT语句查询的列必须是数量相同,并且对应列的数据类型也必须是兼容的,比如说,第一个SELECT语句选了姓名和年龄两列,那么第二个SELECT语句也得选两列,并且第一列最好是字符类型(比如放姓名),第二列最好是数值类型(比如放年龄),如果第一个查询返回的是产品名称和价格,第二个查询返回的是订单号和日期,那它们就合并不了,因为列的类型和含义对不上。
UNION用起来也很直接,基本语法就是把各个SELECT语句用UNION这个关键字连接起来,举个例子,假设一个公司有张“东部销售表”和“西部销售表”,两张表的结构一模一样,都有“销售区域”、“销售员”、“销售额”这三列,现在老板想看看全公司所有销售员的业绩,不需要区分东部西部了,那我们就可以这样写:先从东部销售表里把区域、销售员、销售额选出来,然后写上一个UNION,再从西部销售表里把同样的三列选出来,数据库执行这条语句后,就会把东部和西部的所有销售记录都混合在一起,返回一个总的结果。
这里要注意UNION的一个很重要的特性:它会自动去除合并后结果集中完全重复的行,还用刚才的例子,如果碰巧有个销售员同时在东部和西部都有完全相同的销售记录(区域、销售员、销售额三个值都一模一样),那么UNION最后只会显示一条记录,这个特性有时候很有用,能帮我们省掉去重的麻烦。

如果我们就是需要保留所有的记录,包括那些完全重复的,该怎么办呢?这时候就要用UNION ALL了,UNION ALL和UNION的用法一模一样,唯一的区别就是它不进行去重操作,会把所有记录,不管重不重复,都给你堆到一起,那什么时候该用UNION ALL呢?当你明确知道两个结果集里根本不存在重复记录,或者你就是需要保留重复记录的时候,比如统计投票次数,同一个人投了相同的票也要算两次,那就必须用UNION ALL,从数据库执行的速度上来说,UNION ALL通常比UNION要快,因为UNION为了去重,需要在内部对数据进行了排序和比较的额外工作,这会消耗更多的时间和资源,而UNION ALL就是简单地把结果堆叠起来,所以效率更高,在数据量很大的时候,这个速度差异会非常明显,如果没有去重的必要,优先考虑使用UNION ALL。
在现实工作中,UNION通常都在哪些场景下派上用场呢?结合一些常见的开发和使用经验,主要有这么几种情况。
第一种最典型的就是报表汇总,就像前面举的销售例子,很多业务数据为了管理方便,会按时间或地区分表存放,比如每个月一张销售表,或者每个分公司一张库存表,到了月底或年底要做总报表时,就需要用UNION或UNION ALL把这些分散的表的数据汇总到一块来计算总和、平均值等。

第二种常见情况是数据归档和历史查询,比如一个系统里有个“当前订单表”,存放正在处理的订单,当订单完成后,为了不让当前订单表变得太臃肿,我们可能会把已完成订单转移到“历史订单表”里,如果有一天想查询某个客户的所有订单,包括当前未完成的和历史上完成的,那就得从“当前订单表”和“历史订单表”里分别查询,然后用UNION ALL合并起来展示给用户。
第三种情况涉及到权限控制,比如说,在一个项目管理系统里,普通员工只能看到自己创建的任务,而经理可以看到整个部门的所有任务,在设计查询时,可以先写一个查询找出当前用户自己创建的任务,再用UNION连接另一个查询,这个查询检查用户是否是经理身份,如果是,则再查出部门的所有任务,这样通过一次查询就返回了符合权限的全部数据。
第四种情况是合并来自不同来源但结构相似的数据,比如一个集团企业,可能用了多个不同的子系统,每个系统都有自己的数据库,但部分核心表结构类似,在做集团级分析时,可能需要通过链接服务器等方式,从这些不同的数据库服务器上查询数据,然后用UNION把它们整合在一起。
在使用UNION时,还有一些小细节需要注意,比如排序,如果要对合并后的整个结果集进行排序,ORDER BY子句只能出现在最后一个SELECT语句的后面,你不能给每个SELECT都加自己的ORDER BY,还有列名,合并后的结果集的列名通常是由第一个SELECT语句的列名决定的,后面查询的列名会被忽略,虽然UNION要求列的类型兼容,但如果精度或长度不同,最终结果可能会以第一个查询的列为准进行转换,这点也需要留意。
UNION是SQL Server中一个非常实用的工具,它解决的核心问题就是“合并同类项”,把结构相同的多个数据源组合成一个统一视图,理解它和UNION ALL在去重和性能上的区别,并根据实际业务需求选择使用,是掌握它的关键,在处理分表数据、历史数据整合和复杂权限查询等场景下,它往往能提供简洁高效的解决方案。
本文由邝冷亦于2025-12-28发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/70028.html