介绍

这是一篇阐述SQL JOINs的文章,本文是国内大佬翻译的一篇文章,为了更容易理解,以MySQL为例在最后面加了示例,原文链接为:https://www.cnblogs.com/xufeiyang/p/5818571.html

背景

我是个不喜欢抽象的人,一图胜千言。我在网上查找了所有的关于SQL JOIN的解释,但是没有找到一篇能用图像形象描述的。

有些是有图片的但是他们没有覆盖所有JOIN的例子,有些介绍实在简单空白得不能看。所以我决定写个自己的文章来介绍SQL JOINs.

详细说明

接下来我将讨论七种你可以从两个关联表中获取数据的方法, 排除了交叉JOIN和自JOIN的情况。 七个JOINs的例子如下:
INNER JOIN (内连接)
LEFT JOIN (左连接)
RIGHT JOIN (右连接)
OUTER JOIN (外连接)
LEFT JOIN EXCLUDING INNER JOIN (左连接排除内连接结果)
RIGHT JOIN EXCLUDING INNER JOIN (右连接排除内连接结果)
OUTER JOIN EXCLUDING INNER JOIN (外连接排除内连接结果)
为了这个文章更好的描述,我把5,6,7当作LEFT EXCLUDING INNER JOIN, RIGHT EXCLUDING INNER JOIN,OUTER EXCLUDING INNER JOIN来特别说明

有些人可能有不同意见: 5,6,7不是真正的两个表的JOIN; 但是为了方便理解,我仍然把这些作为JOINs, 因为你有可能会在每个查询中使用到这些 JOIN (排除一些有WHERE条件的记录)

INNER JOIN (内连接)

这是最简单、最容易理解、最常用的JOIN方式。 内连接查询返回表A和表B中所有匹配行的结果。 SQL样例如下:

SELECT  FROM Table_A AINNER JOIN Table_B BON A.Key = B.Key

LEFT JOIN (左连接)


LFET JOIN查询返回所有表A中的记录, 不管是否有匹配记录在表B中。它会返回所有表B中的匹配记录 (没有匹配的当然会标记成null了)。 SQL样例如下:

SELECT FROM Table_A ALEFT JOIN Table_B BON A.Key = B.Key

RIGHT JOIN (右连接)

和LEFT JOIN相反。 RIGHT JOIN查询会返回所有表B中的记录,不管是否有匹配记录在表A中。它会返回所有表A中的匹配记录(没有匹配的当然会标记成null了)。 SQL样例如下:

SELECT FROM Table_A ARIGHT JOIN Table_B BON A.Key = B.Key

OUTER JOIN (外连接)


OUTER JOIN也可以当作是FULL OUTER JOIN 或者FULL JOIN。它会返回两个表中所有行,左表A匹配右表B,右表B也匹配左表A (没有匹配的就显示null了)。OUTER JOIN一般写成下面样子:

SELECT FROM Table_A AFULL OUTER JOIN Table_B BON A.Key = B.Key

LEFT Excluding JOIN


它会返回表A中所有不在表B中的行,一般写成:

SELECT  FROM Table_A ALEFT JOIN Table_B BON A.Key = B.KeyWHERE B.Key IS NULL

RIGHT Excluding JOIN


与上面的相反,它会返回表B中所有不在表A中的行,SQL样例如下:

SELECT FROM Table_A ARIGHT JOIN Table_B BON A.Key = B.KeyWHERE A.Key IS NULL

OUTER Excluding JOIN


Outer Excluding JOIN 会返回所有表A和表B中没有匹配的行。我还没有遇到要用到这种情况的,但是其他的JOIN,用的比较频繁。 SQL样例如下:

SELECT FROM Table_A AFULL OUTER JOIN Table_B BON A.Key = B.KeyWHERE A.Key IS NULL OR B.Key IS NULL

例子

以MySQL为例,准备的数据如下,为了更容易理解,所以数据比较有规律

teacher表

teacher_card表

1,2,3为teacher表独有数据,4,5,6为公有数据,7,8,9为teacher_card表独有数据

INNER JOIN

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tINNER JOIN teacher_card tcON t.tid = tc.tid

INNER关键字可以不写

lEFT JOIN

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tLEFT OUTER JOIN teacher_card tcON t.tid = tc.tid

OUTER关键字可以不写

RIGHT JOIN

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tRIGHT OUTER JOIN teacher_card tcON t.tid = tc.tid

OUTER关键字可以不写

OUTER JOIN

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tFULL OUTER JOIN teacher_card tcON t.tid = tc.tid

这样写是不行的,MySQL不支持FULL OUTER JOIN,可改写为如下形式

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tLEFT JOIN teacher_card tcON t.tid = tc.tidUNIONSELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tRIGHT JOIN teacher_card tcON t.tid = tc.tid


