时间:2021-07-01 10:21:17 帮助过:2人阅读
我们用过name字段用几种不同方式把这些表联合起来,看能否得到和那些漂亮的韦恩图在概念上的匹配。
1 SELECT * FROM TableA 2 INNER JOIN TableB 3 ON TableA.name = TableB.name 4 5 id name id name 6 -- ---- -- ---- 7 1 Pirate 2 Pirate 8 3 Ninja 4 Ninja
内联合(inner join)只生成同时匹配表A和表B的记录集。(如下图)
1 SELECT * FROM TableA 2 FULL OUTER JOIN TableB 3 ON TableA.name = TableB.name 4 5 id name id name 6 -- ---- -- ---- 7 1 Pirate 2 Pirate 8 2 Monkey null null 9 3 Ninja 4 Ninja 10 4 Spaghetti null null 11 null null 1 Rutabaga 12 null null 3 Darth Vader
全外联合(full outer join)生成表A和表B里的记录全集,包括两边都匹配的记录。如果有一边没有匹配的,缺失的这一边为null。(如下图)
Full outer join
1 SELECT * FROM TableA 2 LEFT OUTER JOIN TableB 3 ON TableA.name = TableB.name 4 5 id name id name 6 -- ---- -- ---- 7 1 Pirate 2 Pirate 8 2 Monkey null null 9 3 Ninja 4 Ninja 10 4 Spaghetti null null
左外联合(left outer join)生成表A的所有记录,包括在表B里匹配的记录。如果没有匹配的,右边将是null。(如下图)
Left outer join
1 SELECT * FROM TableA 2 LEFT OUTER JOIN TableB 3 ON TableA.name = TableB.name 4 WHERE TableB.id IS null 5 6 id name id name 7 -- ---- -- ---- 8 2 Monkey null null 9 4 Spaghetti null null
为了生成只在表A里而不在表B里的记录集,我们用同样的左外联合,然后用where语句排除我们不想要的记录。(如下图)
1 SELECT * FROM TableA 2 FULL OUTER JOIN TableB 3 ON TableA.name = TableB.name 4 WHERE TableA.id IS null 5 OR TableB.id IS null 6 7 id name id name 8 -- ---- -- ---- 9 2 Monkey null null 10 4 Spaghetti null null 11 null null 1 Rutabaga 12 null null 3 Darth Vader
为了生成对于表A和表B唯一的记录集,我们用同样的全外联合,然后用where语句排除两边都不想要的记录。(如下图)
WHERE TableA.id IS null
还有一种笛卡尔积或者交叉联合(cross join),据我所知不能用韦恩图表示:
1 SELECT * FROM TableA 2 CROSS JOIN TableB
这个把“所有”联接到“所有”,产生4乘4=16行,远多于原始的集合。如果你学过数学,你便知道为什么这个联合遇上大型的表很危险。
下图由 Moffatt 在 2008 年制作(点击可查看大图)。PS:Jeff Atwood 的文章写于 2007 年。
SQL Joins
转自:https://linux.cn/article-5837-1.html
画图解释 SQL join 语句
标签: