未经许可,不得转载。
表连接
在关系型数据库中,建模是数据组织的核心难点。数据库建模需要将数据关系理清,构建出适合存储和查询的结构。
所谓“模型”包括实体(entity) 和关系(relationship) 两部分。实体是指实际存在的对象,通常由一组相关属性组成;关系则描述了这些实体之间的联系,关系通常包括“一对一”“一对多”“多对多”等类型。
以下是一个生产系统的数据库建模设计示例:

在关系型数据库中,每个实体都有一张表,属性则作为表的字段。表与表之间根据关联字段“连接”起来,而表连接是关系型数据库的核心。
表连接的类型
表连接有多种类型:
- 内连接(inner join)
- 左连接(left join)
- 右连接(right join)
- 全连接(full join)
传统上,维恩图用于解释这些连接的区别,如下图所示:

其实,我们可以换一个角度来理解连接。表连接就是通过关联字段,将两张表的数据组合在一起。 问题在于,关联字段的值不总是匹配,比如表 A 包含"1"和"2",而表 B 包含"2"和"3",只有"2"在两表中匹配。
在这种情况下,一共有四种处理方法:
- 内连接(inner join):只返回匹配的记录。
- 左连接(left join):返回匹配的记录及表 A 中多余的记录。
- 右连接(right join):返回匹配的记录及表 B 中多余的记录。
- 全连接(full join):返回匹配的记录以及表 A 和表 B 各自的多余记录。
下图对比了这四种连接方式,直观易懂:

在上图中,表 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;
结合 WHERE 条件
这些查询还可以结合 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)
此外,还有一种特殊的连接称为交叉连接(cross join),即当表 A 和表 B 没有关联字段时,表 A 的每一条记录都会与表 B 的每一条记录配对生成新记录。若表 A 有 n 条记录,表 B 有 m 条记录,结果中将有 n * m 条记录,如下图所示:

参考链接:https://www.ruanyifeng.com/blog/2019/01/table-join.html
https://blog.jooq.org/say-no-to-venn-diagrams-when-explaining-joins/
510

被折叠的 条评论
为什么被折叠?