LEFT EXCLUDING JOIN

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tLEFT JOIN teacher_card tcON t.tid = tc.tidWHERE tc.tid IS NULL


RIGHT EXCLUDING JOIN

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tRIGHT JOIN teacher_card tcON t.tid = tc.tidWHERE t.tid IS NULL


OUTER EXCLUDING JOIN

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tFULL OUTER JOIN teacher_card tcON t.tid = tc.tidWHERE t.tid IS NULLOR tc.tid IS NULL

同理MySQL中不能写成如上形式,可改写为如下

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tLEFT JOIN teacher_card tcON t.tid = tc.tidWHERE tc.tid IS NULLUNIONSELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tRIGHT JOIN teacher_card tcON t.tid = tc.tidWHERE t.tid IS NULL


最后放一张大图

SQL JOIN,你想知道的应该都有相关推荐

  1. Spark SQL JOIN操作代码示例

    title: Spark SQL JOIN操作 date: 2021-05-08 15:53:21 tags: Spark 本文主要介绍 Spark SQL 的多表连接,需要预先准备测试数据.分别创建 ...

  2. sql join 示例_SQL CROSS JOIN与示例

    sql join 示例 In this article, we will learn the SQL CROSS JOIN concept and support our learnings with ...

  3. SQL JOIN 的使用

    由于工作需要,现在也开始写一些复杂一点的 sql 了.由于之前对于 join 与 where 关键字的使用一直有疑惑,故写一篇文章整理一下,算是对 sql 中各种表联结使用的一个总结. SQL JOI ...

  4. java map join_HashMap 常见应用:实现 SQL JOIN

    在我的上一篇文章中,讲到了我自己初步认识 HashMap 的一个经验分享:HashMap 浅析 -- LeetCode Two Sum 刷题总结.作为一个 CRUD 工程师,平时很少接触到基础组件的涉 ...

  5. SQL JOIN\SQL INNER JOIN 关键字\SQL LEFT JOIN 关键字\SQL RIGHT JOIN 关键字\SQL FULL JOIN 关键字...

    SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中的表 ...

  6. Spark SQL join的三种实现方式

    引言 join是SQL中的常用操作,良好的表结构能够将数据分散到不同的表中,使其符合某种规范(mysql三大范式),可以最大程度的减少数据冗余,更新容错等,而建立表和表之间关系的最佳方式就是join操 ...

  7. 一名小小的SQL Server DBA想谈一下SQL Server的能力

    一名小小的SQL Server DBA想谈一下SQL Server的能力 百度上暂时还没有搜索到相关的个人写的比较有价值的文章,至少在中文网络的世界里面没有 但是在微软的网站有这样一篇文章:<比 ...

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

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

  9. 大学生学python到底有没有有-为什么我会想建议每个大学生都学一点编程?

    原标题:为什么我会想建议每个大学生都学一点编程? 一个今年上岸.成功录取到中山大学的同学,昨天疯狂轰炸我: 他没想到导师主动联系他,让他参加非常重要的课题研究. "当初抱着试一试的心态学的编 ...

最新文章

  1. IT公司100题-27-跳台阶问题
  2. Placement new的用法及用途
  3. QT旋转按钮控件的实现
  4. SUSTech-Application
  5. Immutable Collections(3)Immutable List实现原理(中)变化中的不变
  6. 闲话 - 火车硬座座位分布图
  7. CSS:媒体查询 CSS3 Media Queries
  8. 使用IDEA在引入Schema空间时报错URI is not registered解决方法
  9. 如何进行软件需求分析
  10. 三段式 matlab,1stopt三段式函数拟合
  11. DeepFool论文解读
  12. Ceph管理平台Calamari的架构与功能分析
  13. 《iOS防护01》ptrace防护
  14. 如何购买大容量的邮箱?哪里可以申请注册大量邮箱?
  15. Linux系统安装字体。在代码中生成图片时中文乱码
  16. 内网安全:内网渗透.(拿到内网主机最高权限 vulntarget 靶场 A)
  17. 小白如何用Python脚本玩转跳一跳
  18. 第十七章 使用系统监视器 - 使用 ^%SYSMONMGR 实用程序
  19. 5G专网成行业融合“敲门砖”
  20. SqlSugar 首次使用以及遇到的问题

热门文章

  1. 1 物料xxxxxx在仓库101里不存在
  2. inotifypropertychanged接受不执行_scp客户端现多个漏洞,可执行恶意脚本
  3. MySQL:数据库备份批处理脚本
  4. linux /dev
  5. 【Swin Transformer】W-MSA与MSA时间复杂度的理解
  6. pix2pix损失函数理解(精)
  7. vue 全局函数的 定义与任意调用 (代码篇)
  8. Emlog精简模板无繁琐操作,适合新手
  9. 基于springboot 改造 open-shop小程序商城
  10. Gdu – Windows 也能用的「命令行式」磁盘使用情况分析工具