先上图,虽然图中所示有7种情况,但仔细分析后能得到所有的结果其实只有left,right和inner三种情况。
最直白的区别,就是:
- left join 只保留左表记录的数据,而且是全部保留
- right join 同理,只保留右表记录数据
- inner join,只保留双方都记录的数据
full join就是保留全部数据并将其呈现在一张表中。这中间可能会出现null值。
反映到图中,就是1和2是一种情况,3是一种情况,4和5是一种情况,6和7又是一种情况。
联结联结,也就是必须有相同的字段名和记录才能联结的起来。
1和2 就是添加了一个筛选条件,选中A中没有B的部分,也就是B.key = NULL;
4和5同理
6和7就是 full join返回两表全部的结果,如果有的行数据没有联结字段的数据,则会显示null。即A和B的交集中的所有行的数据选出来都是完整的,反之,在剩下集合中的行的数据一定有null值。
而7在这个基础上添加条件 A.key is null代表联结字段是null,也就是无法联结,那么就是剩下集合。
注意,这里的key代表的是联结字段,不代表主键,注意理解别混淆。
(因为只要联结字段不为null,那么一定可以通过这个联结字段去另一张表中获取对应数据)
现在回过来理解left,right和inner也就比较好理解了。
- left代表左表中无论联结字段key是否为null,都保留下来
- right代表右表中无论联结字段key是否为null,都保留下来
- inner表示联结字段必须有值,即非null才可以保留