第七章 集合运算
7-1 表的加减法
集合运算
在数据库领域,集合通常是指记录的集合,具体的,表,视图和执行的查询结果都是记录的集合.
集合运算是指对满足同一规则的记录进行加减等四则运算,通过集合运算,可以得到两张表中记录的集合或者公共记录的集合.用来做集合运算的运算符称为集合运算符.
- 表的加法—UNION(并集)
使用示例:
SELECT product_id, product_name
FROM Product
UNION
SELECT product_id, product_name
FROM Product2;
UNION等集合运算通常会去除重复的记录.
使用集合运算的注意事项:
1.作为运算对象的记录的列数必须相同
2.作为运算对象的记录的列的类型必须一致.从左侧开始,相同位置的列必须是同一个数据类型.
一定要使用不同数据类型的列时,可以使用类型转换函数CAST
3.可以使用任何的SELECT子句(WHERE,HAVING,ORDER BY等等),但ORDER BY子句只能在最后使用一次
- 包含重复行的集合运算—ALL选项
示例:
SELECT product_id, product_name
FROM Product
UNION ALL
SELECT product_id, product_name
FROM Product2;
- 选取表中的公共部分—INTERSECT(交集)
使用语法和UNION完全相同,应用于两张表,选择出他们当中的公共记录. - 记录的减法—EXCEPT(差集)
用法和UNION基本相同,只是要注意EXCEPT两边的表顺序不能随意换. - 关系除法
7-2 联结(以列为单位对表进行联结)
联结运算
联结运算(JOIN),就是将不同表中的列进行组合以从多张表中获得期望的数据的方法.
- 内联结—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;
注意要点:
1.FROM子句后写的是多张表的联结,所以其实也是从一张表中选择数据.后面的表别名不是必要的.
2.ON子句后面是联结的条件,即指定两张表联结所用的列(联结键),需要指定多个键时,也可以使用AND和OR.ON子句必不可少,且必须写在FROM和WHERE之间.
3.SELECT子句后最好使用**<表的别名>.<列名>**的形式来选择多张表中的列,以免混乱,虽然原则上只有同时存在于两张表中的列需要这种形式,但是最好都用这种方法以防止使用错误.
- 内联结与WHERE子句结合使用
可以理解成就是对新得到的表进行WHERE类似的操作.
示例:
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
WHERE SP.shop_id = '000A';
- 外联结—OUTER JOIN
示例:
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;
外联结要点:
1.会选择出单张表的全部信息
在实际业务中,例如想要生成固定行数的表,就需要使用外联结.
外联结的名称中的"外"就有包含结果中包含原表中不存在的信息(NULL);只包含表内信息的联结就称为内联结.
2.最终的结果会包含主表内的所有数据,而指定主表的关键字是RIGHT和LEFT.上面的代码中使用了RIGHT,所以右边的表就是主表.
- 3张以上的表的联结
示例:
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price, IP.inventory_quantity
FROM ShopProduct AS SP INNER JOIN Product AS P
ON SP.product_id = P.product_id
INNER JOIN InventoryProduct AS IP
ON SP.product_id = IP.product_id
WHERE IP.inventory_id = 'S001';
- 交叉联结—CROSS JOIN