详情请看:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

通过 文氏图 Venn diagrams 解释了SQL的Join。简单易懂,转过来收藏当箱底货了。

假设有两张表。

  • Table A 是左边的表。
  • Table B 是右边的表。

其各有四条记录,其中有两条记录是相同的,如下所示:

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

下面让我们来看看不同的Join会产生什么样的结果。

SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.nameid  name       id   name
--  ----       --   ----
1   Pirate     2    Pirate
3   Ninja      4    Ninja

Inner join
产生的结果集中,是A和B的交集。

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.nameid    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做为值。

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.nameid  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值取代。

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表中没有的集合。

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

产生A表和B表都没有出现的数据集。

还需要注意的是我们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:

SELECT * FROM TableA
CROSS JOIN TableB

这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。

图解SQL Join用法相关推荐

  1. [转]SQL:JOIN用法

    JOIN连接组合两个表中的字段记录,包括三种:  INNER JOIN运算式:连接组合两个表中的字段记录. LEFT JOIN运算式:连接组合两个表中的字段记录,并将包含了LEFT JOIN左边表中的 ...

  2. 图解SQL inner join、left join、right join、full outer join、union、union all的区别

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对 于Select出来的结果集是什么样子有点不是很清楚.Codi ...

  3. 图解SQL的inner join(join)、left join、right join、full outer join、union、union all的区别...

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  4. SQL中的left outer join,inner join,right outer join用法 (左右内连接)

    SQL语句中的left outer join,inner join,right outer join用法 left outer join=left join ,   right outer join= ...

  5. 图解SQL的inner join、left join、right join、full outer join、union、union all的区别

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  6. sql join on和不用join区别_图解 SQL 各种 JOIN,太有用了!

    点击上方蓝字关注小姐姐吧从业以来主要在做客户端,用到的数据库都是表结构比较简单的 SQLite,以我那还给老师一大半的 SQL 水平倒也能对付.现在偶尔需要到后台的 SQL Server 里追查一些数 ...

  7. SQL多表查询:SQL JOIN连接查询各种用法总结

    在实际应用中,大多的查询都是需要多表连接查询的,但很多初学SQL的小伙伴总对各种JOIN有些迷糊.回想一下,初期很长一段时间,我常用的似乎也就是等值连接 WHERE 后面加等号,对各种JOIN也是不求 ...

  8. SQL update join用法

    SQL update join语法介绍 在工作中,我们会碰到一种这样场景: 表A为订单信息表.B为订单操作日志表,假设业务系统产生BUG,导致A表的订单数据有一部分更新失败. 需求:我们需要批量修复表 ...

  9. SQL Join,Left Join,Right Join用法

    SQL Join 用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. INNER JOIN:如果表中有至少一个匹配,则返回行 LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行 ...

最新文章

  1. C# 简单软件有效期注册的实现【原】
  2. React Native 的顶部导航栏和底部导航栏目
  3. 五年级用计算机探究规律教案,人教版五年级上册数学《用计算器探索规律》教案...
  4. windows doc快捷键
  5. SQL优化器原理 - Auto Hash Join
  6. c++ 数组截取_【学习教程】JavaScript中原生Array数组方法详解
  7. mongodb 默认端口号_你的爬虫数据储存在哪?MongoDB入门篇
  8. 11 wifi6速率_什么是WiFi 6?究竟有多6?
  9. Selenium常见异常分析及解决方案
  10. angelajs中ajax,前端测试数据怎么利用Mock.js进行生成
  11. 15拆分成3个不同的自然数_素数大概有多少个?15岁的高斯翻过素数表之后给出了答案...
  12. php mysql购物车代码_php购物车实现代码实例汇总
  13. 德标螺纹规格对照表_德标、欧标、国际、国标对照表
  14. 串口总线舵机之配置舵机
  15. 区块链≠分布式账本,别再傻傻分不清
  16. 分水岭算法c语言,分水岭算法的概念及原理
  17. IDEA中怎么设置黑色或白色背景
  18. 【Relax人生法则之躺平方法论】如何优雅地躺平?那些看似无足轻重,实则细思极恐的毒鸡汤。
  19. html页面使用var变量,html元素:var标签的使用方法及作用
  20. 互联网公司2020年新年礼盒歧视指南

热门文章

  1. vue 生命周期详解
  2. lodash源码分析之Hash缓存
  3. THINKPHP3.2+PHP5.3 配置MEMCACHE
  4. FastReport.NET 中使用二维码
  5. poj 1064 Cable master
  6. LeetCode--Factorial Trailing Zeroes(注意)
  7. 原型设计20条军规(转)
  8. Linux操作系统-命令-free
  9. 微软.Net开发中的多线程编程总结
  10. Android ListView侧滑item,仿QQ删除效果