学堂 学堂 学堂公众号手机端

SQL集合运算怎么使用

lewis 5年前 (2020-04-01) 阅读数 5 #技术

我们知道集合在数学中表示各种事物的总和,在数据库中也有集合,表示记录的集合。表,视图和查询的执行结果都是记录的集合,其中元素为表或者查询结果中的每一行。SQL中集合运算符有UNION,EXCEPT和INTERSECT这三种,对应的是合并,差集和相交。下面我们就来看看SQL集合运算怎么使用。

集合运算的基本使用

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, 数据如下表所示


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]"
);

 

更多参考

Set Operators - EXCEPT and INTERSECT

Set Operators - UNION

以上就是关于SQL集合运算以及UNION, EXCEPT和INTERSECT三种集合运算符的使用示例介绍,希望对大家学习SQL有帮助,更多SQL相关内容大家可以继续关注其他文章。

cust_idcust_namecust_addresscust_citycust_statecust_countrycust_contactcust_email
版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门