设为首页 收藏本站
查看: 784|回复: 0

[经验分享] SQL Server-聚焦UNIOL ALL/UNION查询(二十三)

[复制链接]

尚未签到

发表于 2017-7-13 18:28:19 | 显示全部楼层 |阅读模式
前言
  本节我们来看看有关查询中UNION和UNION ALL的问题,简短的内容,深入的理解,Always to review the basics。

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



USE TSQL2012
GO
--USE UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 2
UNION ALL
SELECT 3
--USE UNION
SELECT 1
UNION
SELECT 2
UNION
SELECT 2
UNION
SELECT 3
DSC0000.png

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

进一步探讨UNION 和 UNION ALL性能问题
  我们首先创建两个测试表Table1和Table2



USE TSQL2012
GO
CREATE TABLE Table1
(
col VARCHAR(10)
)
CREATE TABLE Table2
(
col VARCHAR(10)
)
  在表Table1中插入如下测试数据



USE TSQL2012
GO
INSERT INTO Table1
SELECT 'First'
UNION ALL
SELECT 'Second'
UNION ALL
SELECT 'Third'
UNION ALL
SELECT 'Fourth'
UNION ALL
SELECT 'Fifth'
  在表Table2中插入如下测试数据



USE TSQL2012
GO
INSERT INTO Table2
SELECT 'First'
UNION ALL
SELECT 'Third'
UNION ALL
SELECT 'Fifth'
  我们查询下两个表插入的测试数据



USE TSQL2012
GO
SELECT *
FROM Table1
SELECT *
FROM Table2
DSC0001.png

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



USE TSQL2012
GO
--UNION ALL
SELECT *
FROM Table1
UNION ALL
SELECT *
FROM Table2
--UNION
SELECT *
FROM Table1
UNION
SELECT *
FROM Table2
DSC0002.png

DSC0003.png

  此时我们能够很明显的看到因为UNION要去除重复所以会进行DISTINCT Sort操作使得其性能要低于UNION ALL。到这里我们可以下个基本结论。
  UNION VS UNION ALL性能分析结论:当使用UNION查询语句时类似会进行SELECT DISTINCT操作,除非我们非常明确要返回唯一不重复的值那就用UNION,否则使用UNION ALL会带来更好的性能,返回结果集更快。
  是不是到此就完了呢,使用UNION和UNION ALL就这么简单么,那你就太天真了,我们继续往下看。

深入探讨UNION 和 UNION ALL(一)
  我们声明一个表变量插入数据并利用UNION ALL来进行查询



USE TSQL2012
GO
DECLARE @tempTable TABLE(col TEXT)
INSERT INTO @tempTable(col)
SELECT 'JeffckyWang'
SELECT col FROM @tempTable
UNION ALL
SELECT 'Test UNION ALL'
DSC0004.png

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



USE TSQL2012
GO
DECLARE @tempTable TABLE(col TEXT)
INSERT INTO @tempTable(col)
SELECT 'JeffckyWang'
SELECT col FROM @tempTable
UNION
SELECT 'Test UNION ALL'
DSC0005.png

  此时毛病就出来了,说什么数据类型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 TSQL2012
GO
CREATE TABLE Table1 (ID INT, Col1 VARCHAR(100));
CREATE TABLE Table2 (ID INT, Col1 VARCHAR(100));
GO
INSERT INTO Table1 (ID, Col1)
SELECT 1, 'Col1-t1'
UNION ALL
SELECT 2, 'Col2-t1'
UNION ALL
SELECT 3, 'Col3-t1';
INSERT INTO Table2 (ID, Col1)
SELECT 3, 'Col1-t2'
UNION ALL
SELECT 2, 'Col2-t2'
UNION ALL
SELECT 1, 'Col3-t2';
GO
  此时我们查询上述Table1和Table2数据如下:
DSC0006.png

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

  当我们进行UNION ALL时呢



USE TSQL2012
GO
SELECT ID, Col1
FROM dbo.Table1
  UNION ALL
SELECT ID, Col1
FROM dbo.Table2
GO
DSC0008.png

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



USE TSQL2012
GO
SELECT ID, Col1
FROM dbo.Table1
UNION ALL
SELECT ID, Col1
FROM dbo.Table2
ORDER BY ID
GO
DSC0009.png

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



USE TSQL2012
GO
SELECT * FROM
(SELECT ID, Col1 FROM dbo.Table1
UNION ALL
SELECT ID, Col1 FROM dbo.Table2) as t
ORDER BY ID
DSC00010.png

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



USE TSQL2012
GO
SELECT ID, Col1, 'addtionalcol1' AS addtionalCol
FROM dbo.Table1
UNION ALL
SELECT ID, Col1, 'addtionalCol2' AS addtionalCol
FROM dbo.Table2
ORDER BY addtionalCol, ID
GO
DSC00011.png

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

总结
  本节我们详细讲了UNION和UNION ALL的使用以及需要注意的地方,最近时间比较充足,就马不停蹄的一下子写了很多篇,比较猛,都是一些基础知识吧,下一节我们开始进入表表达式的学习,简短的内容,深入的理解,我们下节再会。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393504-1-1.html 上篇帖子: SQL Server 2012 联机丛书安装 下篇帖子: 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表