SQL Server中的集合运算包括UNION(合并),EXCEPT(差集)和INTERSECT(相交)三种。

集合运算的基本使用

1.UNION(合并两个查询结果集,隐式DINSTINCT,删除重复行)

--合并两个提取表/派生表(derived table), 返回结果为:[a,b,c,d,e]
SELECT FC FROM (VALUES('a'),('b'),('c'),('e')) Table1 (FC)
UNION
SELECT FC FROM (VALUES('a'),('b'),('c'),('d')) Table2 (FC)

2.UNION ALL(简单合并两个查询结果集,不删除重复行)

--提取表/派生表(derived table)可以是多列,列名、顺序可以不同,但列数必须相同
SELECT * FROM (VALUES('a','Anna'),('b','Bob'),('c','Cassie'),('e','Elina')) Table1 (FC, Name)
UNION ALL
SELECT * FROM (VALUES('a','Anna'),('b','Bob'),('c','Cassie'),('d','David')) Table2 (FC, Name)

3.EXCEPT(返回出现在第一个结果集但不出现在第二个结果集中的所有行)

--返回结果为:[e]
SELECT FC FROM (VALUES('a'),('b'),('c'),('e')) Table1 (FC)
EXCEPT
SELECT FC FROM (VALUES('a'),('b'),('c'),('d')) Table2 (FC)

4.INTERSECT(返回第一个查询结果集和第二个查询结果集共有的部分)

--返回结果为:[a,b,c]
SELECT FC FROM (VALUES('a'),('b'),('c'),('e')) Table1 (FC)
INTERSECT
SELECT FC FROM (VALUES('a'),('b'),('c'),('d')) Table2 (FC)

集合运算的使用场景

1.使用UNION代替Where子句中的OR,查询速度更快

--使用Where子句 + OR
SELECT name, population, area FROM world WHERE area > 3000000 OR population > 25000000 --使用UNION
SELECT name, population, area FROM world WHERE area > 3000000
UNION
SELECT name, population, area FROM world WHERE population > 25000000

2.使用EXCEPTINTERSECT, 过滤出列表中不存在/存在于数据库中的项

假设存在表Customers, 数据如下表所示

