免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1229 | 回复: 1
打印 上一主题 下一主题

关于sql joins的图形解说 . [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-02 17:01 |只看该作者 |倒序浏览
关于sql joins的图形解说 .







原文:http://www.codinghorror.com/blog ... n-of-sql-joins.html

翻译:

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

[plain] view plaincopyprint?
  1. 01.id name       id  name  
  2. 02.-- ----       --  ----  
  3. 03.1  <span style="color:#cc0000;">Pirate</span>     1   Rutabaga  
  4. 04.2  Monkey     2   <span style="color:#cc0000;">Pirate  
  5. 05.</span>3  <span style="color:#cc0000;">Ninja</span>      3   Darth Vader  
  6. 06.4  Spaghetti  4   <span style="color:#cc0000;">Ninja</span>  
  7. id name       id  name
  8. -- ----       --  ----
  9. 1  <span style="color:#cc0000;">Pirate</span>     1   Rutabaga
  10. 2  Monkey     2   <span style="color:#cc0000;">Pirate
  11. </span>3  <span style="color:#cc0000;">Ninja</span>      3   Darth Vader
  12. 4  Spaghetti  4   <span style="color:#cc0000;">Ninja</span>
复制代码
让我们用不同的方式根据name这个字段join这些表进行查询,来看看是否我们能得出一个能够和这些漂亮的图解相吻合的结论。



[sql] view plaincopyprint?01.SELECT * FROM TableA  02.INNER JOIN TableB  03.ON TableA.name = TableB.name  04.  05.id  name       id   name  06.--  ----       --   ----   07.1   Pirate     2    Pirate  08.3   Ninja      4    Ninja  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都相同的部分


  
[sql] view plaincopyprint?01.SELECT * FROM TableA  02.FULL OUTER JOIN TableB  03.ON TableA.name = TableB.name  04.  05.id    name       id    name  06.--    ----       --    ----   07.1     Pirate     2     Pirate  08.2     Monkey     null  null  09.3     Ninja      4     Ninja  10.4     Spaghetti  null  null  11.null  null       1     Rutabaga         12.null  null       3     Darth Vader  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来填充.
  

[sql] view plaincopyprint?01.SELECT * FROM TableA  02.LEFT OUTER JOIN TableB  03.ON TableA.name = TableB.name  04.  05.id  name       id    name  06.--  ----       --    ----   07.1   Pirate     2     Pirate  08.2   Monkey     null  null  09.3   Ninja      4     Ninja  10.4   Spaghetti  null  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来填充。

  
[sql] view plaincopyprint?01.SELECT * FROM TableA  02.LEFT OUTER JOIN TableB  03.ON TableA.name = TableB.name  04.WHERE TableB.id IS null  05.  06.id  name       id     name  07.--  ----       --     ----   08.2   Monkey     null   null  09.4   Spaghetti  null   null  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.
  
[sql] view plaincopyprint?01.SELECT * FROM TableA  02.FULL OUTER JOIN TableB  03.ON TableA.name = TableB.name  04.WHERE TableA.id IS null   05.OR TableB.id IS null  06.  07.id    name       id    name  08.--    ----       --    ----   09.2     Monkey     null  null  10.4     Spaghetti  null  null  11.null  null       1     Rutabaga  12.null  null       3     Darth Vader  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.
  



         还有一个cross join查询,这个就不用图解了:
  1. [sql] view plaincopyprint?01.SELECT * FROM TableA  02.CROSS JOIN TableB  SELECT * FROM TableA
  2. CROSS JOIN TableB
复制代码
这种连接查询是把每个记录都查出来的并且叠加匹配,结果12行,很多原始数据集合。如果你做这种匹配查询,你会发现为什么对于查询大数据时是一种危险的连接了。

论坛徽章:
0
2 [报告]
发表于 2012-03-02 17:01 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP