对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams 解释了SQL的Join。我觉得清楚易懂,转过来。

假设我们有两张表。

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

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

id name id name-- ---- -- ----1 Pirate 1 Rutabaga2 Monkey 2 Pirate3 Ninja 3 Darth Vader4 Spaghetti 4 Ninja

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

SELECT * FROM TableAINNER JOIN TableBON TableA.name = TableB.nameid name id name-- ---- -- ----1 Pirate 2 Pirate3 Ninja 4 Ninja

Inner join

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

SELECT * FROM TableAFULL OUTER JOIN TableBON TableA.name = TableB.nameid name id name-- ---- -- ----1 Pirate 2 Pirate2 Monkey null null3 Ninja 4 Ninja4 Spaghetti null nullnull null 1 Rutabaganull null 3 Darth Vader

Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。

SELECT * FROM TableALEFT OUTER JOIN TableBON TableA.name = TableB.nameid name id name-- ---- -- ----1 Pirate 2 Pirate2 Monkey null null3 Ninja 4 Ninja4 Spaghetti null null

Left outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。

SELECT * FROM TableALEFT OUTER JOIN TableBON TableA.name = TableB.nameWHERE TableB.id IS null id name id name-- ---- -- ----2 Monkey null null4 Spaghetti null null

产生在A表中有而在B表中没有的集合。

SELECT * FROM TableAFULL OUTER JOIN TableBON TableA.name = TableB.nameWHERE TableA.id IS nullOR TableB.id IS nullid name id name-- ---- -- ----2 Monkey null null4 Spaghetti null nullnull null 1 Rutabaganull null 3 Darth Vader

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

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

SELECT * FROM TableACROSS JOIN TableB

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

更新:2014年3月30日

left join 临时表_图解SQL的JOIN相关推荐

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

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

  2. sql left join用法_图解 SQL 中 JOIN 的各种用法

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:CodingStar cnblogs.com/BoyceYang/p/3145279 ...

  3. left join 临时表_不懂SQL优化?那你就OUT了——表连接的优化

    上一遍我们讨论了where 子句的优化,这一遍我们来讨论一下表连接的优化 我们知道在数据库中表连接有两种方式: 1. 内连接(inner join)2. 外连接(左外连接(left join), 右外 ...

  4. inner join on 加条件和where加条件_图解 SQL 中各种连接 JOIN

    先用文字来捋一下思路,数据库操作中无非就是「 增删查改 」,其中「 查」用得最多且最复杂,变化多端.查询的时候,我们可以只是单表查询,也可以是多表连接查询,单表查询中的学问也很大,但限于篇幅,本次主要 ...

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

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

  6. mysql+join+合计_图解MySQL里的各种 JOIN,看完不懂来找我!

    点击关注上方"SQL数据库开发", 设为"置顶或星标",第一时间送达干货作者:码志 链接:https://mazhuang.org/2017/09/11/joi ...

  7. mysql coolshell_图解SQL的Join 转自coolshell

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

  8. sql 过滤空值_图解 SQL,这简直太形象了吧!

    作者: 不剪发的Tony老师 来源:CSDN 链接:http://r6d.cn/qKD6 本文介绍关系数据库的设计思想:在 SQL 中,一切皆关系.在计算机领域有许多伟大的设计理念和思想,例如: 在 ...

  9. mysql版本链图解_图解 SQL 中各种连接 JOIN

    先用文字来捋一下思路,数据库操作中无非就是「增删查改」,其中「 查」用得最多且最复杂,变化多端.查询的时候,我们可以只是单表查询,也可以是多表连接查询,单表查询中的学问也很大,但限于篇幅,本次主要分享 ...

最新文章

  1. LeCun:现在还没有真正的AI系统,机器与生物系统差远了
  2. 市面上有没有靠谱的PM2.5检测仪?如何自己动手制作PM2.5检测仪
  3. Boost.Flyweight 键值测试的类
  4. 复习笔记——操作系统
  5. oracle容错,Oracle DML容错处理方法
  6. Final Cut Pro X剪辑影片基本步骤
  7. 宜家:打造新零售时代的智能客户身份管理系统
  8. VM安装失败 Failed to create the requested registry key Key:installer Error:1021
  9. ShadeGraph教程之节点详解7:Utility Nodes
  10. Google 黑板报: 哀悼与团结的曲线
  11. Chrome之“无法访问此网站 找不到服务器IP地址“解决方案
  12. 鼠标光标变成横线了!
  13. 计算机及统计学,统计学中及计算机视觉中的各种 距离 汇总。。。
  14. html clear属性值,clear属性怎么用
  15. Flutter 时间戳转换成时间 时间字符串转换成时间戳
  16. 争对让望对思野葛对山栀注解_中华经典名著《笠翁对韵》全文解释(上卷四支)...
  17. Android模拟打电话
  18. matlab中批量修改图片尺寸
  19. css让span标签强制换行
  20. python制作螺旋式正方形

热门文章

  1. pytorch生成一个数组
  2. linux内核 header.s,Linux启动代码header.S研究
  3. java中string类_Java中String类浅谈
  4. 第三十三讲 非线性方程组化为一阶方程
  5. SaltStack 安装及配置认证
  6. jQuery基础:下(事件及动画效果)
  7. 【oracle】补充 cursor 基本例子
  8. Vue组件的生命周期
  9. angularJS 全选反选批量删除
  10. iOS开发-Runtime详解(简书)