摘要:如下图左外联合生成表的所有记录,包括在表里匹配的记录。如下图为了生成对于表和表唯一的记录集,我们用同样的全外联合,然后用语句排除两边都不想要的记录。
假设我们有下面两张表。表A在左边,表B在右边。我们给它们各四条记录。
id name id name -- ---- -- ---- 1 Pirate 1 Rutabaga 2 Monkey 2 Pirate 3 Ninja 3 Darth Vader 4 Spaghetti 4 Ninja
我们用过name字段用几种不同方式把这些表联合起来,看能否得到和那些漂亮的韦恩图在概念上的匹配。
只生成同时匹配表A和表B的记录集。(如下图)
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name id name id name -- ---- -- ---- 1 Pirate 2 Pirate 3 Ninja 4 Ninja全外联合(full outer join)
生成表A和表B里的记录全集,包括两边都匹配的记录。如果有一边没有匹配的,缺失的这一边为null。(如下图)
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左外联合(left 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
为了生成只在表A里而不在表B里的记录集,我们用同样的左外联合,然后用where语句排除我们不想要的记录。(如下图)
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null id name id name -- ---- -- ---- 2 Monkey null null 4 Spaghetti null null
为了生成对于表A和表B唯一的记录集,我们用同样的全外联合,然后用where语句排除两边都不想要的记录。(如下图)
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null id name id name -- ---- -- ---- 2 Monkey null null 4 Spaghetti null null null null 1 Rutabaga null null 3 Darth Vader笛卡尔积 (交叉联合(cross join))
还有一种笛卡尔积或者交叉联合(cross join),据我所知不能用韦恩图表示:
SELECT * FROM TableA CROSS JOIN TableB
这个把“所有”联接到“所有”,产生4乘4=16行,远多于原始的集合。如果你学过数学,你便知道为什么这个联合遇上大型的表很危险。
【2013-06-17 更新】下图由 Moffatt 在 2008 年制作(点击可查看大图)。PS:Jeff Atwood 的文章写于 2007 年。
https://blog.codinghorror.com...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/32179.html
摘要:让我们通过字段以几个不同的方式连接这些表,看看是否会得到一个概念上匹配那些漂亮的维恩图。产生表的完全集,而表中匹配的则有值,没有匹配的则以值取代。表达式如下这个笛卡尔乘积会产生条记录,一般来说,我们很少用到这个语法。 我认为 Ligaya Turmelle 关于 SQL Join 的文章是一篇非常棒的新手入门指南。由于 SQL Join 似乎被默认为基础,同时利用文氏图表来解释它,乍一...
摘要:很有用,但是却很慢计算非重复的数目是分析的一个灾难,显然,我们要在第一篇博文上讨论。在来看一下,图解可以清楚无误的表明原因。也许你下次计算非重复结果需要花费一天的时间,试着用子查询的方法减轻它的负载。 本文说的这个技术是通用的,但为了解释说明,我们选用了 PostgreSQL。感谢 pgAdminIII 提供的解释性插图,这些插图有很大帮助。 很有用,但是却很慢 计算非重复的数目是...
摘要:很有用,但是却很慢计算非重复的数目是分析的一个灾难,显然,我们要在第一篇博文上讨论。在来看一下,图解可以清楚无误的表明原因。也许你下次计算非重复结果需要花费一天的时间,试着用子查询的方法减轻它的负载。 本文说的这个技术是通用的,但为了解释说明,我们选用了 PostgreSQL。感谢 pgAdminIII 提供的解释性插图,这些插图有很大帮助。 很有用,但是却很慢 计算非重复的数目是...
摘要:很有用,但是却很慢计算非重复的数目是分析的一个灾难,显然,我们要在第一篇博文上讨论。在来看一下,图解可以清楚无误的表明原因。也许你下次计算非重复结果需要花费一天的时间,试着用子查询的方法减轻它的负载。 本文说的这个技术是通用的,但为了解释说明,我们选用了 PostgreSQL。感谢 pgAdminIII 提供的解释性插图,这些插图有很大帮助。 很有用,但是却很慢 计算非重复的数目是...
摘要:很有用,但是却很慢计算非重复的数目是分析的一个灾难,显然,我们要在第一篇博文上讨论。在来看一下,图解可以清楚无误的表明原因。也许你下次计算非重复结果需要花费一天的时间,试着用子查询的方法减轻它的负载。 本文说的这个技术是通用的,但为了解释说明,我们选用了 PostgreSQL。感谢 pgAdminIII 提供的解释性插图,这些插图有很大帮助。 很有用,但是却很慢 计算非重复的数目是...
阅读 2030·2021-11-23 09:51
阅读 3529·2021-11-11 10:57
阅读 1206·2021-10-09 09:43
阅读 2230·2021-09-29 09:35
阅读 1807·2019-08-30 15:54
阅读 1683·2019-08-30 15:44
阅读 3034·2019-08-30 13:20
阅读 1587·2019-08-30 11:19