你知道的越多,你不知道的就越多

先来看看标准SQL里面定义的外连接的三种类型:

  1. 左外连接
  2. 右外连接
  3. 全外连接

        其中,左外连接和右外连接没有本质的区别,用作主表的表写在运算符左侧就是左外连接,卸载运算符右侧就是右外连接,在这三种里面,用的最多的就是左外和右外了,全外连接用的情况比较少,但是不妨碍我们去了解它,为什么用的少呢?我认为很大一部分原因是Mysql中还没有支持全外连接,而我们学习sql大部分都是用的Mysql,所以我们用的最多的还是前面两种。第三种Mysql就不支持。

全外连接是什么:

下面通过一个例子来看一看全外连接

mysql完全链接 mysql完全外连接_mysql

 

mysql完全链接 mysql完全外连接_数据库_02

 

        上面这两张表中,田中和铃木都属于公共的部分,而伊集院和西园寺分别属于两张表各自拥有的,全外连接就是能够将这两张内容不一致的表,没有遗漏的获取全部信息的方法。

-- 全外连接保留全部信息
 SELECT COALESCE(, ) AS id,
  AS A_name, 
 AS B_name 
FROM Class_A A FULL OUTER JOIN Class_B B
 ON  = ;

mysql完全链接 mysql完全外连接_mysql_03

 

        上面就是全外连接的结果集

可以看到四个人的名字全部出现了,Coalesce函数返回第一个非null的数。

上面的sql代码块虽然可以跑出来结果,但是我们用Mysql是不成功的,那么我们怎么办呢?对于mysql中实现全外连接,可以使用左外连接和右外连接,然后再将两个结果进行Union,同样可以达到目的。

mysql完全链接 mysql完全外连接_sql_04

 

这种方法虽然可以实现,但是代码比较冗长,而且使用两次连接后还要用union来合并,性能也不是很好。因此,换一个角度,

内连接,就是求集合的积

mysql完全链接 mysql完全外连接_mysql_05

 

全外连接,就是求集合的和

mysql完全链接 mysql完全外连接_数据库_06

 

用外连接求差集

在上面的两个Class表中,我们用外连接来求A-B的差集。

  1. 求A-B的差集,那么A就要成为主表,进行左连接。从下面表中,可以看到差集是伊集院

    mysql完全链接 mysql完全外连接_外连接_07

 

2.显示伊集院

在一的基础上,我们进行筛选,找到B的名字为空的就是差集

mysql完全链接 mysql完全外连接_sql_08

 

同时用这个方法,我们来求B-A的差集

mysql完全链接 mysql完全外连接_外连接_09

 

用图片来表示差集

A-B的差集

mysql完全链接 mysql完全外连接_sql_10

 

B-A的差集

mysql完全链接 mysql完全外连接_外连接_11

 

总结:

其实呢,全外连接我们用的很少,基本上的需求都是用左连接和外连接,有时候内连接用的也很多,下一篇会讲解窗口函数,首先用的不是窗口函数,而且用的是递归来实现窗口函数。