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'', ...
随机推荐
- STM32_1 搭建工程框架
搭建系统框架 -- 创建系统文件夹 -- 拷贝stm32库文件 -- 将文件添加至工程 -- 配置工程环境 1. 创建工程文件夹 找一个工程目录,我就在 stm32/Code 下创建一个模板工程Tem ...
- 20145234黄斐《Java程序设计》第四周学习总结
教材学习内容总结 第六章部分 - 继承与多态 何谓继承 继承面向对象中,子类继承父类,避免重复的行为定义.一般来说,父类的父类也称父类,且同一个子类只允许拥有一个父类,而同一个父类则可以拥有多个子类. ...
- HttpClient&Jsoup爬虫的简单应用
详细的介绍已经有很多前辈总结,引用一下该篇文章:https://blog.csdn.net/zhuwukai/article/details/78644484 下面是一个代码的示例: package ...
- MySQL高级-性能分析Explain
1.使用Explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的.分析你的查询语句或是表结构的性能瓶颈 . 2.执行方法:Explain + SQL语句 解释 ...
- 【完美解决】Spark-SQL、Hive多 Metastore、多后端、多库
[完美解决]Spark-SQL.Hive多 Metastore.多后端.多库 [完美解决]Spark-SQL.Hive多 Metastore.多后端.多库 SparkSQL 支持同时连接多种 Meta ...
- Http接口系列:如何提高Http接口用例的数据稳定性
此文已由作者王婷英授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 为了尽可能多的释放手工测试,提高测试效率,我们都会想到使用自动化测试,如http接口自动化测试.doubbo ...
- android 学习十四 探索安全性和权限
1.部署安全性:应用程序必须使用数字证书才能安装到设备上. 2.执行期间的安全性: 2.1 使用独立进程 2.2 使用固定唯一用户ID 2.3 申明性权限模型 3数字证书 ...
- 后续博客转移到zhylj.cc
此博客暂不更新了 zhylj.cc
- 如何利用Navicat导入/导出mssql中的数据
sqlserver,在第一次使用该软件进行"连接"的时候,会提示安装"Microsoft Sqlsever Navicat Client.",这时直接点击&qu ...
- 100万套PPT模板,包含全宇宙所有主题类型PPT,绕宇宙100圈,持续更新
100万套PPT模板,包含全宇宙所有主题类型PPT(全部免费,都是精品,没有一张垃圾不好看的PPT,任何一张PPT拿来套入自己的信息就可以立马使用),绕宇宙100圈,任意一个模板在某文库上都价不菲.强 ...