集合运算
1 表的加减法
1.1 集合运算
集合在数学领域表示“各种各样的事物的总和”,在数据库领域表示记录的集合。具体来说,表、视图和查询的执行结果都是记录的集合,其中的元素为表或者查询结果中的每一行。
在标准 SQL 中, 分别对检索结果使用 UNION,INTERSECT, EXCEPT 来将检索结果进行并,交和差运算, 像UNION,INTERSECT,EXCEPT这种用来进行集合运算的运算符称为集合运算符。
以下的文氏图展示了几种集合的基本运算。
在数据库中, 所有的表–以及查询结果–都可以视为集合,,因此也可以把表视为集合进行上述集合运算, 在很多时候, 这种抽象非常有助于对复杂查询问题给出一个可行的思路。
1.2 表的加法-UNION
1.2.1 UNION
建表代码及数据导入请使用第一章提供的代码,接下来我们演示UNION的具体用法及查询结果:
SELECT product_id, product_name
FROM product
UNION
SELECT product_id, product_name
FROM product2;
【注意】UNION 等集合运算符通常都会除去重复的记录。
1.2.2 UNION ALL
UNION ALL包含重复行,直接在UNION后面加ALL即可。
1.2.3 bag模型与set模型
在高中数学课上我们就学过, 集合的一个显著的特征就是集合中的元素都是互异的. 当我们把数据库中的表看作是集合的时候, 实际上存在一些问题的: 不论是有意的设计或无意的过失, 很多数据库中的表包含了重复的行.
Bag 是和 set 类似的一种数学结构, 不一样的地方在于: bag 里面允许存在重复元素, 如果同一个元素被加入多次, 则袋子里就有多个该元素.
通过上述 bag 与 set 定义之间的差别我们就发现, 使用 bag 模型来描述数据库中的表在很多时候更加合适.
是否允许元素重复导致了 set 和 bag 的并交差等运算都存在一些区别. 以 bag 的交为例, 由于 bag 允许元素重复出现, 对于两个 bag, 他们的并运算会按照: 1.该元素是否至少在一个 bag 里出现过, 2.该元素在两个 bag 中的最大出现次数这两个方面来进行计算. 因此对于 A = {1,1,1,2,3,5,7}, B = {1,1,2,2,4,6,8} 两个 bag, 它们的并就等于 {1,1,1,2,2,3,4,5,6,7,8}.
1.2.4 隐式类型转换
通常来说, 我们会把类型完全一致, 并且代表相同属性的列使用 UNION 合并到一起显示, 但有时候, 即使数据类型不完全相同, 也会通过隐式类型转换来将两个类型不同的列放在一列里显示, 例如字符串和数值类型:
SELECT product_id, product_name, '1'
FROM product
UNION
SELECT product_id, product_name