数据库-差集交集并集

[toc]

图示

一、并集运算(UNION)

并集:两个集合的并集是一个包含集合A和B中所有元素的集合。

在T-SQL中,UNION集合运算可以将两个输入查询的结果组合成一个结果集。

需要注意的是:如果一个行在任何一个输入集合中出现,它也会在UNION运算的结果中出现。T-SQL支持以下两种选项

1、保留重复行

select country, region, city from hr.Employees
union all
select country, region, city from sales.Customers;

2、去除重复行

select country, region from hr. Employees
union
select country, region from sales.Customers;

二、交集返算(INTERSECT)

交集:两个集合(集合A和集合B)的交集是由既属于A,也属于B的所有元素組成的集合。

在T-SQL中,INTERSECT集合运算对两个输入查询的结果取其交集,只返回在两个查询结果集中都出现的行。INTERSECT集合运算在逻辑上会首先删除两个输入集中的重复行,然后返回只在两个集合中中都出现的行。换句话说:如果一个行在两个输入集中都至少出现一次,那么交集返回的结果中将包含这一行。

例如,下面返回既是雇员地址,又是客户地址的不同地址:

select country, region, city from hr.Employees
intersect
select country, region, city from sales.Customers;

这里需要说的是,集合运算对行进行比较时,认为两个NULL值相等,所以就返回该行记录。

三、差集返算(EXCEPT)

差集:两个集合(集合A和集合B)的由:属于集合A但不属于集合B的所有元素,組成的集合。

在T-SQL中,集合之差使用EXCEPT集合运算实现的。它对两个输入查询的结果集进行操作,反会出现在第一个结果集中,但不出现在第二个结果集中的所有行。EXCEPT结合运算在逻辑上首先删除两个输入集中的重复行,然后返回只在第一个集合中出现,在第二个结果集中不出现的所有行。

换句话说: 一个行能够被返回,仅当这个行在第一个输入的集合中至少出现过一 次,而且在第二个集合中一次也没出现过。

此外,相比UNION和INTERSECT,两个输入集合的顺序是会影响到最后返回结果的。

例如,借助EXCEPT运算,我们可以方便地实现属于A但不属于B的场景,下面返回属于员工地址,但不属于客户地址的地址记录:

select country, region, city from hr. Employees
except
select country, region, city from sales.Customers;

SQL定义了集合运算之间的优先级: INTERSECT最高,UNION和EXCEPT相等。

换句话说:首先会计算INTERSECT,然后按照从左至右的出现顺序依次处理优先级相同的运算。

select country, region, city from Production.Suppliers
except
select country, region, city from hr.Employees
intersect
select country, region, city from sales.Customers;

上面这段SQL代码,因为INTERSECT优先级比EXCEPT高,所以首先进行INTERSECT交集运算。因此,这个查询的含义是:返回没有出现在员工地址和客户地址交集中的供应商地址。

四、集合运算的优先级

  1. INTERSECT > UNION = EXCEPT

  1. 首先计算INTERSECT然后从左到右的出现顺序依次处理优先级的相同的运算。

  1. 可以使用圆括号控制集合运算的优先级,它具有最高的优先级。

在排序函数的OVER字句中使用ORDER BY ( SELECT <常量> )可以告诉sql server不必在意行的顺序。

使用表达式避开不支持的逻辑查询处理

集合运算查询本身并不持之除ORDER BY以外的其他逻辑查询处理阶段,但可以通过表表达式来避开这一限制。

解决方案就是:首先根据包含集合运算的查询定义一个表达式,然后在外部查询中对表达式应用任何需要的逻辑查询

处理。

(1)例如,下面的查询返回每个国家中不同的员工地址或客户地址的数量:

select country, COUNT(*) as numlocations
from (select country, region, cityfrom hr.Employeesunionselect country, region, cityfrom sales.Customers) as U
group by country;

(2)例如,下面的查询返回由员工地址为3或5的员工最近处理过的两个订单:

select empid, orderid, orderdate
from (select top (2) empid, orderid, orderdatefrom sales.Orderswhere empid = 3order by orderdate desc, orderid desc) as D1
union all
select empid, orderid, orderdate
from (select top (2) empid, orderid, orderdatefrom sales.Orderswhere empid = 5order by orderdate desc, orderid desc) as D2;

