添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
首发于 数据分析师学习之路

SQL集合运算-①表的加减法(下)

1 表的加减法

1.4 差集、补集与表的减法

求集合差集的减法运算和实数的减法运算有些不同,当使用一个集合A减去另一个集合B的时候,对于只存在于集合B而不存在于集合A的元素,采取直接忽略的策略,因此 集合A和B做减法只是将集合A中也同时属于集合B的元素减掉。


1.4.1 MySQL 8.0 还不支持 EXCEPT 运算

MySQL 8.0 还不支持表的减法运算符 EXCEPT 不过,借助 NOT IN 谓词, 我们同样可以实现表的减法。

练习题

找出只存在于product表但不存在于product2表的商品.

-- 使用 IN 子句的实现方法
SELECT * 
  FROM product
 WHERE product_id NOT IN (SELECT product_id 
                            FROM product2)

1.4.2 EXCEPT 与 NOT 谓词

通过上述练习题的MySQL解法,我们发现, 使用 NOT IN 谓词,基本上可以实现和SQL标准语法中的EXCEPT运算相同的效果。

练习题:

使用NOT IN 谓词进行集合的减法运算, 求出product表中, 售价高于2000 ,但 利润低于30%的商品 , 结果应该如下表所示。


参考答案:

SELECT * 
  FROM product
 WHERE sale_price > 2000 
   AND product_id NOT IN (SELECT product_id 
                            FROM product 
                           WHERE sale_price>1.3*purchase_price)

1.4.3 EXCEPT ALL 与bag 的差

类似于UNION ALL,EXCEPT ALL 也是按出现次数进行减法,也是使用bag模型进行运算。

对于两个 bag,他们的差运算会按照:

1.该元素是否属于作为被减数的 bag

2.该元素在两个 bag 中的出现次数

这两个方面来进行计算。只有属于 被减数 的bag的元素才参与EXCEP ALL运算,并且差bag中的次数,等于该元素在两个bag的出现次数之差(差为零或负数则不出现)。因此对于 A = {1,1,1,2,3,5,7}, B = {1,1,2,2,4,6,8} 两个 bag,它们的差就等于 {1,3,5,7}。

1.4.4 INTERSECT 与 AND 谓词

对于同一个表的两个查询结果而言,他们的交INTERSECT实际上可以等价地将两个查询的检索条件用AND谓词连接来实现。

练习题:

****使用AND谓词查找product表中利润率高于50%,并且售价低于1500的商品,查询结果如下所示:


参考答案

SELECT * 
  FROM product
 WHERE sale_price > 1.5 * purchase_price 
   AND sale_price < 1500

1.5 对称差

两个集合A,B的对称差是指那些仅属于A或仅属于B的元素构成的集合。

对称差也是个非常基础的运算,例如:两个集合的交 = 两个集合的并 - 两个集合的对称差。

上述方法在其他数据库里也可以用来简单地实现表或查询结果的对称差运算:首先使用UNION求两个表的并集,然后使用INTERSECT求两个表的交集,然后用并集减去交集,就得到了对称差。

但由于在MySQL 8.0 里,由于两个表或查询结果的并不能直接求出来,因此并不适合使用上述思路来求对称差。好在还有差集运算可以使用。

从直观上就能看出来,两个集合的对称差等于 A-B并上B-A,因此实践中可以用这个思路来求对称差。

练习题:

使用product表和product2表的对称差来查询哪些商品只在其中一张表, 结果类似于:



提示: 使用 NOT IN 实现两个表的差集.

参考答案:

-- 使用 NOT IN 实现两个表的差集
SELECT *