博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在 SELECT 查询中使用集运算符
阅读量:6949 次
发布时间:2019-06-27

本文共 2140 字,大约阅读时间需要 7 分钟。

  在 SELECT 查询中使用集运算符,可以将来自两个或多个查询的结果合并到单个结果集中。

  在进行集运算之前,请确保:

(1)所有输入集合中,列数和列的顺序必须相同。

(2)对应的列中,数据类型必须兼容。

  可以在一个查询中使用多个集运算符,运算时基于以下的优先级:

(1)包含在括号中的表达式。

(2)INTERSECT 运算符

(3)从左到右求值的 EXCEPT 和 UNION

一、UNION 和 UNION ALL

  UION 和 UNION ALL 用于合并两个输入查询的结果。如果某一行出现在任一输入集合中,那么它将出现在结果集合中。

  当对输入集合进行比较时,NULL 被视为相等。

  ORDER BY 不允许出现在输入集合中,但可以出现在输出结果中。

1. UNION ALL

  UNION ALL 返回所有的输入集合中的所有行,此过程不消除重复的数据行,因此相同的行可以在结果集合中多次出现。

SELECT country, region, city FROM Employees

UNION ALL

SELECT country, region, city FROM Customers

UNION ALL

SELECT country, region, city FROM Suppliers ;

2. UNION(隐式的DISTINCT)

  UNION(隐式的DISTINCT)不但组合两个输入集合,而且还将消除重复的数据行。如果某一行出现在两个输入集合中,那么它在结果集合中仅出现一次。由于排除了重复的数据行,因此需要额外的系统开销。

SELECT country, region, city FROM Employees

UNION

SELECT country, region, city FROM Customers

ORDER BY country, region, city ;

二、EXCEPT 和 INTERSECT

  EXCEPT 和 INTERSECT 比较两个输入查询的结果,返回非重复值。

  在查询执行计划的图形显示功能中,EXCEPT 运算被显示为 left anti semi join,INTERSECT 运算被显示为 left semi join。

1. EXCEPT

  EXCEPT从左输入集合中返回右输入查询中没有找到的所有非重复的值。

SELECT country, region, city FROM Employees

EXCEPT

SELECT country, region, city FROM Customers ;

2.INTERSECT

  INTERSECT返回两个输入集合中都返回的行,而且这些数据行只出现一次(非重复值)。

SELECT country, region, city FROM HR.Employees

INTERSECT

SELECT country, region, city FROM Sales.Customers ;

三、APPLY 运算符

  APPLY 运算符用在 FROM 子句。它的右边的表通常是一个表表达式(派生表或者是一个内联TVF)。

  CROSS APPLY 可以在为外部查询中的每行飞速生成数据子集的情况下使用。APPLY 运算与 JOIN 非常相似,不同之处在于 APPLY 的右侧的表表达式可以对来自左侧表的每一行表示一个不同的行集。也就是说,当在右侧使用一个表表达式时,表表达式可以引用左侧表的参数。

1. CROSS APPLY

  CROSS APPLY 允许用户指定根据外部查询中的行构造子集的方式。

SELECT

 *

FROM

 Orders AS O CROSS APPLY

 (

   SELECT TOP(2) * --for each row in Orders there will be at most 2 customers

   FROM Customers C

   WHERE C.[Customer ID] = O.[Customer ID]

   ORDER BY C.[Customer ID]

 ) AS theOrdersTopCustomers

2. OUTER APPLY

  与 CROSS APPLY 不同,OUTER APPLY 还保留外部查询中与内部查询不匹配的行。

SELECT S.supplierid, s.companyname, P.productid, P.productname, P.unitprice

FROM Production.Suppliers AS S

CROSS APPLY

dbo.fn_TopProductsByShipper(S.supplierid) AS P

  前面的示例显示 OUTER APPLY 结果包括客户 ID“PARIS”,原因是 Orders 表不包含“PARIS”的任何记录。因此,内部查询返回 NULL,原因是 TOP 客户 ID 与 Orders 表中的“PARIS”匹配。将 OUTER 更改为 CROSS 会从结果中排除“PARIS”。

转载地址:http://djhnl.baihongyu.com/

你可能感兴趣的文章
Java系列笔记(4) - JVM监控与调优
查看>>
ITK 4.8.1 Qt 5.4 MinGW 4.9.1 Configuration 配置
查看>>
短网址算法原理
查看>>
kvm 性能调优
查看>>
OC 实例变量(Instance Var)和成员变量(member var)区别
查看>>
hdu 1542 Atlantis 段树区,并寻求,,,尼玛真坑人数据,不要打开一小阵!
查看>>
ssh 登录出现的几种错误以及解决办法
查看>>
Win7 OpenCV 3.0.0 VS2013 环境配置
查看>>
Deep Learning 深度学习 学习教程网站集锦(转)
查看>>
[转]"由于这台计算机没有远程桌面客户端访问许可证,远程会话被中断"的解决方案...
查看>>
构建自己的Java并发模型框架
查看>>
fusionchart实现ZoomLine 源码 破解版 能够导出
查看>>
iframe动态创建及释放内存
查看>>
ORACLE工作原理小结
查看>>
LeetCode - Populating Next Right Pointers in Each Node
查看>>
管理团队时,怎样保证一直做正确的事?
查看>>
如果应用程序正在通过 <identity impersonate="true"/> 模拟,则标识将为匿名用户(通常为 IUSR_MACHINENAME)或经过身份验证的请求用户。...
查看>>
Oozie入门
查看>>
myeclipse一直bulid workspace 的解决
查看>>
表单元素之搭车系
查看>>