资讯专栏INFORMATION COLUMN

图解 SQL join 语句

Travis / 1443人阅读

摘要:如下图左外联合生成表的所有记录,包括在表里匹配的记录。如下图为了生成对于表和表唯一的记录集,我们用同样的全外联合,然后用语句排除两边都不想要的记录。

假设我们有下面两张表。表A在左边,表B在右边。我们给它们各四条记录。

id name       id  name
-- ----       --  ----
1  Pirate     1   Rutabaga
2  Monkey     2   Pirate
3  Ninja      3   Darth Vader
4  Spaghetti  4   Ninja

 
我们用过name字段用几种不同方式把这些表联合起来,看能否得到和那些漂亮的韦恩图在概念上的匹配。
 

内联合(inner join)

只生成同时匹配表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

相关文章

  • 图解 SQL Join

    摘要:让我们通过字段以几个不同的方式连接这些表,看看是否会得到一个概念上匹配那些漂亮的维恩图。产生表的完全集,而表中匹配的则有值,没有匹配的则以值取代。表达式如下这个笛卡尔乘积会产生条记录,一般来说,我们很少用到这个语法。 我认为 Ligaya Turmelle 关于 SQL Join 的文章是一篇非常棒的新手入门指南。由于 SQL Join 似乎被默认为基础,同时利用文氏图表来解释它,乍一...

    PrototypeZ 评论0 收藏0
  • 用子查询计算非重复条目,加速五十倍!

    摘要:很有用,但是却很慢计算非重复的数目是分析的一个灾难,显然,我们要在第一篇博文上讨论。在来看一下,图解可以清楚无误的表明原因。也许你下次计算非重复结果需要花费一天的时间,试着用子查询的方法减轻它的负载。 本文说的这个技术是通用的,但为了解释说明,我们选用了 PostgreSQL。感谢 pgAdminIII 提供的解释性插图,这些插图有很大帮助。 很有用,但是却很慢 计算非重复的数目是...

    Pluser 评论0 收藏0
  • 用子查询计算非重复条目,加速五十倍!

    摘要:很有用,但是却很慢计算非重复的数目是分析的一个灾难,显然,我们要在第一篇博文上讨论。在来看一下,图解可以清楚无误的表明原因。也许你下次计算非重复结果需要花费一天的时间,试着用子查询的方法减轻它的负载。 本文说的这个技术是通用的,但为了解释说明,我们选用了 PostgreSQL。感谢 pgAdminIII 提供的解释性插图,这些插图有很大帮助。 很有用,但是却很慢 计算非重复的数目是...

    RaoMeng 评论0 收藏0
  • 用子查询计算非重复条目,加速五十倍!

    摘要:很有用,但是却很慢计算非重复的数目是分析的一个灾难,显然,我们要在第一篇博文上讨论。在来看一下,图解可以清楚无误的表明原因。也许你下次计算非重复结果需要花费一天的时间,试着用子查询的方法减轻它的负载。 本文说的这个技术是通用的,但为了解释说明,我们选用了 PostgreSQL。感谢 pgAdminIII 提供的解释性插图,这些插图有很大帮助。 很有用,但是却很慢 计算非重复的数目是...

    nidaye 评论0 收藏0
  • 用子查询计算非重复条目,加速五十倍!

    摘要:很有用,但是却很慢计算非重复的数目是分析的一个灾难,显然,我们要在第一篇博文上讨论。在来看一下,图解可以清楚无误的表明原因。也许你下次计算非重复结果需要花费一天的时间,试着用子查询的方法减轻它的负载。 本文说的这个技术是通用的,但为了解释说明,我们选用了 PostgreSQL。感谢 pgAdminIII 提供的解释性插图,这些插图有很大帮助。 很有用,但是却很慢 计算非重复的数目是...

    nicercode 评论0 收藏0

发表评论

0条评论

Travis

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<