1.定义

集合运算会对两个输入查询的结果集进行逐行比较,根据比较结果和所使用的集合运算来确定某一行是否应该包含在集合运算的结果中。因为集合运算是针对集合之间进行的计算,所以集合运算涉及的两个查询不能包含Order By子句。包含Order By子句的查询可以确保结果的排列顺序,因此,这样的查询返回的不是集合,而是游标。

ANSI SQL对每种集合运算都支持两个选项:DISTINCT(默认值)和ALL,DISTINCT逻辑上可以从两个输入的多集中消除重复的行,然后返回一个集合。ALL对两个多集进行运算时不会删除重复行,而是会返回一个可能包含重复行的多集。SQL Server 2008均支持DISTINCT选项,但只在UNION中支持ALL选项。

2.特征

(1)参与集合运算的两个集合必须包含相同的列数,而且相应列必须具有兼容的数据类型,所谓”兼容的数据类型”是指优先级较低的数据类型必须能隐式地转换为较高级的数据类型
(2)集合运算结果中的列名由第一个查询决定,因此,如果要为结果列分配别名,应该在第一个查询中分配相应的别名。
(3)集合运算对行进行比较时,认为两个NULL是相等的。

3.UNION(并集)集合运算
两个集合的并集是指如果一个元素属于任何一个输入集合,那么它也属于结果集。
(1)UNION ALL集合运算
UNION ALL集合运算返回在输入的多集中出现的所有行,它实际上不会对行进行比较,也不会删除重复行。查询查询Query1返回m行,查询Query2返回n行,则Query 1 UNION ALL Query 2返回 m + n行。因为Union ALL不会删除重复行,所以它的结果是多集,而不是真正的集合。
(2)UNION DISTINCT
UNION集合运算通过删除重复的记录,生成的结果是一个真正的集合,而不是多集。

4.INTERSECT(交集)集合运算

在集合论中,两个集合(记为集合A和B)的交集是指由既属性A,也属于B的所有元素组成的集合。
(1)INTERSECT ALL集合运算
但INTERSECT ALL与UNION ALL有所不同:前者不会返回所有的重复行,而只返回重复行数目较少的那个多集中的所有重复行。如果行R在集合A中出现了x次,在集合B中出现了y次,则行R应该在运算的结果中出现min(x , y)次。
虽然SQL Server不支持内建的INTERSECT ALL运算,但用其他解决方案也能生成相同的结果。可以用ROW_NUMBER函数来计算每个输入查询中每行的出现次数,在函数的PARTITION BY子句中指定所有参与集合运算的行,并在ORDER BY子句中用SELECT <常量>来表明行的排列顺序不重要。以下是完整解决方案:

5.EXCEPT(差集集合运算)
在集合论中,集合A与集合B的差集是由属于集合A,但不属于集合B的元素组成的集合。
(1)EXCEPT ALL集合运算
假设行R在集合A中出现了x次,在集合B中出现了y次,且x>y,则在A EXCEPT ALL B中,R出现了x-y次。解决方案可以参照INTERSECT ALL集合运算的解决方案

6.集合运算的优先级
SQL定义了集合运算之间的优先级。INTERSECT运算比UNION和EXCEPT运算的优先级高,而UNION和EXCEPT的优先级相等。

7.避开不支持的逻辑查询处理
(1)只有Order by阶段才允许直接应用于集合运算的结果,示例如下:

如果要对集合运算的结果应用除ORDER BY以外的其他逻辑阶段,应该怎么办?通过使用表表可以轻易避开这个限制。

