用法区别:
EXCEPT 返回两个结果集的差(从左查询中返回右查询没有找到的所有非重复的值);
INTERSECT 返回两个结果集的交集(返回两个查询结果里面所有非重复的值);
UNOIN 返回两个结果集的并集。
语法:
(select A,B from TAB_1)
{EXCEPT / INTERSECT / UNOIN }
(select A,B from TAB_2)
限制条件:
1)所有查询中列数和列必须一致;
2)比较的两个列的数据类型可以不一样但是必须兼容;
3)比较的两个列不能包含不可比较的数据类型(xml、text、ntext、image 或非二进制 CLR 用户定义类型);
4)返回的结果集的列名与操作数左侧的查询返回的列名相同。ORDER BY 子句中的列名或别名必须引用左侧查询返回的列名。
5)不能与 COMPUTE 和 COMPUTE BY 子句一起使用。
6)通过比较行来确定非重复值时,两个 NULL 值被视为相等
与表达式里面其他运算符一起使用时的执行顺序:
1)括号里面的表达式;
2)INTERSECT操作数;
3)基于在表达式中的位置从左到右求值的 EXCEPT 和 UNION。
注意:
如果 EXCEPT 或 INTERSECT 用于比较两个以上的查询集,则数据类型转换是通过一次比较两个查询来确定的,并遵循前面提到的表达式求值规则。
举例:
create table T1(id int,mark char(2));
INSERT INTO T1 (ID, MARK) VALUES (1, null);
INSERT INTO T1 (ID, MARK) VALUES (2, null);
INSERT INTO T1 (ID, MARK) VALUES (3, '1 ');
INSERT INTO T1 (ID, MARK) VALUES (4, '3 ');
INSERT INTO T1 (ID, MARK) VALUES (5, '5 ');
INSERT INTO T1 (ID, MARK) VALUES (6, '6 ');
INSERT INTO T1 (ID, MARK) VALUES (7, '9 ');
create table T2(id int,mark char(2));
INSERT INTO T2 (ID, MARK) VALUES (1, null);
INSERT INTO T2 (ID, MARK) VALUES (2, '2 ');
INSERT INTO T2 (ID, MARK) VALUES (3, '3 ');
INSERT INTO T2 (ID, MARK) VALUES (4, '5 ');
INSERT INTO T2 (ID, MARK) VALUES (5, '6 ');
INSERT INTO T2 (ID, MARK) VALUES (6, '8 ');
T1 (MARK) T2(MARK)
NULL NULL
NULL 2
1 3
3 5
5 6
6 8
9
(SELECT MARK FROM T1) EXCEPT (SELECT MARK FROM T2) ;
结果 1,9
(SELECT MARK FROM T1) INTERSECT (SELECT MARK FROM T2) ;
结果 3,5,6,(null)
(SELECT MARK FROM T1) UNION (SELECT MARK FROM T2) ;
结果 1,2,3,5,6,8,9 ,(null)