(点击上方公众号,可快速关注一起学Python)

作者:阮一峰       链接:

http://www.ruanyifeng.com/blog/2019/01/table-join.html

关系型数据库最难的地方,就是建模(model)。

错综复杂的数据,需要建立模型,才能储存在数据库。所谓"模型"就是两样东西:实体(entity)+ 关系(relationship)。

实体指的是那些实际的对象,带有自己的属性,可以理解成一组相关属性的容器。关系就是实体之间的联系,通常可以分成"一对一"、"一对多"和"多对多"等类型。

在关系型数据库里面,每个实体有自己的一张表(table),所有属性都是这张表的字段(field),表与表之间根据关联字段"连接"(join)在一起。所以,表的连接是关系型数据库的核心问题。

  表的连接分成好几种类型。

  • 内连接(inner join)

  • 外连接(outer join)

  • 左连接(left join)

  • 右连接(right join)

  • 全连接(full join)

以前,很多文章采用维恩图(两个圆的集合运算),解释不同连接的差异。

上周,我读到一篇文章,认为还有比维恩图更好的解释方式。我发现确实如此,换一个角度解释,更容易懂。

所谓"连接",就是两张表根据关联字段,组合成一个数据集。问题是,两张表的关联字段的值往往是不一致的,如果关联字段不匹配,怎么处理?比如,表 A 包含张三和李四,表 B 包含李四和王五,匹配的只有李四这一条记录。

很容易看出,一共有四种处理方法。

  • 只返回两张表匹配的记录,这叫内连接(inner join)。

  • 返回匹配的记录,以及表 A 多余的记录,这叫左连接(left join)。

  • 返回匹配的记录,以及表 B 多余的记录,这叫右连接(right join)。

  • 返回匹配的记录,以及表 A 和表 B 各自的多余记录,这叫全连接(full join)。

下图就是四种连接的图示。我觉得,这张图比维恩图更易懂,也更准确。

  

上图中,表 A 的记录是 123,表 B 的记录是 ABC,颜色表示匹配关系。返回结果中,如果另一张表没有匹配的记录,则用 null 填充。

这四种连接,又可以分成两大类:内连接(inner join)表示只包含匹配的记录,外连接(outer join)表示还包含不匹配的记录。所以,左连接、右连接、全连接都属于外连接。

这四种连接的 SQL 语句如下。

SELECT * FROM A  INNER JOIN B ON A.book_id=B.book_id;

SELECT * FROM A  LEFT JOIN B ON A.book_id=B.book_id;

SELECT * FROM A  RIGHT JOIN B ON A.book_id=B.book_id;

SELECT * FROM A  FULL JOIN B ON A.book_id=B.book_id;

上面的 SQL 语句还可以加上where条件从句,对记录进行筛选,比如只返回表 A 里面不匹配表 B 的记录。

SELECT * FROM ALEFT JOIN BON A.book_id=B.book_idWHERE B.id IS null;

另一个例子,返回表 A 或表 B 所有不匹配的记录。

SELECT * FROM AFULL JOIN BON A.book_id=B.book_idWHERE A.id IS null OR B.id IS null;

此外,还存在一种特殊的连接,叫做"交叉连接"(cross join),指的是表 A 和表 B 不存在关联字段,这时表 A(共有 n 条记录)与表 B (共有 m 条记录)连接后,会产生一张包含 n x m 条记录的新表(见下图)。

(完)

看完本文有收获?请转发分享给更多人

关注「Python那些事」,做全栈开发工程师

推荐阅读

  • 全面深入了解 Python 魔法函数

  • 干货推荐 | 掌握这几点,轻松玩转 Bokeh 可视化

  • 10个Python面试常问的问题

  • 深入理解类与对象

