数据库表链接的简单解释

转自 http://www.ruanyifeng.com/blog/2019/01/table-join.htmlhtml

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

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

实体指的是那些实际的对象,带有本身的属性,能够理解成一组相关属性的容器。关系就是实体之间的联系,一般能够分红"一对一"、"一对多"和"多对多"等类型。3d

在关系型数据库里面,每一个实体有本身的一张表(table),全部属性都是这张表的字段(field),表与表之间根据关联字段"链接"(join)在一块儿。因此,表的链接是关系型数据库的核心问题。code

表的链接分红好几种类型。htm

  • 内链接(inner join)
  • 外链接(outer join)
  • 左链接(left join)
  • 右链接(right join)
  • 全链接(full join)

之前,不少文章采用维恩图(两个圆的集合运算),解释不一样链接的差别。对象

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

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

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

  • 只返回两张表匹配的记录,这叫内链接(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 条记录的新表(见下图)。

相关文章
相关标签/搜索