1 集合的定义
集合是由一个和多个元素构成的整体,在 SQL Server 中的表就代表着事实集合,
而其中的查询就是在集合的基础上生成的结果集。SQL Server 的集合包括交集
(INTERSECT),并集(UNION),差集( EXCEPT )。
2 交集 INTERSECT
可以对两个或多个结果集进行连接,形成“交集”。返回左边结果集和右边结果集中
都有的记录,且结果不重复(这也是集合的主要特性)
交集限制条件
• 子结果集要具有相同的结构。
• 子结果集的列数必须相同
• 子结果集对应的数据类型必须可以兼容。
• 每个子结果集不能包含 order by 和 compute 子句。
3 并集 UNION
可以对两个或多个结果集进行连接,形成“并集”。子结果集所有的记录组合在一起
形成新的结果集。其中使用 UNION 可以得到不重复(去重)的结果集,使用
UNION ALL 可能会得到重复(不去重)的结果集。
并集限制条件
• 子结果集要具有相同的结构。
• 子结果集的列数必须相同
• 子结果集对应的数据类型必须可以兼容。
• 每个子结果集不能包含 order by 和 compute 子句。
UNION 示例
还是以上面的 City1 和 City2 为例,取两个表的并集,我们可以这样写 SQL:
SELECT * FROM City1
UNION
SELECT * FROM City2
结果如下:
我们看到,北京和上海去掉了重复的记录,只保留了一次
UNION ALL 示例
我们再看看使用 UNION ALL 会怎么样?
SELECT * FROM City1
UNION ALL
SELECT * FROM City2
结果如下:
与上面的 UNION 相比,UNION ALL 仅仅是对两个表作了拼接而已,北京和上海
依然在下面重复出现了,而且细心的读着应该发现了,UNION 还会对结果进行排
序,而 UNION ALL 不会。
4 差集 EXCEPT
可以对两个或多个结果集进行连接,形成“差集”。返回左边结果集合中已经有的记
录,而右边结果集中没有的记录。
差集限制条件
• 子结果集要具有相同的结构。
• 子结果集的列数必须相同
• 子结果集对应的数据类型必须可以兼容。
• 每个子结果集不能包含 order by 和 compute 子句。
差集示例
以 City1 和 City2 为例,我们想取 City1(左表)和 City2(右表)的差集,可以
这样写 SQL:
SELECT * FROM City1
EXCEPT
SELECT * FROM City2
结果如下:
我们看到,因为北京和上海在两个表都存在,差集为了只显示左表中有的,而右表
中没有的,就把这两个给过滤掉了。