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

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

 

--SQLSERVER 中的EXCEPT 与 INTERSECT运算符 2013-4-18
-- 此文章主要向大家描述的是 SQL Server 2005 EXCEPT 与INTERSECT 运算符的正确使用,同时本文也有对 EXCEPT 与INTERSECT 运算符的实际应用的比较,以及对其在实际操作中值得我们大家注意的相关事项的描述。
--
--1. 简介
--
--SQL Server 2005 EXCEPT 和 INTERSECT运算符使您可以比较两个或多个 SELECT 语句的结果并返回非重复值。
--
--2. 区别
--
--EXCEPT 运算符返回由 EXCEPT运算符左侧的查询返回、而又不包含在右侧查询所返回的值中的所有非重复值。,相当于Oracle数据库的 Minus 运算符
--
--INTERSECT 返回由INTERSECT 运算符在左侧和右侧的查询都共同拥有的值,也就是共同值,交集。
--
--3. 注意事项
--
--(1). 使用SQL Server 2005 EXCEPT 或 INTERSECT比较的结果集必须具有相同的表结构,也就是它们的列数必须相同,并且相应的结果集列的数据类型必须相同
--
--(2).INTERSECT 运算符优先于 EXCEPT
--
--(3).SELECT INTO 必须是包含 INTERSECT或 EXCEPT 运算符的语句中的第一个查询,用来创建容纳最终结果集的表
--
--(4).ORDER BY 子句中的列名或别名必须引用左侧查询返回的列名
--
--4. 例题:
--
-- 建立表,分别插入数据
USE [tempdb]
GO

create table TableA (col1 int )  
insert into TableA select 1  
insert into TableA select 1  
insert into TableA select 2  
insert into TableA select 3  
insert into TableA select 4  
insert into TableA select 4  
insert into TableA select 5  
insert into TableA select null   
insert into TableA select null  
 
create table TableB (col2 int )  
insert into TableB select null   
insert into TableB select 1  
insert into TableB select 2  
insert into TableB select 3  

create table TableC (col3 int )  
insert into TableC select 1  
insert into TableC select 5  
insert into TableC select 6 
-- 利用SQL Server 2005 EXCEPT
--
-- 找出TableA 表的 col1列不存在 Tablec 表col1 列的所有【非重复值】

SELECT col1 FROM TableA  
EXCEPT   
SELECT col3 FROM Tablec 
-- 结果如下:
--
--col1  
---  
--NULL  
--2  
--3  
--4  
--sql 2000 的版本,用 not exists实现 SQL Server 2005 EXCEPT 的功能

SELECT col1  
FROM TableA as a  
where not exists(SELECT col3 FROM Tablec where a. col1 =col3 )   
group by col1 
--sql 2000,not in 是得不到上述结果的,也就是说not in不能替代except和not exists
--
-- 空值表示值未知。空值不同于空白或零值。没有两个相等的空值。
--
-- 比较两个空值或将空值与任何其他值相比均返回未知,这是因为每个空值均为未知。
--
-- 使用IN 或 NOT IN比较后返回的所有空值都将返回 UNKNOWN 。
--
-- 将空值与IN 或 NOT IN一起使用会产生意外结果。

SELECT col1  
FROM TableA  
where col1 not in(SELECT col3 FROM Tablec )   
group by col1  --一定要加group by,否则会显示重复值
-- 结果如下:
--
--col1  
---  
--2  
--3  
--4  
--INTERSECT 运算符优先于 EXCEPT
--
-- 运算步骤是:先运算 TableB和 TableC 的INTERSECT, 再和 TableA运算 SQL Server 2005 EXCEPT
SELECT col2 FROM TableB  
INTERSECT   
SELECT col3 FROM TableC 
的结果是1,共同值是1

SELECT col1 FROM TableA  
EXCEPT   
SELECT col2 FROM TableB  
INTERSECT   
SELECT col3 FROM TableC 
-- 结果如下:

col1  
-   
NULL   
2  
3  
4  
5  
--SELECT INTO 的应用
--
--SELECT INTO 必须是语句中的第一个查询
--

SELECT col1  
into #tem  
FROM TableA  
EXCEPT   
SELECT col3  
FROM Tablec  
select * from #tem  

-- 结果如下:
--
--col1  
---  
--NULL  
--2  
--3  
--4  
--ORDER BY 子句
--
--ORDER BY 子句中的列名或别名必须引用左侧查询返回的列名

SELECT col1 FROM TableA  
INTERSECT   
SELECT col3 FROM TableC  
order by col1 
-- 结果如下:
--
--col1  
---  
--1  
--5   

 

f

 

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