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