你知道的越多,你不知道的就越多
先来看看标准SQL里面定义的外连接的三种类型:
- 左外连接
- 右外连接
- 全外连接
其中,左外连接和右外连接没有本质的区别,用作主表的表写在运算符左侧就是左外连接,卸载运算符右侧就是右外连接,在这三种里面,用的最多的就是左外和右外了,全外连接用的情况比较少,但是不妨碍我们去了解它,为什么用的少呢?我认为很大一部分原因是Mysql中还没有支持全外连接,而我们学习sql大部分都是用的Mysql,所以我们用的最多的还是前面两种。第三种Mysql就不支持。
全外连接是什么:
下面通过一个例子来看一看全外连接
上面这两张表中,田中和铃木都属于公共的部分,而伊集院和西园寺分别属于两张表各自拥有的,全外连接就是能够将这两张内容不一致的表,没有遗漏的获取全部信息的方法。
-- 全外连接保留全部信息
SELECT COALESCE(A.id, B.id) AS id,
A.name AS A_name,
B.name AS B_name
FROM Class_A A FULL OUTER JOIN Class_B B
ON A.id = B.id;
上面就是全外连接的结果集
可以看到四个人的名字全部出现了,Coalesce函数返回第一个非null的数。
上面的sql代码块虽然可以跑出来结果,但是我们用Mysql是不成功的,那么我们怎么办呢?对于mysql中实现全外连接,可以使用左外连接和右外连接,然后再将两个结果进行Union,同样可以达到目的。
这种方法虽然可以实现,但是代码比较冗长,而且使用两次连接后还要用union来合并,性能也不是很好。因此,换一个角度,
内连接,就是求集合的积
全外连接,就是求集合的和
用外连接求差集
在上面的两个Class表中,我们用外连接来求A-B的差集。
- 求A-B的差集,那么A就要成为主表,进行左连接。从下面表中,可以看到差集是伊集院
2.显示伊集院
在一的基础上,我们进行筛选,找到B的名字为空的就是差集
同时用这个方法,我们来求B-A的差集
用图片来表示差集
A-B的差集
B-A的差集
总结:
其实呢,全外连接我们用的很少,基本上的需求都是用左连接和外连接,有时候内连接用的也很多,下一篇会讲解窗口函数,首先用的不是窗口函数,而且用的是递归来实现窗口函数。