其实,表A与表B的连接和高中时候学的集合是一样的。
要让两个表能够连接,必须有字段是一样的,或者说,是通过这个字段联系这两张表的。
比如表A是员工表,员工表里有一个字段为dept_id
。表B是部门表,部门表的主键id
就可以和dept_id
联系起来。
用Venn图很容易表示表与表连接的几种情况:
(经常有人问:表与表有哪几种连接?)
1,2
3,4
5,6
7
整两张表来说明情况:
员工表字段:
id,姓名,部门id。
部门表字段:
id,部门名字,楼层。
插入一些数据:
RD是research department,HR是human resource,MK是marketing,MIS是management information system,FD是financial department。这些都是部门的名字。
看一下员工表,发现9号员工ocean他的部门没有在部门表中有对应。
同样的,在部门表中,5号部门也没有任何员工和他对应。
这样的设计是为了演示的方便。
先来简单的,我们看第2个inner join
,要的是两张表的公共部分:
然后是熟悉的left join
,A的独有+AB的共有:
比上面多了一条A独有的记录。
同样的,right join
就是B的独有+AB的共有:
5,6都搞定了。
现在我们看3,4。
3是A的独有。所以我们要在left join
的基础上去掉AB的共有。
这就是A的独有。
同样的,
这是B的独有。
我们看最后一个7。
它是A的独有拼上B的独有,有了3和4的基础,接下来只要union一下就可以了。
这就是A的独有加上B的独有。
或许你会说,图上不是用full outer join
吗?对的,但是mysql不支持这样的语法。
最后我们看1。
它是4和5的结合:
A的独有+B的独有+AB的共有。