前言

本节我们来看看有关查询中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 1UNION ALL
SELECT 2UNION ALL
SELECT 2UNION ALL
SELECT 3--USE UNION
SELECT 1UNION
SELECT 2UNION
SELECT 2UNION
SELECT 3

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

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

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

USE TSQL2012
GOCREATE TABLE Table1
(col VARCHAR(10)
)CREATE TABLE Table2
(col VARCHAR(10)
)

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

USE TSQL2012
GOINSERT INTO Table1
SELECT 'First'
UNION ALL
SELECT 'Second'
UNION ALL
SELECT 'Third'
UNION ALL
SELECT 'Fourth'
UNION ALL
SELECT 'Fifth'

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

USE TSQL2012
GOINSERT INTO Table2
SELECT 'First'
UNION ALL
SELECT 'Third'
UNION ALL
SELECT 'Fifth'

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

USE TSQL2012
GOSELECT *
FROM Table1SELECT *
FROM Table2

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

USE TSQL2012
GO--UNION ALL
SELECT *
FROM Table1
UNION ALL
SELECT *
FROM Table2--UNION
SELECT *
FROM Table1
UNION
SELECT *
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 TSQL2012
GODECLARE @tempTable TABLE(col TEXT)
INSERT INTO @tempTable(col)
SELECT 'JeffckyWang'SELECT col FROM @tempTable
UNION ALL
SELECT 'Test UNION ALL'

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

USE TSQL2012
GODECLARE @tempTable TABLE(col TEXT)
INSERT INTO @tempTable(col)
SELECT 'JeffckyWang'SELECT col FROM @tempTable
UNION
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 TSQL2012
GOCREATE 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 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数据如下:

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

当我们进行UNION ALL时呢

USE TSQL2012
GOSELECT ID, Col1
FROM dbo.Table1UNION ALL
SELECT ID, Col1
FROM dbo.Table2
GO

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

USE TSQL2012
GOSELECT ID, Col1
FROM dbo.Table1UNION ALL
SELECT ID, Col1
FROM dbo.Table2
ORDER BY ID
GO

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

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

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

USE TSQL2012
GOSELECT ID, Col1, 'addtionalcol1' AS addtionalCol
FROM dbo.Table1UNION ALL
SELECT ID, Col1, 'addtionalCol2' AS addtionalCol
FROM dbo.Table2
ORDER BY addtionalCol, ID
GO

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

总结

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

SQL Server-聚焦UNIOL ALL/UNION查询(二十三)相关推荐

  1. SQL Server 索引结构及其使用(二)(转)

    SQL Server 索引结构及其使用(二) 作者:freedk 一.深入浅出理解索引结构 改善SQL语句 很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被 ...

  2. 【转】SQL Server 索引结构及其使用(二)

    SQL Server 索引结构及其使用(二)  作者:freedk 一.深入浅出理解索引结构 改善SQL语句 很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会 ...

  3. SQL Server 大数据群集 部署(二)工具篇

    SQL Server 大数据群集 部署(二)工具篇 在进行部署大数据群集之前,先要安装一系列的工具,下表列出了常用的大数据群集工具以及如何安装它们: 工具 Required Description 安 ...

  4. SQL Server 2008性能故障排查(二)——CPU

    原文: SQL Server 2008性能故障排查(二)--CPU 承接上一篇:SQL Server 2008性能故障排查(一)--概论 说明一下,CSDN的博客编辑非常不人性化,我在word里面都排 ...

  5. 数据库入门教程(SQL Server 2005)----数据库是如何查询数据的

    数据库入门教程(SQL Server 2005)----数据库是如何查询数据的----查询:逻辑顺序 1.计算列 //以scott数据库中的emp表为例-----where可译为查找,其本质是在进行表 ...

  6. ACCP学习旅程之----- SQL Server(第五章 数据查询(二))

    特别注意:主外健关系中,名字可以不同,类型和长度必须相同. 1¥ 模糊查询     模糊查询提取的数据不一定是确切的,查询者对查询条件也是模糊的.大概的.不特别明确的. 1$ 使用Like进行模糊查询 ...

  7. SQL Server 索引结构及其使用(二)

    作者:freedk 一.深入浅出理解索引结构 改善SQL语句 很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select ...

  8. Microsoft SQL Server 2008技术内幕:T-SQL查询---------逻辑查询处理

    Three-Valued Logic(三值逻辑) SQL values: TRUE, FALSE, UNKNOWN 由于查询筛选器中 (ON, WHERE, and HAVING) 将UNKNOW认定 ...

  9. 【SQL Server】数据库开发指南(二)MSSQL数据库开发对于库、表、数据类型、约束等相关操作

    文章目录 一.SQL Server 中的 GO 关键字 二.切换不同数据库 三.创建.删除数据库 3.1 创建方式1:基本创建(适合演示和学习) 3.2 创建方式2:设置存储位置以及大小等 3.2 创 ...

最新文章

  1. JDK相关版本特性浏览
  2. matplotlib 波士顿房价数据集可视化
  3. Spring使用环境变量控制配置文件加载(转)
  4. 微信小程序ios可以上下左右拖动的问题
  5. HttpServlet中的service方法
  6. 输出cglib以及jdk动态代理产生的class文件
  7. java basic类似的地方_java – Shiro使用HTTP Basic Auth或匿名访问相同的URI
  8. Possible iteration over unexpected (custom / inherited) members, probably missing hasOwnProperty che
  9. 136.只出现一次的数字
  10. leetcode--single number.
  11. “恭喜那些拿到 Java 月薪 2 万 Offer 的人”
  12. Python画汉诺塔
  13. windows下部署一天日报系统
  14. 手机经常收到回复TD退订,回还是不回?今天总算是弄清楚了
  15. abel数值反演的matlab实现,abel变换数值反演的积分算子方法.pdf
  16. 2021年全球渗膜式空气干燥器收入大约525百万美元,预计2028年达到580百万美元
  17. confirm点确认跳转,点取消关闭
  18. CSS unicode-range特定字符使用font-face自定义字体
  19. 绝了!搜狗输入法这骚操作!
  20. Java String API 常用的String方法详解

热门文章

  1. 7种从头开始免费学习编程的方法
  2. 如何使用数据库SCHEDULER来执行清归档脚本
  3. 学计算机的八字,计算机教室八字格言
  4. Java设计模式(二十二):原型设计模式
  5. yolov3 推理所需要的时间_目标检测-番外五:YOLOv3-Plus
  6. 阐述计算机历程以及未来发展方向,计算机程序的发展史
  7. android字体行距,android textview设置字体的行距和字间距
  8. python自动化测试数据驱动_Python 自动化测试(四):数据驱动
  9. jrebel热部署不起作用_5种SpringBoot热部署方式,你用哪种?
  10. 代码大全阅读笔记02