外链论坛

 找回密码
 立即注册
搜索
查看: 40|回复: 1

图示数据库表连接,秒懂左连接,右连接,内连接...

[复制链接]

2683

主题

182

回帖

9921万

积分

论坛元老

Rank: 8Rank: 8

积分
99210448
发表于 2024-8-4 10:33:48 | 显示全部楼层 |阅读模式

Java识堂,一个高原创,高保藏,有干货的微X公众号,一块成长,一块进步,欢迎关注

关系型数据库最难的地区便是建模(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 A LEFT JOIN B ON A.book_id=B.book_id WHERE B.id IS null;

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

SELECT * FROM A FULL JOIN B ON A.book_id=B.book_id WHERE A.id IS null OR B.id IS null;

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

作者:阮一峰

链接:

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

使用道具 举报

1

主题

988

回帖

-3

积分

限制会员

积分
-3
发表于 2024-9-8 09:33:45 | 显示全部楼层
你的见解真是独到,让我受益匪浅。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-10-6 02:25 , Processed in 0.062948 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.