python颜色表_数据库表连接的简单解释 | 图文并茂,通俗易懂相关推荐

  1. a连接带id转送不了数据_数据库表连接的简单解释

    关系型数据库最难的地方,就是建模(model). 错综复杂的数据,需要建立模型,才能储存在数据库.所谓"模型"就是两样东西:实体(entity)+ 关系(relationship) ...

  2. Python合并数据、多表连接查询

    Python合并数据.多表连接查询 - 腾讯云开发者社区-腾讯云我们可以通过DataFrame或Series类型的concat方法,来进行连接操作,连接时,会根据索引进行对齐.https://clou ...

  3. Oracle数据库表连接查询并分页SQL语句提示未明确定义列

    Oracle数据库表连接查询并分页SQL语句提示未明确定义列 两张表中的字段: t_product t_category product_id category_id product_name cat ...

  4. python学习笔记之数据库表的读写操作

    一.executemany()函数 建立数据库mariadb_learn,并且在userinfor表里面写入20个用户的账号和密码信息.代码如下 import pymysql #随机生成20条用户数据 ...

  5. mysql自然连接和等值连接_数据库自然连接与等值连接

    mysql-数据查询语句-多表 连接查询 连接查询,是关系数据库中最主要的查询,包括等值查询.自然连接查询.非等值查询.自身连接查询.外连接查询和复合条件连接查询等. 1.等值与非等值连接查询 连接查 ...

  6. a表两个字段都与b表一个字段关联_数据库表的主键实例分析

    主键(PRIMARY KEY):数据库表通常具有包含唯一标识表中每一行的值的一列或一组列.这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 业务主键(自然主键):在数据库表中把具有业务 ...

  7. mysql 字段名称规范_数据库表及字段命名规范

    数据库设计表及字段命名规范(我整理的,望大家多多提建议) 1.数据库表命名规范: (1)表名前应该加上前缀,表的前缀一个用系统或模块的英文名称缩写,前缀全部大写或首字母大写,表名中包含的单词首字母大写 ...

  8. ezdml 支付mysql 吗_数据库表设计工具EZDML使用教程

    表结构设计器(EZDML) 这是一个数据库建表的小软件,可快速的进行数据库表结构设计,建立数据模型.类似大家常用的数据库建模工具如PowerDesigner.ERWIN.ER-Studio和Ratio ...

  9. mysql表结构设计_数据库表结构设计

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对 应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证 ...

最新文章

  1. 关于 Android 进程保活,你所需要知道的一切
  2. 应力循环次数60ant_循环超临界CO2对煤的孔隙结构和力学特性的影响研究
  3. OpenCASCADE:适用于 Android 的 OCCT AndroidQt 示例
  4. 【工厂模式】设计模式之工厂模式【原创】
  5. ajax搜索思路,jquery创建一个ajax关键词数据搜索实现思路
  6. jQuery 的属性操作方法
  7. 图片轮播器(swift)
  8. 交流电路有效值、最大值、平均值
  9. 计算机之父图灵获英女王赦免
  10. 小明一家过桥_「小明一家人过桥问题」如何用编程解决?
  11. Robcup2D足球学习记录【2020.01.14】
  12. 讲理论,重实战,腾达内部SpringBoot王者晋级之路全彩小册开源
  13. Spring--官方文档部分翻译(第一章)
  14. BitmapFactory压缩图片
  15. RedHat and Oracle 离线安装oracle教程
  16. 高中开设计算机了吗,职业高中计算机专业开设的必要性
  17. 背包问题C++(三种类型初涉)
  18. Mercurial修改历史changeset
  19. html纯css实现导航栏下拉菜单(带下拉三级菜单)
  20. ssm明亮眼镜店网站毕业设计(附源码、运行环境)

热门文章

  1. 跳转点算法_跳转搜索算法介绍
  2. python中基本运算符_Python中的基本运算符及示例
  3. sql中聚合函数和分组函数_SQL选择计数聚合函数-语法示例解释
  4. vimb java_vim 中更好的編輯 java 文件.
  5. 怎么实现两周联动加减速_行车记录仪种类繁多不知道怎么选?学会这几招,简单又有效...
  6. stateflow被激活问题探究
  7. Simulink随手记
  8. 如何借助 Python 俘获女孩子芳心?
  9. leetcode - 486. 预测赢家
  10. Dirichlet Process and Stick-Breaking(DP的Stick-breaking 构造)