<li id="2aw4k"></li>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
    <center id="2aw4k"><small id="2aw4k"></small></center><center id="2aw4k"><small id="2aw4k"></small></center>
    首页»数据库»数据库表连接的简单解释

    数据库表连接的简单解释

    来源:阮一峰 发布时间:2019-01-16 阅读次数:

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

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

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

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

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

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

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

    上周,我读到一篇文章,认为还有比维恩?#20960;?#22909;的解释方式。我发现确?#31561;?#27492;,换一个角度解释,更容易懂。

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

    很容易看出,?#36824;?#26377;四种处理方法。

    • 只返回两张表匹配的记录,这叫内连接(inner join)。
    • 返回匹配的记录,以及表 A 多余的记录,这叫左连接(left join)。
    • 返回匹配的记录,以及表 B 多余的记录,这叫右连接(right join)。
    • 返回匹配的记录,以及表 A 和表 B 各自的多余记录,这叫全连接(full join)。

    下图就是四种连接的?#38469;尽?#25105;觉得,这张图比维恩?#20960;?#26131;懂,也更准确。

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

    这四种连接,又可以分成两大类:内连接(inner join)表示只包含匹配的记录,外连接(outer join)表示还包含不匹配的记录。所以,左连接、右连接、全连接?#38469;?#20110;外连接。

    这四种连接的 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 条记录的新表(见下图)。

    (完)

    QQ群:WEB开发者官方群(515171538),验证消息:10000
    微信群:?#26377;?#32534;微信 849023636 邀请您加入,验证消息:10000
    提示:更多精彩内容关注微信公众号:全栈开发者中?#27169;╢sder-com)
    网友评论(共0条评论) 正在载入评论......
    理智评论文明上网,拒绝恶意谩骂 发表评论 / 共0条评论
    登录会员中心
    大乐透彩票预测
    <li id="2aw4k"></li>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
    <center id="2aw4k"><small id="2aw4k"></small></center><center id="2aw4k"><small id="2aw4k"></small></center>
    <li id="2aw4k"></li>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
    <center id="2aw4k"><small id="2aw4k"></small></center><center id="2aw4k"><small id="2aw4k"></small></center>