1. 前言
集合论是SQL语言的根基——这是贯穿全书主题之一。因为他的这个特性,SQL也被称为面向集合语言。只有从集合的角度思考,才能明白SQL的强大。
但是,实际上这一点长期以来都被很多人忽略了。造成这种状况,SQL本身也是要负一定责任的。其实,在很长一段时间内,SQL连我们在高中学习过的基础的集合运算符都没有。UNION是SQL-86标准开始加入的,还算比较早,而INTERSECT和EXCEPT都是SQL-92标准才加入的。至于关系除法,更是至今还没有被标准化。
2. 集合运算的几个注意事项
- SQL能操作具有重复行的集合,可以通过可选项ALL来支持
一般的集合论是不允许集合里存在重复元素的,因此集合{1,1,2,3,3,3}和集合{1,2,3}被视为相同的集合。但是关系数据库里的表允许存在重复的行,称为多重集合。
因此,SQL的集合运算符也提供了允许重复和不允许重复的两种用法。如果直接使用UNION和INTERSECT,结果里就不会出现重复行。如果想在结果里留下重复行,可以加上可选项ALL,写作UNION ALL。
出了运算结果之外,这两种用法还有一个不同。集合运算符为了排除重复行,默认的会发生排序,而加上可选项ALL之后就不会排序,所以性能会有提升。如果不关心结果是否存在重复行,或者确认结果不会产生重复行,可以加上ALL - 集合运算符有优先级
标准SQL规定,INTERSECT比UNION和EXCEPT优先级更高。因此,当同时使用UNION和INTERSECT,又想让UNION优先执行时,必须用括号明确的指定运算顺序。 - 各个DBMS提供商在集合运算的实现程度上参差不齐
- 除法运算没有标准定义
3. 比较表和表:检查集合相等性之基础表
这里说的“相等”指的是行数和列数以及内容都相同,即是“同一个集合”的意思
select count(1) row_cnt
from ( select *
from tbl_A
union
select *
from tbl_b
) tmp
;
4. 比较表和表:检查集合相等性之进阶篇
SELECT CASE WHEN COUNT(*) = 0 THEN '相等'
ELSE ‘不相等’
END AS result
FROM (