本篇文章记录学习SQL集合运算的过程与心得。
对于集合这个概念,印象最深的就是数学课里学的,简单的说就是把研究对象当做元素,则一些元素组成的整体就叫集合。
而在数据库领域,则表示记录的集合,具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。像UNION
,INTERSECT
, EXCEPT
这种用来进行集合运算的运算符称为集合运算符。在数据库中, 所有的表--以及查询结果--都可以视为集合。
1、表的加减法
UNION就是相当于2个表的并集,但是 UNION 等集合运算符通常都会除去重复的记录。若想包含重复行,使用集合运算 UNION ALL方法即可。
使用 UNION 对两个查询结果取并集, 和在一个查询中使用 WHERE 子句, 然后使用 OR 谓词连接两个查询条件, 能够得到相同的结果。
示例:
找出毛利率不足 30%或毛利率未知的商品的语句如下所示。
通常来说, 我们会把类型完全一致, 并且代表相同属性的列使用 UNION 合并到一起显示, 但有时候, 即使数据类型不完全相同, 也会通过隐式类型转换来将两个类型不同的列放在一列里显示, 例如字符串和数值类型。
集合的交, 就是两个集合的公共部分, 由于集合元素的互异性, 集合的交只需通过文氏图就可以很直观地看到它的意义。
但是MySQL 目前不支持INTERSECT操作,可以用INNER JOIN来代替。
集合的差集
求集合差集的减法运算和实数的减法运算有些不同, 当使用一个集合A减去另一个集合B的时候,对于只存在于集合B而不存在于集合A的元素, 采取直接忽略的策略,因此集合A和B做减法只是将集合A中也同时属于集合B的元素减掉。
MySQL目前也不支持表的减法运算符 EXCEPT,不过, 借助NOT IN 谓词, 同样可以实现表的减法。
对称差
两个集合A,B的对称差是指那些仅属于A或仅属于B