笔记243 SQLSERVER 中的EXCEPT 与 INTERSECT运算符 2013-4-18

笔记243 SQLSERVER 中的EXCEPT 与 INTERSECT运算符 2013-4-18

  1 --SQLSERVER 中的EXCEPT 与 INTERSECT运算符 2013-4-18
  2 -- 此文章主要向大家描述的是 SQL Server 2005 EXCEPT 与INTERSECT 运算符的正确使用,同时本文也有对 EXCEPT 与INTERSECT 运算符的实际应用的比较,以及对其在实际操作中值得我们大家注意的相关事项的描述。
  3 --
  4 --1. 简介
  5 --
  6 --SQL Server 2005 EXCEPT 和 INTERSECT运算符使您可以比较两个或多个 SELECT 语句的结果并返回非重复值。
  7 --
  8 --2. 区别
  9 --
 10 --EXCEPT 运算符返回由 EXCEPT运算符左侧的查询返回、而又不包含在右侧查询所返回的值中的所有非重复值。
 11 --
 12 --INTERSECT 返回由INTERSECT 运算符左侧和右侧的查询都返回的所有非重复值。
 13 --
 14 --3. 注意事项
 15 --
 16 --(1). 使用SQL Server 2005 EXCEPT 或 INTERSECT比较的结果集必须具有相同的结构。它们的列数必须相同,并且相应的结果集列的数据类型必须兼容
 17 --
 18 --(2).INTERSECT 运算符优先于 EXCEPT
 19 --
 20 --(3).SELECT INTO 必须是包含 INTERSECT或 EXCEPT 运算符的语句中的第一个查询,用来创建容纳最终结果集的表
 21 --
 22 --(4).ORDER BY 子句中的列名或别名必须引用左侧查询返回的列名
 23 --
 24 --4. 例题:
 25 --
 26 -- 建立个表,分别插入数据
 27 USE [tempdb]
 28 GO
 29 
 30 create table TableA (col1 int )  
 31 insert into TableA select 1  
 32 insert into TableA select 1  
 33 insert into TableA select 2  
 34 insert into TableA select 3  
 35 insert into TableA select 4  
 36 insert into TableA select 4  
 37 insert into TableA select 5  
 38 insert into TableA select null   
 39 insert into TableA select null  
 40  
 41 create table TableB (col2 int )  
 42 insert into TableB select null   
 43 insert into TableB select 1  
 44 insert into TableB select 2  
 45 insert into TableB select 3  
 46 
 47 create table TableC (col3 int )  
 48 insert into TableC select 1  
 49 insert into TableC select 5  
 50 insert into TableC select 6 
 51 -- 利用SQL Server 2005 EXCEPT
 52 --
 53 -- 找出TableA 表的 col1列不存在 Tablec 表col1 列的所有非重复值
 54 
 55 SELECT col1 FROM TableA  
 56 EXCEPT   
 57 SELECT col3 FROM Tablec 
 58 -- 结果如下:
 59 --
 60 --col1  
 61 ---  
 62 --NULL  
 63 --2  
 64 --3  
 65 --4  
 66 --sql 2000 的版本,用 not exists实现 SQL Server 2005 EXCEPT 的功能
 67 
 68 SELECT col1  
 69 FROM TableA as a  
 70 where not exists(SELECT col3 FROM Tablec where a. col1 =col3 )   
 71 group by col1 
 72 --sql 2000,not in 是得不到上述结果的
 73 --
 74 -- 空值表示值未知。空值不同于空白或零值。没有两个相等的空值。
 75 --
 76 -- 比较两个空值或将空值与任何其他值相比均返回未知,这是因为每个空值均为未知。
 77 --
 78 -- 使用IN 或 NOT IN比较后返回的所有空值都将返回 UNKNOWN 。
 79 --
 80 -- 将空值与IN 或 NOT IN一起使用会产生意外结果。
 81 
 82 SELECT col1  
 83 FROM TableA  
 84 where col1 not in(SELECT col3 FROM Tablec )   
 85 group by col1 
 86 -- 结果如下:
 87 --
 88 --col1  
 89 ---  
 90 --2  
 91 --3  
 92 --4  
 93 --INTERSECT 运算符优先于 EXCEPT
 94 --
 95 -- 运算步骤是:先运算 TableB和 TableC 的INTERSECT, 再和 TableA运算 SQL Server 2005 EXCEPT
 96 
 97 SELECT col1 FROM TableA  
 98 EXCEPT   
 99 SELECT col2 FROM TableB  
100 INTERSECT   
101 SELECT col3 FROM TableC 
102 -- 结果如下:
103 
104 col1  
105 -   
106 NULL   
107 2  
108 3  
109 4  
110 5  
111 --SELECT INTO 的应用
112 --
113 --SELECT INTO 必须是语句中的第一个查询
114 --
115 -- 我记得SELECT INTO 与 UNION运算符的使用也是这样的规则
116 
117 SELECT col1  
118 into #tem  
119 FROM TableA  
120 EXCEPT   
121 SELECT col3  
122 FROM Tablec  
123 select * from #tem  
124 drop table #tem
125 -- 结果如下:
126 --
127 --col1  
128 ---  
129 --NULL  
130 --2  
131 --3  
132 --4  
133 --ORDER BY 子句
134 --
135 --ORDER BY 子句中的列名或别名必须引用左侧查询返回的列名
136 
137 SELECT col1 FROM TableA  
138 INTERSECT   
139 SELECT col3 FROM TableC  
140 order by col1 
141 -- 结果如下:
142 --
143 --col1  
144 ---  
145 --1  
146 --5   

 

posted @ 2013-08-04 19:58 桦仔 阅读(...) 评论(...) 编辑 收藏