集合在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。
在标准 SQL 中, 分别对检索结果使用 UNION
, INTERSECT,
EXCEPT
来将检索结果进行并,交和差运算, 像UNION
,INTERSECT
, EXCEPT
这种用来进行集合运算的运算符称为集合运算符。
集合运算符的使用
- 表的并集–UNION
用法:
SELECT product_id, product_name
FROM product
UNION
SELECT product_id, product_name
FROM product2;
需注意点是 UNION 等集合运算符通常都会除去重复的记录,需要包含重复行,只需要在 UNION 后面添加 ALL 关键字就可以了。
UNION 与 OR 谓词区别:对于同一个表的两个不同的筛选结果集, 使用UNION 对两个结果集取并集, 和把两个子查询的筛选条件用 OR 谓词连接,会得到相同的结果, 但倘若要将两个不同的表中的结果合并在一起,就不得不使用 UNION 了。而且, 即便是对于同一张表, 有时也会出于查询效率方面的因素来使用 UNION。
- 表的交集–INTERSECT
遗憾的是,MySQL 8.0 不支持交运算INTERSECT,需要用 inner join 来求得交集。
SELECT p1.product_id, p1.product_name
FROM Product p1
INNER JOIN Product2 p2
ON p1.product_id=p2.product_id
对于同一个表的两个查询结果而言, 他们的交INTERSECT实际上可以等价地将两个查询的检索条件用AND谓词连接来实现。
SELECT *
FROM Product
WHERE sale_price > 1.5 * purchase_price
AND sale_price < 1500
- 表的差集–EXCEPT
同样,MySQL 8.0 还不支持表的减法运算符 EXCEPT,但可以借用NOT IN 谓词实现
SELECT *
FROM Product
WHERE product_id NOT IN (SELECT product_id
FROM Product2)
- 对称差
两个集合A,B的对称差是指那些仅属于A或仅属于B的元素构成的集合
-- 使用 NOT IN 实现两个表的差集
SELECT *
FROM Produc