【MySQL】数据库表连接简明解释

未经许可,不得转载。

表连接

在关系型数据库中,建模是数据组织的核心难点。数据库建模需要将数据关系理清,构建出适合存储和查询的结构。

所谓“模型”包括实体(entity)关系(relationship) 两部分。实体是指实际存在的对象,通常由一组相关属性组成;关系则描述了这些实体之间的联系,关系通常包括“一对一”“一对多”“多对多”等类型。

以下是一个生产系统的数据库建模设计示例:

img

在关系型数据库中,每个实体都有一张表,属性则作为表的字段。表与表之间根据关联字段“连接”起来,而表连接是关系型数据库的核心。

表连接的类型

表连接有多种类型:

  • 内连接(inner join)
  • 左连接(left join)
  • 右连接(right join)
  • 全连接(full join)

传统上,维恩图用于解释这些连接的区别,如下图所示:

在这里插入图片描述

其实,我们可以换一个角度来理解连接。表连接就是通过关联字段,将两张表的数据组合在一起。 问题在于,关联字段的值不总是匹配,比如表 A 包含"1"和"2",而表 B 包含"2"和"3",只有"2"在两表中匹配。

在这种情况下,一共有四种处理方法:

  1. 内连接(inner join):只返回匹配的记录。
  2. 左连接(left join):返回匹配的记录及表 A 中多余的记录。
  3. 右连接(right join):返回匹配的记录及表 B 中多余的记录。
  4. 全连接(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/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值