关于sql joins的图形解说

原文:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

翻译:

我喜欢这种查询方式,现在让我们来看看它是如何工作的。假设我们有如下的两张表。表A在左边,表B在右边。我们将用下面的四条记录进行互相的组装查询。

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

 

让我们用不同的方式根据name这个字段join这些表进行查询,来看看是否我们能得出一个能够和这些漂亮的图解相吻合的结论。

 

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都相同的部分

Venn diagram of SQL inner join
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来填充.

Venn diagram of SQL cartesian join

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来填充。

Venn diagram of SQL left join
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

Left outer join produces a complete set of records from Table A, with the matching records    (where available) in Table B. If there is no match, the right side will contain null.

join-left-outer.png
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

  Full outer join  To produce the set of records unique to Table A and Table B, we perform the same full outer join,    thenexclude the records we don't want from both sides via a where clause.

join-outer.png

 

         还有一个cross join查询,这个就不用图解了:

SELECT * FROM TableA
CROSS JOIN TableB

       

         这种连接查询是把每个记录都查出来的并且叠加匹配,结果12行,很多原始数据集合。如果你做这种匹配查询,你会发现为什么对于查询大数据时是一种危险的连接了。

 

英语水平有限,请勿喷水。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值