cust_id cust_name cust_address cust_city cust_state cust_country cust_contact cust_email
1000000001 Village Toys 200 Maple Lane Detroit MI USA John Smith sales@villagetoys.com
1000000002 Kids Place 333 South Lake Drive Columbus OH USA Michelle Green NULL
1000000003 Fun4All 1 Sunny Place Muncie IN USA Jim Jones jjones@fun4all.com
1000000004 Fun4All 829 Riverside Drive Phoenix AZ USA Denise L. Stephens dstephens@fun4all.com
1000000005 The Toy Store 4545 53rd Street Chicago IL USA Kim Howard NULL
--过滤出列表中不存在于数据库中的项
--返回结果为['1000000006','1000000007']
SELECT [Id] AS [cust_id] FROM
(
VALUES('1000000004'),('1000000005'),('1000000006'),('1000000007')
) dt ([Id])
EXCEPT
SELECT [cust_id] FROM [Customers] --过滤出列表中存在于数据库中的项
--返回结果为['1000000004','1000000005']
SELECT [Id] AS [cust_id] FROM
(
VALUES('1000000004'),('1000000005'),('1000000006'),('1000000007')
) dt ([Id])
INTERSECT
SELECT [cust_id] FROM [Customers]
--对于SQLServer 2008以前的版本
SELECT [Id] AS [cust_id] FROM
(
SELECT '1000000004' UNION ALL
SELECT '1000000005' UNION ALL
SELECT '1000000006' UNION ALL
SELECT '1000000007'
) dt ([Id])
INTERSECT
--EXCEPT
SELECT [cust_id] FROM [Customers]
//使用C#动态生成SQL语句
var list = new List<string>(){"1000000004","1000000005","1000000006","1000000007"};
string sqlQuery = string.Format($@"
SELECT [Id] AS [cust_id] FROM
(
VALUES('{string.Join("'),('", list)}')
) dt ([Id]
INTERSECT
--EXCEPT
SELECT [cust_id] FROM [Customers]"
);

更多参考

SQL Server中的集合运算: UNION, EXCEPT和INTERSECT的更多相关文章

  1. 集合运算—union(并集)、intersect(交集)和except(差集)

    一.集合运算的基本格式是: 集合查询1 <集合运算> 集合查询2 [order by ...] 二.集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐 ...

  2. sql server 中进行除法运算时,如何得到结果是小数形式呢?

    我们正常进行除法运算时,sql默认是返回一个四舍五入的数 比如12除以5,17除以3 --算法1:返回结果:2 需要的是2.40 ) as 结果1 --算法2:返回结果:5 需要的是5.67 ) as ...

  3. SQL Server中常用的SQL语句(转):

    SQL Server中常用的SQL语句 转自:http://www.cnblogs.com/rainman/archive/2013/05/04/3060428.html 1.概述 名词 笛卡尔积.主 ...

  4. SQL Server中常用的SQL语句

    1.概述 名词 笛卡尔积.主键.外键 数据完整性 实体完整性:主属性不能为空值,例如选课表中学号和课程号不能为空 参照完整性:表中的外键取值为空或参照表中的主键 用户定义完整性:取值范围或非空限制,例 ...

  5. SQL Server 中关于EXCEPT和INTERSECT的使用方法

    熟练使用SQL Server中的各种使用方法会给查询带来非常多方便.今天就介绍一下EXCEPT和INTERSECT.注意此语法仅在SQL Server 2005及以上版本号支持. EXCEPT是指在第 ...

  6. SQL Server中一些有用的日期sql语句

    SQL Server中一些有用的日期sql语句 1.一个月第一天的 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一 SELECT DA ...

  7. 集合运算(UNION)

    表的加法 集合运算:就是满足统一规则的记录进行的加减等四则运算. 通过集合运算可以得到两张表中记录的集合或者公共记录的集合,又或者其中某张表中记录的集合. 集合运算符:用来进行集合的运算符. UNIO ...

  8. SQL Server中行列转换 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  9. SQL Server中关于跟踪(Trace)那点事

    前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...

随机推荐

  1. MapReduce的运行流程概述

    MapReduce处理数据的大致流程 ①InputFormat调用RecordReader,从输入目录的文件中,读取一组数据,封装为keyin-valuein对象 ②将封装好的key-value,交给 ...

  2. 网络编程-HTTPS

    明文: 对称加密: 非对称:(公钥:pk 私钥:sk) 对称+非对称: 先用非对称方式发送num1给server,server用私钥得出key(由num1算出来),自此,约定C.S以此key(num1 ...

  3. easyUI时间控件

    ##=============================JSP======================================<div class="labelw l ...

  4. OSCP Learning Notes - Post Exploitation(4)

    Pivoting 1. Edit the virtual network settings of the Vmware. 2. Set the Network Adapter(s) of Kali L ...

  5. P4017 最大食物链计数 (拓扑排序)

    看到拓扑排序感觉非常遥远的复杂,不喜欢图.看了拓扑排序的原理,很像广搜. 以本题样例为例: 了解一下 出度 和 入度 5的出度为3 入度为 0 ,3的出度为2  入度为2…… for循环 找到秃头 5 ...

  6. 五分钟带你深入了解Redis

    相信phper都知道Redis是什么,既然如此,为表仪式感,首先我还是得说说什么是Redis. Redis是什么 redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是 ...

  7. 题解 CF576D 【Flights for Regular Customers】

    对每条边来说,可以走这条边的限制解除是按\(d\)的顺序,所以先对每条边按\(d\)排序. 然后考虑每两条边之间的处理,用一个矩阵表示当前走\(d\)步是否可以从一个点到另一个点,称其为状态矩阵,用另 ...

  8. DJANGO-天天生鲜项目从0到1-004-用户模块-个人中心页

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  9. liunx安装和部署nacos配置中心

    1.下载https://github.com/alibaba/nacos/releases  nacos-server-1.3.1.tar.gz  源码包2.上传到liunx服务器   /usr/lo ...

  10. sqlite文件的建立和as的应用,

    建立目录D:\android_projects\qrscan\app\src\main\assets把数据库文件d:\sqlite_files\device.db 拷贝到 D:\android_pro ...