千家信息网

SQL Server-聚焦UNIOL ALL/UNION查询

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,初探UNION和UNION ALL首先我们过一遍二者的基本概念和使用方法,UNION和UNION ALL是将两个表或者多个表进行JOIN,当然表的数据类型必须相同,对于UNION而言它会去除重复值,而
千家信息网最后更新 2026年11月01日SQL Server-聚焦UNIOL ALL/UNION查询

初探UNION和UNION ALL

首先我们过一遍二者的基本概念和使用方法,UNION和UNION ALL是将两个表或者多个表进行JOIN,当然表的数据类型必须相同,对于UNION而言它会去除重复值,而UNION ALL则会返回所有数据,这就是二者的区别和使用方法。下面我们来看一个简单的例子。

USE TSQL2012GO--USE UNION ALLSELECT 1    UNION ALL SELECT 2    UNION ALLSELECT 2    UNION ALLSELECT 3--USE UNIONSELECT 1    UNIONSELECT 2    UNIONSELECT 2    UNIONSELECT 3

上述我们稍微讲解了下二者的基本使用,接下来我们来看看二者的性能比较。

进一步探讨UNION 和 UNION ALL性能问题

我们首先创建两个测试表Table1和Table2

USE TSQL2012GOCREATE TABLE Table1(    col VARCHAR(10))CREATE TABLE Table2(    col VARCHAR(10))

在表Table1中插入如下测试数据

USE TSQL2012GOINSERT INTO Table1SELECT 'First'UNION ALLSELECT 'Second'UNION ALLSELECT 'Third'UNION ALLSELECT 'Fourth'UNION ALLSELECT 'Fifth'

在表Table2中插入如下测试数据

USE TSQL2012GOINSERT INTO Table2SELECT 'First'UNION ALLSELECT 'Third'UNION ALLSELECT 'Fifth'

我们查询下两个表插入的测试数据

USE TSQL2012GOSELECT *FROM Table1SELECT *FROM Table2

接着分别利用UNION和UNION ALL来查询数据比较二者性能开销

USE TSQL2012GO--UNION ALLSELECT *FROM Table1UNION ALLSELECT *FROM Table2--UNIONSELECT *FROM Table1UNIONSELECT *FROM Table2

此时我们能够很明显的看到因为UNION要去除重复所以会进行DISTINCT Sort操作使得其性能要低于UNION ALL。到这里我们可以下个基本结论。

UNION VS UNION ALL性能分析结论:当使用UNION查询语句时类似会进行SELECT DISTINCT操作,除非我们非常明确要返回唯一不重复的值那就用UNION,否则使用UNION ALL会带来更好的性能,返回结果集更快。

是不是到此就完了呢,使用UNION和UNION ALL就这么简单么,那你就太天真了,我们继续往下看。

深入探讨UNION 和 UNION ALL(一)

我们声明一个表变量插入数据并利用UNION ALL来进行查询

USE TSQL2012GODECLARE @tempTable TABLE(col TEXT)INSERT INTO @tempTable(col)SELECT 'JeffckyWang'SELECT col FROM @tempTableUNION ALL SELECT 'Test UNION ALL'

此时对应返回合并结果集,恩,没毛病,我们接下来看看UNION

USE TSQL2012GODECLARE @tempTable TABLE(col TEXT)INSERT INTO @tempTable(col)SELECT 'JeffckyWang'SELECT col FROM @tempTableUNION SELECT 'Test UNION ALL'

此时毛病就出来了,说什么数据类型text不可比,不能将其用作UNIN、INTERSERCT或EXCEPT等运算符的操作数,这是什么意思,不太懂。在我们讲解UNION和UNION ALL的性能问题时,我们已经标出UNION的查询计划,UNION会进行DISTINCT Sort操作,这说明什么呢?实际上它内部会进行自动排序同时移除重复的数据,此时数据类型为TEXT所以无法对TEXT类型进行排序,换句话说UNION不支持TEXT类型。所以到这里我们可以给出一个结论。

