(1)案例: 内连接和外连接演示
    假设有一个员工表,还有一个产品销售表,员工表包含了id(主键),name(姓名),department(部门), 产品销售业绩表里包含了 id(主键),employee_id(员工id),product_name(产品名称)saled_amount(销售业绩)
    假设想查询m每个员工对每个产品的销售业绩:SQL:
 select e.name,e.department,pa.saled_amount  from employee e , product_saled pa where e.id=pa.employee_id
    此时看到数据如下:
            员工        部门            产品        业绩
            张三        大客户部         产品A    30万
            张三        大客户部         产品B    50万
            张三        大客户部         产品C    80万
            李四        零售部         产品A    10万
            李四        零售部         产品B    12万
    上述SQL的执行原理,其实就是从员工表里走全表扫描,找出每个员工,然后针对每个员工的id去业绩表里找 employee_id 跟 员工id相等的数据,可能每个员工的id在业绩表里都会找到多条数据,因为他可能有多个产品的销售产品业绩。
然后就是把每个员工数据跟他业绩表里找到的所有业绩数据都关联起来,比如张三员工就关联了业绩表里的三条数据,李四这个员工关联上了业绩表里的两条数据。其实这个就是内连接,inner join,意思就是要求两个表的数据必须完全能关联上,才能返回,这就是内连接。
现在有一个问题,假设员工表里有一个人是新员工,入职到现在一个单子都没开过,也就没有任何业绩,那么此时还是希望能查到这个员工的数据,只不过销售业绩表都是null就行了,表示他没业绩。
    但是仅仅使用上述SQL语法是搞不定的,因为那种语法要求,必须要求两个表能关联上的数据才查出来,如果没有业绩是查不出来的。
    所以此时要用到外连接,就是outer join,这个outer join分为左外连接和右外连接,左外连接就是 在左侧的表里的某条数据,如果在右侧的表里关联不到任何数据,也得把左侧表这个数据给返回出来,右外连接反之,在右侧的表里如果关联不到左侧表里的任何数据,得把右侧表的数据返回出来。
    而且还有一个语法限制,如果是之前的内连接,那么连接条件是可以放在where语句里的,但是外连接一把是把连接条件放在ON子句里的,
所以此时SQL语句如下:LEFT JOIN是LEFT OUTER JOIN的简写版:
            select e.name ,
                    e.department,
                    pa.product_name,
                    pa.saled_amount
            from empolyee e LEFT OUTER JOIN product_saled pa  ON e.id=pa.employee_id 
        此时查询可能如下:
            员工        部门            产品        业绩
            张三        大客户部         产品A    30万
            张三        大客户部         产品B    50万
            张三        大客户部         产品C    80万
            李四        零售部         产品A    10万
            李四        零售部         产品B    12万
            王五        零售部        NULL     NULL
拓展:下面 inner join 等同
SELECT         FROM    A a     JOIN B b ON a.id = b.pid
SELECT        FROM    A a    INNER JOIN B b ON a.id = b.pid
SELECT    *    FROM    A a,    B b    WHERE    a.id = b.pid
select ..from tab1 straiht_join tab2 where …
straight_join 实际上与内连接 inner join 表现完全一致,不同的是使用了 straight_join 后,tab1 会先于 tab2 载入。
MySQL 在执行 inner join 的时候,会根据自己内部的优化规则来决定先载入tab1 还是 tab2,如果您确认 MySQL 载入表的顺序并不是最优化的时候,就可以使用 straight_join 以替代 inner join,来强制MySQL 选择指定的执行顺序。
