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. 用matplotlib库画图

    1.用例一 import matplotlib.pyplot as plt import numpy as np x=np.linspace(0,10,100) y=np.cos(2*np.pi*x) ...

  2. matlab读取txt文本

    textread函数 原文:http://blog.sina.com.cn/s/blog_618af1950100k926.html 文档:https://ww2.mathworks.cn/help/ ...

  3. HTML5 tricks for mobile

    iOS 7.1的Safari为meta标签新增minimal-ui属性,在网页加载时隐藏地址栏与导航栏 01. Creating a fullscreen experience On Android  ...

  4. 【BZOJ4753】最佳团体(分数规划,动态规划)

    [BZOJ4753]最佳团体(分数规划,动态规划) 题面 BZOJ Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一 ...

  5. Asp.net Web Api开发Help Page 添加对数据模型生成注释的配置和扩展

    在使用webapi框架进行接口开发的时候,编写文档会需要与接口同步更新,如果采用手动式的更新的话效率会非常低.webapi框架下提供了一种自动生成文档的help Page页的功能. 但是原始版本的效果 ...

  6. Javascript闭包例子

    闭包的概念 内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止.可理解为,闭包就是能够读取其他函数内部变量的函数. 表现形式是:定义在函数内部的函数. function f1() ...

  7. FPGA代码一位半加器入门-第2篇

    1. 代码比较简单,总结起来是用逻辑运算替代了数学运算加减,应该是因为这样的逻辑资源耗费的少.S是A+B的个位,CO是A+B的进位. module half_adder(A,B,S,CO); inpu ...

  8. python 安装 MySQL-python

    $python >>> import MySQLdb Traceback (most recent call last): File "<stdin>" ...

  9. 初学Direct X(8) ——碰撞检测

    初学Direct X(8) --碰撞检测 真正让一个游戏鹤立鸡群的是程序对碰撞的响应有多好,这里介绍两种检测的方法: 1) 基于边框的碰撞检测 2) 基于距离的碰撞检测 1. 基于边框的碰撞检测 1. ...

  10. servlet和Jsp的复习整理

    servlet 1.生命周期 a.构造方法.生成一个servlet b.init()方法.当开启服务器时,servlet第一次被装载,servlet引擎调用这个servlet的init()的方法,只调 ...