我们来继续跟大家聊聊多表关联语句是如何执行的这个问题,上次讲了一个最最基础的两个表关联的语句和执行过程,我们稍微来复习一下,然后接着上次的内容,引入一个“内连接”的概念来。

    假设我们有一个员工表,还有一个产品销售业绩表,员工表里包含了id(主键)、name(姓名)、department(部门),产品销售业绩表里包含了id(主键)、employee_id(员工id)、product_name(产品名称)、saled_amount(销售业绩)。

    现在假设你想看看每个员工对每个产品的销售业绩,写个SQL:

    1. select e.name,e.department,ps.product_name,ps.saled_amount from employee e, product_saled pa where e.id=pa.employee_id

    此时看到的数据可能如下:

    员工 部门 产品 业绩
    张三 大客户部 产品A 30万
    张三 大客户部 产品B 50万
    张三 大客户部 产品C 80万
    李四 零售部 产品A 10万
    李四 零售部 产品B 20万

    至于上述SQL的执行原理,相信大家应该都理解,其实就是从员工表里走全表扫描,找出每个员工,然后针对每个员工的id去业绩表里找employee_id跟员工id相等的数据,可能每个员工的id在业绩表里都会找到多条数据,因为他可能有多个产品的销售业绩。

    然后就是把每个员工数据跟他在业绩表里找到的所有业绩都关联起来,比如张三这个员工就关联了业绩表里的三条数据,李四这个员工关联上了业绩表里的两条行数据。

    其实大家已经不知不觉中学会了最基本的一个SQL关联语法,就是内连接,这个内连接,英语是inner join,意思就是要求两个表里的数据必须是完全能关联上的,才能返回回来,这就是内连接。

    那么现在有这么一个问题,假设员工表里有一个人是新员工,入职到现在一个单子都没开过,也就没有任何的销售业绩,那么此时还希望能够查出来这个员工的数据,只不过他的销售业绩那块可以给个NULL就行了,表示他没任何业绩。

    但是如果仅仅是使用上述SQL语法,似乎是搞不定的,因为那种语法要求,必须要两个表能关联上的数据才能查出来,像你员工表可能有个王五,根本在业绩表里关联不上任何数据,此时这个人是不会查出来的。

    所以此时就要到外连接了,也就是outer join,这个outer join分为左外连接和右外连接,左外连接的意思就是,在左侧的表里的某条数据,如果在右侧的表里关联不到任何数据,也得把左侧表这个数据给返回出来,右外连接反之,在右侧的表里如果关联不到左侧表里的任何数据,得把右侧表的数据返回出来。

    而且,这里还有一个语法限制,如果你是之前的那种内连接,那么连接条件是可以放在where语句里的,但是外连接一般是把连接条件放在ON子句里的,所以此时可以写出如下的SQL语句:

    1. SELECT
    2. e.name,
    3. e.department,
    4. ps.produce_name,
    5. ps.saled_amount
    6. FROM employee e LEFT OUTER JOIN product_saled pa
    7. ON e.id=pa.employee_id

    此时返回的数据里,你可能会看到如下的结果:

    员工 部门 产品 业绩
    张三 大客户部 产品A 30万
    张三 大客户部 产品B 50万
    张三 大客户部 产品C 80万
    李四 零售部 产品A 10万
    李四 零售部 产品B 20万
    王五 零售部 NULL NULL

    所以说,到这里为止,相比大家都很清楚了,其实一般写多表关联,主要就是内连接和外连接,连接的基本语义和实现过程,大家应该也有一定的理解了。