左连接和右连接的区别数据库左右内外连接详细易懂数据库左连接和右连接的区别总结




左连接和右连接的区别数据库左右内外连接详细易懂数据库左连接和右连接的区别总结

2022-07-21 2:25:49 网络知识 官方管理员


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

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

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

左连接和右连接的区别(数据库左右内外连接详细易懂)(1)

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

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

内连接(innerjoin)外连接(outerjoin)左连接(leftjoin)右连接(rightjoin)全连接(fulljoin)

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

左连接和右连接的区别(数据库左右内外连接详细易懂)(2)

左连接和右连接的区别(数据库左右内外连接详细易懂)(3)

左连接和右连接的区别(数据库左右内外连接详细易懂)(4)

左连接和右连接的区别(数据库左右内外连接详细易懂)(5)

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

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

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

只返回两张表匹配的记录,这叫内连接(innerjoin)。返回匹配的记录,以及表A多余的记录,这叫左连接(leftjoin)。返回匹配的记录,以及表B多余的记录,这叫右连接(rightjoin)。返回匹配的记录,以及表A和表B各自的多余记录,这叫全连接(fulljoin)。

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

左连接和右连接的区别(数据库左右内外连接详细易懂)(6)

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

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

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

SELECT*FROMAINNERJOINBONA.book_id=B.book_id;SELECT*FROMALEFTJOINBONA.book_id=B.book_id;SELECT*FROMARIGHTJOINBONA.book_id=B.book_id;SELECT*FROMAFULLJOINBONA.book_id=B.book_id;

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

SELECT*FROMALEFTJOINBONA.book_id=B.book_idWHEREB.idISnull;

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

SELECT*FROMAFULLJOINBONA.book_id=B.book_idWHEREA.idISnullORB.idISnull;

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

左连接和右连接的区别(数据库左右内外连接详细易懂)(7)


发表评论:

最近发表
网站分类
标签列表