关系型数据库表连接简单说明:最难的是建模
关系型数据库最难的就是建模。
复杂数据必须先进行建模,然后才能存储在数据库中。 所谓“模型”就是两个东西:实体+关系。
实体是指实际的对象,有自己的属性,可以理解为一些相关属性的容器。关系是实体之间的联系,通常可以分为“一对一”、“一对多”和“多对多”等类型。
在关系数据库中,每个实体都有自己的表(table),所有的属性都是这个表的字段(fields)。表根据连接的字段进行“连接”(join)。一起。因此,表连接是关系数据库的核心主题。
工作台连接分为不同类型。前面很多文章都用维恩图(两个圆的集合运算)来解释不同化合物之间的差异。
上周我读了一篇文章,认为有比维恩图更好的方法来解释它。我发现事实确实如此。从另一个角度看就更容易理解了。
所谓“联接”,就是将两张表根据相关字段组合成一个数据集。 问题是两个表中关联字段的值经常不一致。如果相关字段不匹配怎么办?例如,A表包含张三和李四,B表包含李四和王五,仅匹配到李四的一条记录。
很容易看出有四种处理方法。
- 仅返回两个表中匹配的记录,这称为内连接(内孔)。 1 1
- 返回表 A 和表 B 中的匹配记录和冗余记录。这就是所谓的完全加入(完全join)。
下图是四种化合物的示意图。我认为这张图比维恩图的更容易理解、更准确。
上图中,A表的记录为123,B表的记录为ABC,颜色表示对应关系。返回的结果中,如果另一个表中没有匹配的记录,则用零填充。
这四种类型的贡献可以分为两类:内部贡献(内孔)意味着它们只包含匹配的记录,而外部贡献(外孔)意味着它们也包含不匹配的记录。因此,左连接、右连接、全连接都是外连接。
这四个连接的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
FULL JOIN B
ON A.book_id=B.book_id
WHERE A.id IS null OR B.id IS null;
此外,还有一种特殊的连接,叫做“交叉连接”(Cross Kongus),即A表和B表没有相关字段。此时,A表(共n条记录)和B表(共m条记录)连接后,生成了一个n x m条记录的新表(见下图)。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。