SQL SERVER技术内幕之6 集合查询
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 集合查询的更多相关文章
- SQL SERVER技术内幕之3 联接查询
JOIN表运算符对两个输入表进行操作.联接有三种基本类型:交叉联接.内联接和外联接.这三种联接的区别是它们采用的逻辑查询处理步骤各不相同,每种联接都有一套不同的步骤.交叉联接只有一个步骤----笛卡尔 ...
- SQL SERVER技术内幕之4 子查询
最外层查询的结果集会返回给调用者,称为外部查询.内部查询的结果是供外部查询使用的,也称为子查询.子查询可以分成独立子查询和相关子查询两类.独立子查询不依赖于它所属的外部查询,而相关子查询则须依赖它所属 ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
- SQL SERVER技术内幕之10 可编程对象
一.变量 变量用于临时保存数据值,以供在声明它们的同一批处理语句中引用.例如,以下代码先声明一个数据类型为INT的变量@i,再将它赋值为10; DECLARE @i as INT; SET @i = ...
- SQL SERVER技术内幕之10 事务并发
1.事务 1.1事务的定义 事务是作为单个工作单元而执行的一系列操作.定义事务边界有显式和隐式两种.显式事务的定义以BEGIN TRAN作为开始,以COMMIT TRAN提交事务,以ROLLBACK ...
- SQL SERVER技术内幕之8 分组集
分组集就是分组(GROUP BY子句)使用的一组属性,在传统的SQL中,一个聚合查询只能定义一个分组集: 假设现在不想生成4个单独的结果集,而是希望生成一个统一的结果集,其中包含所有4个分组集的聚合 ...
- SQL SERVER技术内幕之5 表表达式
表表达式是一种命名的查询表达式,代表一个有效的关系表.可以像其他表一样,在数据处理语句中使用表表达式.SQL Server支持4种类型的表表达式:派生表(derived table).公用表表达式(C ...
- SQL SERVER技术内幕之7 透视与逆透视
1.透视转换 透视数据(pivoting)是一种把数据从行的状态旋转为列的状态的处理,在这个过程中可能须要对值进行聚合. 每个透视转换将涉及三个逻辑处理阶段,每个阶段都有相关的元素:分组阶段处理相关的 ...
- 不同SQL Server数据库之间的跨数据库查询
--不同SQL Server数据库之间的跨数据库查询 EXEC sp_addlinkedserver @server=N'OldDatabase', --自己定义别名 @srvproduct=N'', ...
随机推荐
- java对象转map
/** * java对象转map * @param obj * @return * @throws IllegalAccessException * @throws IllegalArgumentEx ...
- JavaScript预解析
定义:JavaScript"预解析",可以理解为把变量或函数预先解析到它们被使用的环境中. 通俗点讲,即认为浏览器在正式运行JavaScript代码前, 第一步,会预先根据关键字v ...
- BZOJ2330_糖果_KEY
题目传送门 看题目可知这是一道差分约束的题目. 根据每种关系建边如下: 对于每种情况建边,然后跑一边SPFA.(最长路) 因为可能会有自环或环的情况,都不可能存在. 跑SPFA时记录入队次数,超过N弹 ...
- [AGC011F] Train Service Planning [线段树优化dp+思维]
思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...
- 北京Uber优步司机奖励政策(3月2日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- day 2 飞机大战原理
1. 程序的图片的坐标 (左上角为顶点) 2.图片变成动态的 3.集成显卡 和独立显卡
- day 10 形态学处理 膨胀
#-*- coding:utf-8 -*- #1.导入包 import cv2 import numpy as np #2.导入图片 img = cv2.imread('home.jpg',0) #3 ...
- Entity Framework Core 导航属性 加载数据
Loading Related Data https://docs.microsoft.com/en-us/ef/core/querying/related-data Eager loading me ...
- itop4412开发板添加开机启动程序
1. 先编写代码,以helloworld.c为例子 #include<stdio.h> #include<unistd.h> //这个文件是什么 main() { ; ) { ...
- hdu1175连连看(dfs+细节)
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...