SQL Server学习之路(六)

437 阅读4分钟

今天跟大家说说SQL Server的一个特性:集合

集合在我们上中学时就学过,什么交集(∩),并集(∪),差集等。在SQL Server上也有这样的应用,交集对应的是关键词INTERSECT,并集对应的关键字是UNION,差集对应的关键字是EXCEPT,从集合的角度就可以看出他们的用法了。

INTERSECT和EXCEPT

返回 INTERSECT 操作数左右两边的两个查询都返回的所有非重复值。

从 EXCEPT 操作数左边的查询中返回右边的查询未返回的所有非重复值。\

\

如果 EXCEPT 或 INTERSECT 操作数左边和右边的查询返回的可比较列的数据类型是具有不同排序规则的字符数据类型,则根据排序规则优先级的规则执行所需的比较。如果无法执行此转换,Microsoft SQL Server 2005 数据库引擎将返回错误。

通过比较行来确定非重复值时,两个 NULL 值被视为相等。

EXCEPT 或 INTERSECT 返回的结果集的列名与操作数左侧的查询返回的列名相同。

ORDER BY 子句中的列名或别名必须引用左侧查询返回的列名。

EXCEPT 或 INTERSECT 返回的结果集中的任何列的为空性与操作数左侧的查询返回的对应列的为空性相同。

如果 EXCEPT 或 INTERSECT 与表达式中的其他运算符一起使用,则在以下优先顺序的上下文中对其进行评估:

  1. 括号中的表达式\

  2. INTERSECT 操作数\

  3. 基于在表达式中的位置从左到右求值的 EXCEPT 和 UNION\

如果 EXCEPT 或 INTERSECT 用于比较两个以上的查询集,则数据类型转换是通过一次比较两个查询来确定的,并遵循前面提到的表达式求值规则。

EXCEPT 和 INTERSECT 不能在分布式分区视图定义、查询通知中使用,也不能与 COMPUTE 和 COMPUTE BY 子句一起使用。

EXCEPT 和 INTERSECT 可在分布式查询中使用,但只在本地服务器上执行,不会被推送到链接服务器。因此,在分布式查询中使用 EXCEPT 和 INTERSECT 可能会影响性能。

快速只进游标和静态游标与 EXCEPT 或 INTERSECT 运算一起使用时,在结果集中完全受支持。如果由键集驱动的游标或动态游标与 EXCEPT 或 INTERSECT 运算一起使用,则运算的结果集的游标转换为静态游标。

使用 SQL Server Management Studio 中的图形显示计划功能显示 EXCEPT 运算时,该运算显示为 left anti semi join,INTERSECT 运算显示为 left semi join。

示例

INTERSECT
USE AdventureWorks;
GO
SELECT ProductID 
FROM Production.Product
INTERSECT
SELECT ProductID 
FROM Production.WorkOrder ;
EXCEPT
USE AdventureWorks;
GO
SELECT ProductID 
FROM Production.Product
EXCEPT
SELECT ProductID 
FROM Production.WorkOrder ;

UNION和UNION ALL

UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复   
union 是取唯一值,记录没有重复   
1UNION 的语法如下:
     [SQL 语句 1]
      UNION
     [SQL 语句 2]
2UNION ALL 的语法如下:
     [SQL 语句 1]
      UNION ALL
     [SQL 语句 2]
效率:
UNIONUNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。
2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且
不需要排序时的话,那么就使用UNION ALL

以上就是集合的一些常规用法。其实重要的是运用集合的思想去看待数据之间的关联,因为不同的表就是一个集合,当它与其他表进行连接操作时,看成集合之间的操作,就会很好的去理解了。

长按下面的二维码关注我们,更多学习经验/教辅资料应有尽有,谢谢!


\