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. 访问控制列表与SSH结合使用,为网络设备保驾护航,提高安全性

    通过之前的文章简单介绍了华为交换机如何配置SSH远程登录,在一些工作场景,需要特定的IP地址段能够SSH远程访问和管理网络设备,这样又需要怎么配置呢?下面通过一个简单的案例带着大家去了解一下. 要实现 ...

  2. 小谢第37问:关于websocket推送进度,本地保存进度条,然后跳出页面进入后再显示的问题

    1.主要技术点:sessionStorage 会话存储进度 这里在使用之前,顺便说一下cookie.sessionStorage.localStorage 共同点:都是保存在浏览器端,且同源的. 区别 ...

  3. ant design pro : 依赖项 webpack-theme-color-replacer 最新版导致项目无法启动?

    重新装了一个项目的依赖,结果发现打不开了? 报错如下: This dependency was not found: * webpack-theme-color-replacer/client in ...

  4. Puppeteer爬虫实战(一)

    Puppeteer 爬虫技术实践 信息简介 Puppeteer是Chrome开发团队发布的一个通过Chrome DevTool Protocol来控制浏览器Chrome(下文若无显式称呼Chromiu ...

  5. 分布式锁(3) ----- 基于zookeeper的分布式锁

    分布式锁系列文章 分布式锁(1) ----- 介绍和基于数据库的分布式锁 分布式锁(2) ----- 基于redis的分布式锁 分布式锁(3) ----- 基于zookeeper的分布式锁 代码:ht ...

  6. Python编程无师自通PDF高清完整版免费下载|百度网盘

    百度网盘:Python编程无师自通PDF高清完整版免费下载 提取码:cx73 内容介绍 畅销Python编程类入门书,美国亚马逊Kindle编程类排行榜榜一. 作者从文科毕业,通过自学编程转行为专业程 ...

  7. 互联网找的e是无理数的初等证明

    e的两种计算方式 \(e=lim_{n \to \infty}(1+\frac{1}{n})^n\) \(e=\sum_{n=0}^{+\infty}\frac{1}{n!}\) \(即,e=\fra ...

  8. 一款功能简约到可怜的SQL 客户端

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  9. PHP 实例 - AJAX 实时搜索-AJAX Live Search

    PHP 实例 - AJAX 实时搜索 AJAX 可为用户提供更友好.交互性更强的搜索体验. AJAX Live Search 在下面的实例中,我们将演示一个实时的搜索,在您键入数据的同时即可得到搜索结 ...

  10. Python os.lstat() 方法

    概述 os.lstat() 方法用于类似 stat() 返回文件的信息,但是没有符号链接.在某些平台上,这是fstat的别名,例如 Windows.高佣联盟 www.cgewang.com 语法 ls ...