Chapter 6 Set Operators

语法如下:

Input Query1
<set_operator>
Input Query2
[ORDER BY ...]

有ORDER BY子句的查询不会返回一个set,而会返回一个cursor。上面的ORDER BY是对整个运算后的结果而言的。两个查询必须有相同数量的列,而且数据类型要兼容(低级的数据类型能隐式地转为高级的数据类型),结果集中的列名是由第一个查询的列名决定的。而且两个查询都不能有ORDER BY,如果你想用TOP什么的话,可以把它们分别封在一个表表达式里面。

UNION ALL会返回一个multiset,也就是可以包含重复行的集合。而UNION会去掉重复行。

INTERSECT会返回两个query的交集,结果不包含重复行。

去掉重复行的时候,两个NULL是算作相等。

SQL Server 2012没有提供“INTERSECT ALL”的功能,但是标准SQL有。INTERSECT ALL是这样的:对于两个集合中里面的相同的行,比如说第一个集合里面有三行(UK, NULL, London),第二个集合里面有五行(UK, NULL, London),那么最终的结果里面就有三行(UK, NULL, London),也就是取比较小的那个。这样很符合逻辑。如果想在SQL Server 2012中实现“INTERSECT ALL”的功能,就这样:

SELECT
ROW_NUMBER()
OVER(PARTITION BY country, region, city
ORDER BY (SELECT 0)) AS rownum,
country, region, city
FROM HR.Employees INTERSECT SELECT
ROW_NUMBER()
OVER(PARTITION BY country, region, city
ORDER BY (SELECT 0)),
country, region, city
FROM Sales.Customers;

这里的意思其实就是,把两个查询得到的相同的行都编个号,比如说第一个查询得到了三行(UK, NULL, London),那么我就把这三行编号成为1,2,3。第二个查询同理。

ORDER BY (SELECT <constant>)的意思是:排序无关紧要。

当然,结果中不应该包含编号这一列,那么你把上面那个定义成一个CTE,然后查询这个CTE就行了。

A EXCEPT B就相当于集合中的A - B,如下图所示:

EXCEPT ALL:如果第一个查询里面有5行X,第二个查询里面有3行X,那么结果就有2行X(5 - 3 = 2)要实现的话完全类似INTERSECT ALL,只要把其中的INTERSECT改成EXCEPT就行了。

由于Set Operators的优先级不同,所以如果混用多个的话,记得加括号。

《SQL Server 2012 T-SQL基础》读书笔记 - 6.集合运算的更多相关文章

  1. SQL Server Window Function 窗体函数读书笔记二 - A Detailed Look at Window Functions

    这一章主要是介绍 窗体中的 Aggregate 函数, Rank 函数, Distribution 函数以及 Offset 函数. Window Aggregate 函数 Window Aggrega ...

  2. SQL Server调优系列基础篇(子查询运算总结)

    前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...

  3. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第1部分)

    为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行更新操作有关的附加过程.最后你会读到,优化性能时SQLServer使用还原工具的相关术语和流程. 关系和存储引擎 如图所示 ...

  4. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第2部分)

    计划缓存(Plan Cache) 如果SQL Server已经找到一个好的方式去执行一段代码时,应该把它作为随后的请求重用,因为生成执行计划是耗费时间且资源密集的,这样做是有有意义的. 如果没找到被缓 ...

  5. SQL Sever 各版本下载 SQL Server 2012下载SQL Server 2008下载SQL Server 2005

    SQL Server 2012SQL Server 2012 开发版(DVD)(X64,X86)(中文简体)ed2k://|file|cn_sql_server_2012_developer_edit ...

  6. sql server 2012 导出sql文件

    导出表数据和表结构sql文件 在工作中,经常需要导出某个数据库中,某些表数据:或者,需要对某个表的结构,数据进行修改的时候,就需要在数据库中导出表的sql结构,包括该表的建表语句和数据存储语句!在这个 ...

  7. SQL Server Window Function 窗体函数读书笔记一 - SQL Windowing

    SQL Server 窗体函数主要用来处理由 OVER 子句定义的行集, 主要用来分析和处理 Running totals Moving averages Gaps and islands 先看一个简 ...

  8. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第3部分)(完结)

    一个简单的更新查询 现在应该知道只读取数据的查询生命周期,下一步来认定当你需要更新数据时会发生什么.这个部分通过看一个简单的UPDATE查询,修改刚才例子里读取的数据,来回答. 庆幸的是,直到存取方法 ...

  9. SQL Server 2012 - 动态SQL查询

    动态SQL的两种执行方式:EXEC @sql 和 EXEC sys.sp_executesql @sql DECLARE @c_ids VARCHAR(200) SET @c_ids ='1,2' - ...

随机推荐

  1. 【Linux-设备树】编译器DTC

    DTC编译器:设备树源码DTS文件编译为二进制文件DTB. DTC编译器的作用:就是对设备树的源码的文件进行语法检查,根据linux的内核要求检查各个节点以及属性,将设备树源码编译生成二进制文件,以保 ...

  2. [LeetCode] 103. 二叉树的锯齿形层次遍历

    题目链接 : https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/ 题目描述: 给定一个二叉树,返回其节 ...

  3. nginx启动报错

    nginx启动的时候报错 nginx: [emerg] invalid number of arguments in "root" directive in /etc/nginx/ ...

  4. spring boot 枚举使用的坑

    java 枚举的功能挺多,但是坑更多,使用的时候要注意.如下面这个枚举. @Getter @AllArgsConstructor public enum EnumExpenseType impleme ...

  5. 在SQL中存储过程的一般语法

    一般分为十种情况,每种语法各不相同: 1. 创建语法 1 2 3 4 5 6 7 create proc | procedure pro_name    [{@参数数据类型} [=默认值] [outp ...

  6. spark数据结构之RDD

    学习spark,RDD是一个逃不过去的话题,那么接下来我们看看RDD 1.什么是RDD? RDD叫做弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变.可分区.里面元素可以并行计算的集合 ...

  7. Memcached下载安装和使用

    一.简介:Memcached 是一个高性能的分布式,基于内存的key-value存储的对象缓存系统(并不是一个数据库),用于动态Web应用以减轻数据库负载. 二.下载和安装1.下载和安装Memcach ...

  8. 41. First Missing Positive (JAVA)

    Given an unsorted integer array, find the smallest missing positive integer. Example 1: Input: [1,2, ...

  9. Centos6.6安装MySQL5.6.24

    1.首先需要编译器gcc 编译器和cmake yum -y install gcc+ gcc-c++ cd /usr/local/src wget http://www.cmake.org/files ...

  10. STM32程序编写或调试犯过的错误

    1.宏定义后加了分号: eg: define NOKEY_PRES 0;      (❌) define NOKEY_PRES 0      (✔) 2.