《SQL Server 2012 T-SQL基础》读书笔记 - 6.集合运算
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.集合运算的更多相关文章
- SQL Server Window Function 窗体函数读书笔记二 - A Detailed Look at Window Functions
这一章主要是介绍 窗体中的 Aggregate 函数, Rank 函数, Distribution 函数以及 Offset 函数. Window Aggregate 函数 Window Aggrega ...
- SQL Server调优系列基础篇(子查询运算总结)
前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...
- SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第1部分)
为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行更新操作有关的附加过程.最后你会读到,优化性能时SQLServer使用还原工具的相关术语和流程. 关系和存储引擎 如图所示 ...
- SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第2部分)
计划缓存(Plan Cache) 如果SQL Server已经找到一个好的方式去执行一段代码时,应该把它作为随后的请求重用,因为生成执行计划是耗费时间且资源密集的,这样做是有有意义的. 如果没找到被缓 ...
- 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 ...
- sql server 2012 导出sql文件
导出表数据和表结构sql文件 在工作中,经常需要导出某个数据库中,某些表数据:或者,需要对某个表的结构,数据进行修改的时候,就需要在数据库中导出表的sql结构,包括该表的建表语句和数据存储语句!在这个 ...
- SQL Server Window Function 窗体函数读书笔记一 - SQL Windowing
SQL Server 窗体函数主要用来处理由 OVER 子句定义的行集, 主要用来分析和处理 Running totals Moving averages Gaps and islands 先看一个简 ...
- SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第3部分)(完结)
一个简单的更新查询 现在应该知道只读取数据的查询生命周期,下一步来认定当你需要更新数据时会发生什么.这个部分通过看一个简单的UPDATE查询,修改刚才例子里读取的数据,来回答. 庆幸的是,直到存取方法 ...
- SQL Server 2012 - 动态SQL查询
动态SQL的两种执行方式:EXEC @sql 和 EXEC sys.sp_executesql @sql DECLARE @c_ids VARCHAR(200) SET @c_ids ='1,2' - ...
随机推荐
- 打印 PRINT
打印 PRINT 字符串和数值类型 可以直接输出. print(1) #out:1 print('a') #out:a 变量 无论什么类型,数值,字符串,列表,字典...都可以直接输出 n = 1 s ...
- java基础笔记(7)
Socket编程 通信基础:ip地址(位置).协议(语言).端口(软件程序): java提供网络功能的四大类: InetAddress没有构造函数,不够里面有一些方法是可以返回实例,如: InetAd ...
- SQL查询结果列拼接成逗号分隔的字符串:group_concat
转自:SQL查询结果列拼接成逗号分隔的字符串 背景:做SQL查询时会经常需要,把查询的结果拼接成一个字符串. 解决方法: 通过 group_concat 函数 拼接的结果很长,导致拼接结果显示不全,可 ...
- Redis集群,备份,哨兵机制
原文:https://blog.csdn.net/zy345293721/article/details/87536144 1.集群 先来简单了解下redis中提供的集群策略, 虽然re ...
- [LeetCode] 130. 被围绕的区域
题目链接 : https://leetcode-cn.com/problems/surrounded-regions/ 题目描述: 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有 ...
- HNUSTOJ-1565 Vampire Numbers(暴力打表)
1565: Vampire Numbers 时间限制: 3 Sec 内存限制: 128 MB提交: 20 解决: 9[提交][状态][讨论版] 题目描述 The number 1827 is an ...
- .net WebApi使用swagger 美化接口文档
本文将一步步演示如何用swagger美化WebApi接口文档,为接口文档添加接口名称说明,为请求参数和返回数据结构字段含义添加注释说明 一.为WebApi项目安装Swagger 首先我们新建一个Web ...
- python 框架
支持异步的 python web 框架 tornado 轻量级 flask 框架 flask中文文档 import base64 import random import io import time ...
- vue项目,webpack中配置src路径别名及使用
1.项目结构: 2.在build文件夹下的webpack.base.conf.js文件中设置src的路径别名. 3.在js文件或者vue文件的script标签中使用: (1).js文件中导入示例: ( ...
- OneDrive网盘资源下载教程
目录 1. 本文地址 2. 下载流程 3. 打赏&支持 1. 本文地址 博客园:https://www.cnblogs.com/coco56/p/11161530.html CSDN:http ...