SQL SERVER技术内幕之6 集合查询的更多相关文章

  1. SQL SERVER技术内幕之3 联接查询

    JOIN表运算符对两个输入表进行操作.联接有三种基本类型:交叉联接.内联接和外联接.这三种联接的区别是它们采用的逻辑查询处理步骤各不相同,每种联接都有一套不同的步骤.交叉联接只有一个步骤----笛卡尔 ...

  2. SQL SERVER技术内幕之4 子查询

    最外层查询的结果集会返回给调用者,称为外部查询.内部查询的结果是供外部查询使用的,也称为子查询.子查询可以分成独立子查询和相关子查询两类.独立子查询不依赖于它所属的外部查询,而相关子查询则须依赖它所属 ...

  3. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  4. SQL SERVER技术内幕之10 可编程对象

    一.变量 变量用于临时保存数据值,以供在声明它们的同一批处理语句中引用.例如,以下代码先声明一个数据类型为INT的变量@i,再将它赋值为10; DECLARE @i as INT; SET @i = ...

  5. SQL SERVER技术内幕之10 事务并发

    1.事务 1.1事务的定义 事务是作为单个工作单元而执行的一系列操作.定义事务边界有显式和隐式两种.显式事务的定义以BEGIN TRAN作为开始,以COMMIT TRAN提交事务,以ROLLBACK ...

  6. SQL SERVER技术内幕之8 分组集

    分组集就是分组(GROUP BY子句)使用的一组属性,在传统的SQL中,一个聚合查询只能定义一个分组集: 假设现在不想生成4个单独的结果集,而是希望生成一个统一的结果集,其中包含所有4个分组集的聚合 ...

  7. SQL SERVER技术内幕之5 表表达式

    表表达式是一种命名的查询表达式,代表一个有效的关系表.可以像其他表一样,在数据处理语句中使用表表达式.SQL Server支持4种类型的表表达式:派生表(derived table).公用表表达式(C ...

  8. SQL SERVER技术内幕之7 透视与逆透视

    1.透视转换 透视数据(pivoting)是一种把数据从行的状态旋转为列的状态的处理,在这个过程中可能须要对值进行聚合. 每个透视转换将涉及三个逻辑处理阶段,每个阶段都有相关的元素:分组阶段处理相关的 ...

  9. 不同SQL Server数据库之间的跨数据库查询

    --不同SQL Server数据库之间的跨数据库查询 EXEC sp_addlinkedserver @server=N'OldDatabase', --自己定义别名 @srvproduct=N'', ...

随机推荐

  1. python学习笔记:第15天 初识面向对象

    目录 1. 面向对象和面向过程 2. 面向对象如何编写: 3. 面向对象的三大特征 封装 继承 多态 1. 面向对象和面向过程 面向对象和面向过程的理解: ⾯向过程: ⼀切以事物的流程为核⼼. 核⼼是 ...

  2. go包管理工具glide使用方法

    golang没有官方最佳管理方案,在go的世界里存在大量的自制解决方案. go语言的包是没有中央库统一管理的,通过使用go get命令从远程代码库(github.com,goolge code 等)拉 ...

  3. Excelファイルを扱う方法

    概要 データをローカルに落としたいという要件がある場合.ユーザーはExcelを希望するケースが多いだろう.そんな時は以下の汎用モジュールを使用して簡単に作る事ができます.使用方法は.GUI_UPLOA ...

  4. 【blockly教程】第六章 Blockly的进阶

    6.1 模块化程序设计  一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能.所有的高级语言中都有子程序这个概念,用子程序实现模块的功能.比如在C语言中,子程序的作用是由函数完成 ...

  5. P1126 机器人搬重物

    P1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有 ...

  6. ORB-SLAM(五)KeyFrame类-最小生成树

    KeyFrame中维护了一个map,保存了与当前帧共视的KeyFrame*与权重(共视MapPonits数量).对关键帧之间关系是用加权有向图来完成的,那么理解其spanning tree生成树的原理 ...

  7. 深入解析UUID及其应用(转载)

    UUID 编辑 UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Founda ...

  8. pygame安装【在pycharm的IDE project下】

    pygame安装[在pycharm的IDE project下] 首先更新电脑的pip.exe[命令行下面] 然后进入IDE project ——>setting 中查找是否安装pygame 我的 ...

  9. 使用httpClient获取请求cookie

    package mytest; import java.util.ArrayList; import java.util.List; import org.apache.http.NameValueP ...

  10. JS获取HTML DOM元素的8种方法

    什么是HTML DOM 文档对象模型(Document Object Model),是W3C组织推荐的处理可扩展置标语言的标准编程接口.简单理解就是HTML DOM 是关于如何获取.修改.添加或删除 ...