数据库让我们生活变得越来越方便,尤其是它的插入信息以及对信息的更新,而它最迷人的地方毫无疑问是它强大的查询服务,当然也是最复杂的一块。这种复杂是建立在多表查询的基础之上的,计算机内部需要同时对多张表进行连接,通过笛卡尔积的方式生成所有可能的匹配结果然后再在结果里根据条件筛选出想要的结果。这其中就包括左、右连接,内、外连接以及自连接,下面是详细描述:

左连接:

  左连接(left join)即为两张表进行连接时,是以处于left join语句左侧的表为基准去匹配left join语句右边的表,如果左表中的一条数据在右表中能找到与之对应的一条数据,那么就会出现在以虚表形式存在的结果表中,如果没有找到,那么会以null来代替右表中的数据去匹配左表。这样会有一个鲜明的对比,左表中的每一条数据中的对象在右表中的某个属性的存在性是一目了然的。同时在使用on 进行连接时,on的作用仅仅是进行两张表的上诉连接,发挥匹配的功能,它选出来的是满足这种匹配的所有结果,而并不一定是用户所需要的,这时候就要使用where进行条件判断,从而筛选出真正需要的信息。

右连接:

  右连接(right join)本质上是相当于将上述的左连接的这个过程反过来,以连接语句right join右侧的表为基准去匹配左边的表,剩下的道理是一样的,不再赘述。

内连接:

  内连接(inner join)就是在用两张表进行匹配的时候,如果表中任意一条数据在另一张表中都是找不到对应数据的话,那么在结果表中是不会有这一条数据的。也就是说必须是两张表中任意两条能够互相对应着的数据才能被存入到结果表中,有点类似于取交集的味道。这种适用于一旦某条数据为空便没有意义的场景,这时给它设成null也就毫无意义了。表中的数据也因此显得简练很多。

外连接:

  外链接(outer join)与内连接是相反的,就是说,如果某张表中的数据在另一张中找不到对应的条目并不影响它依然出现在查询的结果中,这对于两张表都是满足的,两边都有出现null的可能,这就有一点数学里的并集的意思。

自连接:

  自连接(self join)可能看起来有点晦涩难懂,但是实际上换个角度你就会豁然开朗,你可以把它这个过程想象成两张一样的表进行左连接或右连接,这样就会简单多了,其中一张表通过设别名的方式成为了虚表,但是共享原标中的信息。应用场景是这样的,就是表的一个字段和另一个字段是相同性质的东西,譬如员工与上司,他们本质也都是员工,在员工表中,员工的直接上司编号会以另一个字段的形式出现,但是他的上司的编号也是会出现在员工编号这个字段里。那么在这种情况下,假如需要去查询某一位员工的上司的信息,在已知该员工编号的条件下,可以根据他的编号去获得上司的编号,进而通过上司的编号去获得上司的信息。下面可以举个例子:

  empId      empName      empLeaderId

    1             张三                   4

    2             李四                   7

    3             王麻子               7

    4             陈六                   8

    5             周日                   7

    6             王八                   8

    7        郝九      8

    8     M10      null

上面的表名为Employee,那么我要查询李四的上司的信息,对应的sql语句应该是这样的:select *from  Employee e1 left join Employee e2 on e1.empLeaderId=e2.empId where e1.empId=2;