集合运算
7-1 表的加减法
学习重点:
- 集合运算就是对满足同一规则的记录进行的加减等四则运算。
- 使用UNION(并集)、INTERSECT(交集)、EXCEPT(差集)等集合运算符来进行集合运算。
- 集合运算符可以去除重复行。
- 如果希望集合运算符保留重复行,就需要使用ALL选项。
表Product2
使用UNION对表进行加法运算:
集合运算的注意事项
♦ 注意事项1——作为运算对象的记录的列数必须相同。
♦ 注意事项2——作为运算对象的记录中的列的类型必须一致。
从左侧开始,相同位置上的列必须是同一数据类型。
♦ 注意事项3——可以使用任何SELECT语句,但ORDER BY子句只能在最后使用一次。
通过UNION进行并集运算时可以使用任何形式的SELECT语句,之前学过的WHERE、GROUP BY、HAVING等子句都可以使用。但是ORDER BY只能在最后使用一次。
包含重复行的集合运算——ALL选项
只需要在UNION后面添加ALL关键字就可以了。
☝ 在集合运算符中使用ALL选项,可以保留重复行。
选取表中公共部分——INTERSECT
选取两个记录集合中公共部分的INTERSECT(交集)。MySQL不支持INTERSECT。
记录的减法——EXCEPT
MySQL也不支持。
7-2 联结(以列为单位对表进行联结)
学习重点:
- 联结(JOIN)就是将其他表中的列添加过来,进行“添加列”的集合运算。UNION是以行(纵向)为单位进行操作,而联结则是以列(横向)为单位进行的。
- 联结大体上分为内联结和外联结两种。首先请大家牢牢掌握这两种联结的使用方法。
- 请大家一定要使用标准SQL的语法格式来写联结运算,对于那些过时的或者特定SQL中的写法,了解一下即可,不建议使用。
什么是联结
前一节学习的UNION、INTERSECT和EXCEPT是以行方向为单位进行操作。
联结的图示:
内联结——INNER JOIN
将两张表进行内联:
⚪ 内联要点1——FROM子句
别名不是必须的。
☝ 进行联结时需要在FROM子句中使用多张表。
⚪ 内联要点2——ON子句
我们可以在ON之后指定两张表联结所使用的列(联结键),本例中使用的是商品编号(product_id)。ON是专门来指定联结条件的,它能起到与WHERE相同的作用。需要指定多个键时,同样可以使用AND、OR。在进行内联结时ON子句是必不可少的(如果没有ON会发生错误),并且ON必须书写在FROM和WHERE之间。
联结条件也可以使用“=”来记述。在语法上,还可以使用<=和BETWEEN等谓词。
⚪ 内联结要点3——SELECT子句
☝使用联结时SELECT子句中的列需要按照“<表的别名>.<列名>”的格式进行书写。
■ 内联结和WHERE子句结合使用
外联结——OUTER JOIN
将两张表进行外联结:
⚪ 外联结要点1——选取出单张表中全部的信息
内联结只能选取出同时存在于两张表中的数据,因此只在Product表中存在的2中商品并没有出现在结果之中。相反,对于外联结来说,只要数据存在于某一张表中,就能够读取出来。
⚪ 外联结要点2——每张表都是主表吗?
外联结还有一点非常重要,那就是要把那张表作为主表。最终的结果中会包含主表内所有的数据。指定主表的关键字是LEFT和RIGHT。顾名思义,使用LEFT时FROM子句中写在左侧的表是主表,使用RIGHT时右侧的表是主表。本例中使用了RIGHT,因此,右侧的表,也就是Product表是主表。
改写后外联结的结果完全相同:
3张以上的表的联结
InventoryProduct(库存商品)表
交叉联结——CROSS JOIN
笛卡尔积。
练习题: