SQL Server 中关于EXCEPT和INTERSECT的用法

博文出处:SQL Server 中关于EXCEPT和INTERSECT的用法

转载这篇文章的理由很简单,因为,我也是看了它之后,才知道sql 2005以后,有了这两个关键字:expect、intersect。

原博内容:

熟练使用SQL Server中的各种用法会给查询带来很多方便。今天就介绍一下EXCEPT和INTERSECT。注意此语法仅在SQL Server 2005及以上版本支持。

EXCEPT是指在第一个集合中存在,但是不存在于第二个集合中的数据。

INTERSECT是指在两个集合中都存在的数据。

示例:

create table t1(id int,mark char(2)) go create table t2(id int,mark char(2)) go insert into t1 select 1,'t1' union all select 2,'t2' union all select 3,'t3' union all select 4,'t4' go insert into t2 select 2,'t2' union all select 3,'m3' union all select 5,'m5' union all select 6,'t6' go select * from t1 EXCEPT select * from t2 go select * from t1 INTERSECT select * from t2 go --EXCEPT结果集为 --1 t1 --3 t3 --4 t4 --INTERSECT结果集为 --2 t2
EXCEPT和INTERSECT的优先级:

为了测试它们之间的优先级,运行下面的测试代码:

create table t3(int id,mark char(2)) go insert into t3 select 3,'t3' union all select 3,'r3' union all select 5,'m5' union all select 5,'r5' union all select 7,'b7' union all select 8,'b8' go select * from t1 EXCEPT select * from t2 INTERSECT select * from t3 --运行结果 --1 t1 --2 t2 --3 t3 --4 t4
为什么会出现如上结果呢,请看下面的执行计划:

SQL Server 中关于EXCEPT和INTERSECT的用法

原来t2和t3先进行的INTERSECT运算,得出5m5结果集,再和t1进行EXCEPT运算。

原文博主比较专业,一来例子看来简单易懂,二来描述比较全面,不光讲了两个关键字的用法,也讲到了它们的优先级。

『引申』

也许,你会说我完全可以设置条件,达到类似的过滤效果,例如:简单的一个exists:

select * from table1 where not exists (

select 1 from table2 where table1.ID=table2.ID

)

以上语句就实现了except的效果。

select * from table1 inner join table2 on table1.ID=table2.ID

这就达到了intersect的效果,那么,它们的价值在哪里呢?

- - ,也许已经有人看出了问题所在,是的!使用条件过滤,比较的是表中的ID,而使用这两个关键字,比较的是整行记录,而如果我们要自己写sql比较整行记录,相信这是非常令人头疼的事情,并且,有可能写出来的sp具有很大的性能问题。

我相信,它们会是合并结果集,过滤结果集的一把利器。