数据库-差集交集并集相关推荐

  1. mysql数据库取交集_不同数据库取并集、交集、差集

    一.并集: 需求:汇总t1.t2两表的数据 mysql.postgresql.oracle数据库取并集都是用union/union all关键字,不再赘述 二.交集: 需求:选出既在t1表又在t2表的 ...

  2. java 求交集 算法_Java计算交集,差集,并集的方法示例

    Java计算交集,差集,并集的方法示例 发布时间:2020-10-07 10:37:46 来源:脚本之家 阅读:106 作者:benbenkui 本文实例讲述了Java计算交集,差集,并集的方法.分享 ...

  3. php 队列取并集,PHP实现对数组简单求交集,差集,并集功能示例

    php 的 PHP实现对数组简单求交集,差集,并集功能示例 本文实例讲述了PHP实现对数组简单求交集,差集,并集功能.分享给大家供大家参考,具体如下: $arr1 = array( '0' => ...

  4. 求两个Linux文本文件的交集、差集、并集

    一.交集 sort a.txt b.txt | uniq -d 二.并集 sort a.txt b.txt | uniq 三.差集 a.txt-b.txt:sort a.txt b.txt b.txt ...

  5. lambda 对象去重_采用java8 lambda表达式 实现 java list 交集 并集 差集 去重复并集...

    采用java8 lambda表达式 实现java list 交集/并集/差集/去重并集 一般的javaList 交.并集采用简单的 removeAll retainAll 等操作,不过这也破坏了原始的 ...

  6. Java求两个数组的交集、差集、并集

    目录 Java求两个数组的并集,代码如下: Java求两个数组的交集,代码如下: Java求两个数组的差集,代码如下: 交集.差集.并集测试代码如下: Java求两个数组的并集,代码如下: /*** ...

  7. java实现交集并集差集

    java实现交集并集差集 ***`package 第一次模拟测试; import java.util.ArrayList; import java.util.HashSet; import java. ...

  8. 利用shell求取两个文件的交集、差集、并集等

    求文件行数 cat a.txt | wc -l 交集 sort a.txt b.txt | uniq -d 并集 sort a.txt b.txt | uniq 差集 (1) a.txt-b.txt ...

  9. java求集合的交集、差集和并集

    一.本文介绍两种写法 1原生写法 2com.google.guava写法 <dependency>     <groupId>com.google.guava</grou ...

最新文章

  1. ElasticSearch性能优化策略【转】
  2. Swift extension 扩展实用Tips
  3. 微信多开txt_微信仅需3步操作,就能多开登录?手把手包教包会
  4. Cognos 云最佳实践: 调整架构提供性能和可伸缩性
  5. ios 学习札记 细节(三)
  6. 安装mysql8._安装MySQL8(附详细图文)
  7. 散点画三维曲面图_UG 复杂曲面合金零件的数控加工
  8. php内核一 一次请求与结束
  9. 读读objc源码(二):weak类型指针的实现
  10. stm32f103c8t6最小系统电路原理图_嵌入式单片机之STM32F103C8T6最小系统板电路设计参考...
  11. (17)VHDL实现编码器
  12. 猫都能学会的Unity3D Shader入门指南(一)
  13. 【读书笔记】Java基础学习之目录
  14. VCAP5-DCA – What’s new?
  15. 从△走进OO,走进策略模式
  16. linux优化deepin启动速度,如何优化 Deepin 引导开机速度?
  17. w ndows7与windows10区别,windows7和10区别
  18. 拓嘉启远:拼多多月卡有哪两种?如何区别
  19. 数据的导出Excel表
  20. python3基础系列之六【输入输出file方法】

热门文章

  1. 北京多家大型驾校酝酿至少涨价10%
  2. import 与 import()
  3. Python的IDEL增加清屏功能
  4. ARM 37 个通用寄存器详解
  5. 服务器及存储产品默认管理IP地址及用户名密码
  6. 利用R语言实现OCR的笔记
  7. 移动安全-adb使用和提取apk文件
  8. [Web3.0]什么是Web3.0/时代
  9. 计算两个时间戳之间的自然天数
  10. ubuntu插入U盘,无法识别