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

 2023-09-07 阅读 19 评论 0

摘要:(点击上方公众号,可快速关注一起学Python)作者:阮一峰 链接:python用什么数据库最好、http://www.ruanyifeng.com/blog/2019/01/table-join.html关系型数据库最难的地方,就是建模(model)。错综复杂的数据,需要建立模型,才能储存

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

作者:阮一峰       链接:

python用什么数据库最好、http://www.ruanyifeng.com/blog/2019/01/table-join.html

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

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

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

90388ebeedd986681d65df04f910c267.png

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

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

  • 内连接(inner join)

  • 外连接(outer join)

  • 左连接(left join)

  • 右连接(right join)

  • 全连接(full join)

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

352d01d884c830231f5db08ebcca8a9b.png

6b4f854915d8ed366fa32f291d7bf082.png

86fb7eda0ab54b681388bf5294312283.png

587c927876d08e5ebe4a637c8d7d0d38.png

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

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

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

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

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

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

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

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

fd665f46e0f13a0f9560d9eba117d299.png  

上图中,表 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 条记录的新表(见下图)。

e847fdfb62c1171c235cf58e479a4ac0.png

(完)

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

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

bc254dd4d5d7eaa260de0c083da74dfb.png

推荐阅读

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

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

  • 10个Python面试常问的问题

  • 深入理解类与对象

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/17585.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息