集合运算
定义:集合在数学领域表示“(各种各样的)事物的总和”,在数据库领域表示记录的集合。具体来说,表、视图和查询的执行结果都是记录的集合。
分为两种:一种是表之间的行集合运算(UNION、INTERSECT 等);另一种是表之间的列为单位的运算;
行为单位的集合
注意事项:1、作为运算对象的记录的列数必须相同;2、作为运算对象的记录中列的类型必须一致;3、可以使用任何 SELECT 语句,但 ORDER BY 子句只能在最后使用一次
UNION 并集运算
会对交集的部分进行去重展示
SELECT product_id, product_name
FROM Product
UNION
SELECT product_id, product_name
FROM Product2;
ORDER BY product_id; -- 最后使用
ALL 并集运算(对交集部分不去重)
SELECT product_id, product_name
FROM Product
UNION ALL
SELECT product_id, product_name
FROM Product2;
ORDER BY product_id; -- 最后使用
INTERSECT 取到交集部分
SELECT product_id, product_name
FROM Product
INTERSECT -- INTERSECT ALL 希望保留重复行时同样需要使用
SELECT product_id, product_name
FROM Product2
ORDER BY product_id;
EXCEPT 记录的减法(差集)
剔除交集部分的记录
列为单位的集合(联结)
内联结
关键字:INNER JOIN
内联结只能选取出同时存在于两张表中的数据
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name,
P.sale_price
FROM ShopProduct AS SP INNER JOIN Product AS P
ON SP.product_id = P.product_id;
外联结
结果中包含原表中不存在(在原表之外)的信息
外联结还有一点非常重要,那就是要把哪张表作为主表。最终的结果中会包含主表内所有的数据。指定主表的关键字是 LEFT 和 RIGHT。顾名思义,使用 LEFT 时 FROM 子句中写在左侧的表是主表,使用 RIGHT 时右侧的表是主表。
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name,
P.sale_price
FROM ShopProduct AS SP RIGHT OUTER JOIN Product AS P -- 右侧的是主表
ON SP.product_id = P.product_id;