《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' - ...
随机推荐
- 关于Logcat
1 android logcat api Log.i(String tag, String msg) info,普通信息 Log.d(String tag, String msg) debug,调试信 ...
- [19/10/16-星期四] Python中的文件操作
一.打开文件 # open(file, mode='r', buffering=-1, encoding_=None, errors=None, newline=None, closefd=True, ...
- 通过编写串口助手工具学习MFC过程——(一)工程新建
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- POJ 3414 Pots (BFS/DFS)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7783 Accepted: 3261 Special Ju ...
- Chrome开发者工具详解(三)之浏览器调试完后如何清除所有的断点
- WordPress用户的权限类
WordPress的权限类这是管理 WordPress 用户权限最常用的函数.WordPress 用于角色和权限幕后工作的三个类,以及这些类提供的接口,我们可以在插件中进行高级权限管理.这三个类是: ...
- 利用WebSocket和EventSource实现服务端推送
可能有很多的同学有用 setInterval 控制 ajax 不断向服务端请求最新数据的经历(轮询)看下面的代码: setInterval(function() { $.get('/get/data- ...
- Python 操作sqlite数据库及保存查询numpy类型数据(一)
# -*- coding: utf-8 -*- ''' Created on 2019年3月6日 @author: Administrator ''' import sqlite3 import nu ...
- IO流二
1 数据流(了解) 1.1 概述 为了方便的操作java语言的基本数据类型和String类型的数据,可以使用数据流. 数据流的分类: DataInputStream DataOutputStream ...
- Django【第3篇】:Django之模板语法
Django框架之第三篇模板语法(重要!!!) 一.什么是模板? 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板. 二.模板语法分类 一.模板语法之变量:语法为 {{ }}: ...