当利用UNION进行查询时,如果查询列中有TEXT数据类型时,此时会发生错误,因为UNION内部会自动对数据进行排序,而TEXT是无法进行排序的,所以UNION不支持TEXT数据类型。

好了到了这里,我们才算是给出第一个需要注意的地方,下面我们再来看一个。

深入探讨UNION和UNION ALL(二)

当我们对两个表进行UNION ALL时,此时我们如果有这样一个需求,需要使用UNION ALL前后的表是进行排序的,那么此时我们应该如何做呢?下面我们创建测试表看看。

USE TSQL2012GOCREATE TABLE Table1 (ID INT, Col1 VARCHAR(100));CREATE TABLE Table2 (ID INT, Col1 VARCHAR(100));GOINSERT INTO Table1 (ID, Col1)SELECT 1, 'Col1-t1'UNION ALLSELECT 2, 'Col2-t1'UNION ALLSELECT 3, 'Col3-t1';INSERT INTO Table2 (ID, Col1)SELECT 3, 'Col1-t2'UNION ALLSELECT 2, 'Col2-t2'UNION ALLSELECT 1, 'Col3-t2';GO

此时我们查询上述Table1和Table2数据如下:

我们的需求是利用UNION ALL将Table1和Table2合并时,其顺序分别是1,2,3和1,2,3。对于UNION查询我们就不用讨论,内部会自行排序,如下则是利用UNION对数据进行排序的结果:

当我们进行UNION ALL时呢

USE TSQL2012GOSELECT ID, Col1FROM dbo.Table1  UNION ALLSELECT ID, Col1FROM dbo.Table2GO

显然满足不了我们的需求,在Table2表中的数据我们需要的是1,2,3。那么我们对Table2中的ID进行ORDER BY结果会如何呢?

USE TSQL2012GOSELECT ID, Col1FROM dbo.Table1    UNION ALLSELECT ID, Col1FROM dbo.Table2ORDER BY IDGO

使用UNION ALL通过对Table2表上的ID进行ORDER BY此时得到的结果和上述UNION查询的结果很类似,但是还是没有得到我们的结果。上述对于两个结果集进行合并后的排序也可以进行如下查询:

USE TSQL2012GOSELECT * FROM(SELECT ID, Col1 FROM dbo.Table1UNION ALLSELECT ID, Col1 FROM dbo.Table2) as tORDER BY ID

对于查询我们能够自定义常量列,我们接下来添加一个额外的常量列,先对其常量列进行排序,然后对ID进行ORDER BY呢,结果又会是怎样的呢?

USE TSQL2012GOSELECT ID, Col1, 'addtionalcol1' AS addtionalCol FROM dbo.Table1    UNION ALLSELECT ID, Col1, 'addtionalCol2' AS addtionalColFROM dbo.Table2ORDER BY addtionalCol, IDGO

到这里算是基本完成我们的需求,貌似需要额外添加一个列,虽然效果不是太好。


数据 查询 结果 排序 性能 类型 两个 测试 需求 接下来 常量 结论 使用方法 方法 毛病 问题 支持 明显 相同 天真 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网和科技创新 互联网 的科技创新 亿账通互联网科技 伴你行互联网科技有限公司 盛创互联网科技有限公司 深圳前海聚择互联网科技有限公司 央行互联网金融科技公司 互联网金融中的现代科技 智腾互联网科技有限公司 青岛科技大学互联网大赛研究生 玉溪互联网科技怎么选 国大互联网教育科技有限公司工作 长沙茂晟互联网科技有限公司 工业互联网等科技实现智能化赋能 山东星卡互联网科技有限公司官网 广州互联网高科技取餐柜 互联网科技手机排行榜 中国科技和美国互联网 美国五大互联网科技公司市值多少 互联网科技对化妆品行业 互联网科技企业 鑫亿盛互联网科技 互联网科技的未来发展 中国互联网金融科技基金 互联网系的金融科技公司 受益于互联网科技的高速发展 长沙茂晟互联网科技有限公司 半导体是互联网高科技吗 西安左小互联网科技有限公司 悟空问答互联网科技
0