2.外连接:分为LEFT、RIGHT、FULL三种:
如有R与S做连接,那么LEFT是所有满足条件的row以及所有在R属性对应值在S中为NULL的集合。 注意( left join 是 left outer join 简写)
RIGHT是所有满足条件的row以及所有在S属性对应值在R中为NULL的集合
FULL是所有满足条件的row以及任何在R或S中出现NULL的集合。
现在可以看到,三种外连接的区别就在于对空值的处理不同(空值真是数据库的一大困难)。
假设我们有下面两张表。表A在左边,表B在右边。我们给它们各四条记录。
id name id name -- ---- -- ---- 1 Pirate 1 Rutabaga 2 Monkey 2 Pirate 3 Ninja 3 Darth Vader 4 Spaghetti 4 Ninja
我们用过name字段用几种不同方式把这些表联合起来,看能否得到和那些漂亮的韦恩图在概念上的匹配。
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name ;
id name id name -- ---- -- ---- 1 Pirate 2 Pirate 3 Ninja 4 Ninja
内联合(inner join)只生成同时匹配表A和表B的记录集。(如下图)
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name ;
id name id name -- ---- -- ---- 1 Pirate 2 Pirate 2 Monkey null null 3 Ninja 4 Ninja 4 Spaghetti null null null null 1 Rutabaga null null 3 Darth Vader
全外联合(full outer join)生成表A和表B里的记录全集,包括两边都匹配的记录。如果有一边没有匹配的,缺失的这一边为null。(如下图)
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name ;
id name id name -- ---- -- ---- 1 Pirate 2 Pirate 2 Monkey null null 3 Ninja 4 Ninja 4 Spaghetti null null
左外联合(left outer join)生成表A的所有记录,包括在表B里匹配的记录。如果没有匹配的,右边将是null。(如下图)
总结图:
参考: http://chuansongme.com/n/481377