T-SQL:探究UNOIN,INTERSECT,EXCEPT集合运算符(十一)

1.UNOIN运算符

unoin合并了两个输入查询结果 并消除重复项  简单点说   就是输出并集 

SELECT country, region, city FROM HR.Employees
UNION
SELECT country, region, city FROM Sales.Customers;

默认删除 集合重复项   UNION DISTINCT 

UNION ALL运算符   直接合并集合 不去重复项    也就是说 UNION 添加 ALL 会消除sql 的默认检查重复项功能   在不需要重复项功能下 用 UNION ALL 性能更高。

2.INTERSECT

返回两个结果集的交集 返回同时出现的数据  多次重复只返回一条  和UNOIN 一样默认去重复功能 

但是 SQL 中并不支持 INTERSECT ALL 的语法  

可以通过开窗函数实现这个功能

SELECT
  ROW_NUMBER() 
    OVER(PARTITION BY country, region, city
         ORDER     BY (SELECT 0)) AS rownum,
  country, region, city
FROM HR.Employees

INTERSECT

SELECT
  ROW_NUMBER() 
    OVER(PARTITION BY country, region, city
         ORDER     BY (SELECT 0)),
  country, region, city
FROM Sales.Customers;

其中 SELECT 0 是告诉SQL 不需要做排序开销 仅给数字分配 

3.EXCEPT

 集合差  集合A-集合B =元素属于A 但不属于B集合   

EXCEPT 也是隐式 去除重复项  例:

SELECT country, region, city FROM HR.Employees
EXCEPT
SELECT country, region, city FROM Sales.Customers;

前面的是A集合 except 后面的是B集合  相减就是结果集

同样的 SQL 中并不支持 EXCEPT  ALL 的语法   也可以用开窗函数实现

WITH EXCEPT_ALL
AS
(
  SELECT
    ROW_NUMBER() 
      OVER(PARTITION BY country, region, city
           ORDER     BY (SELECT 0)) AS rownum,
    country, region, city
  FROM HR.Employees

  EXCEPT

  SELECT
    ROW_NUMBER() 
      OVER(PARTITION BY country, region, city
           ORDER     BY (SELECT 0)),
    country, region, city
  FROM Sales.Customers
)
SELECT country, region, city
FROM EXCEPT_ALL;

记住如果要使用多个集合语句  就要注意优先级问题

INTERSECT 是优先于EXCEPT,UNION的    例子

SELECT country, region, city FROM Production.Suppliers as a
EXCEPT
SELECT country, region, city FROM HR.Employees as b
INTERSECT
SELECT country, region, city FROM Sales.Customers as c ;

实际上 先是计算出 b和c 的交集   再去  减a   结果式子就是 a-(b N c) 而不是  (a-b) N c   

 

转载于:https://www.cnblogs.com/feizianquan/p/9425475.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值