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'', ...
随机推荐
- 天津市人民优步Uber司机奖励政策(9月14日~9月20日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- ROS(二)Service通信
使用自定义的消息类型,实现service方式的节点间双向通信 在package目录下创建msg和srv目录,存放package需要使用的.msg和.srv文件. 在ROS中,message被设计为一种 ...
- Habse中Rowkey的设计原则——通俗易懂篇
Hbase的Rowkey设计原则 一. Hbase介绍 HBase -> Hadoop Database,HBase是Apache的Hadoop项目的子项目.HBase不同于一般的关系数据库,它 ...
- Ruby 基础教程1-3
1.命令行参数ARGV[] 2.文件读取 file=File.open(filename) text=file.read print text file.close 一次读取所有内容耗内存,耗 ...
- iTextSharp动态生成多页pdf及追加内容等记录
1.要动态生成pdf,无非是用第三方或直接代码生成. 2.iTextSharp生成pdf问题点记录 dll相关下载 https://files.cnblogs.com/files/xlgwr/iTex ...
- 【廖雪峰老师python教程】——进程与线程
多进程 操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去.表面上看,每个任务都是交替执行的,但是,由于CPU ...
- MySQL日期比较
假如有个表product有个字段add_time,它的数据类型为datetime,有人可能会这样写sql: select * from product where add_time = '2013-0 ...
- Jmeter使用之:高效组织接口自动化用例技巧
Jmeter怎么使用的文章多如牛毛,但怎么组织好测试用例,则几乎很难看到.在本文,我将把Jmeter下怎么组织测试用例的几点心得分享给大家,希望能给你一些帮助或启示. 1.善用“逻辑控制器”中的“简单 ...
- 用python读取配置文件config.ini
还在学习中...写的有点凌乱 感觉还是应该先学会读取配置文件才行,把一些经常需要修改的但是又经常需要用到的参数放到配置文件中方便使用(我是这么觉得的) 首先是config.ini的存放位置,我们把它放 ...
- Selenium(Python)等待元素出现
1.显式等待 from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdri ...