左连接只匹配一条数据_图示数据库表连接,秒懂左连接,右连接,内连接...

Java识堂,一个高原创,高收藏,有干货的微信公众号,一起成长,一起进步,欢迎关注

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

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

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

e0b180397ff5e1bfd346185918bcf523.png

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

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

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

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

c941dbb271c507148f9309699fbda0c0.png
abcd0fbb6a6a6447baf0ac140332af8c.png
88edecfd686a285b8e247abe94cd81b2.png
c63ffe09e8dcec0558d88b024ab997f2.png

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

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

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

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

下图就是四种连接的图示。我觉得,这张图比维恩图更易懂,也更准确。

f370dbbd78dd75a721e58a7a05e7f1f4.png

上图中,表 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 ALEFT JOIN BON A.book_id=B.book_idWHERE B.id IS null;

另一个例子,返回表 A 或表 B 所有不匹配的记录。

SELECT * FROM AFULL JOIN BON A.book_id=B.book_idWHERE A.id IS null OR B.id IS null;

此外,还存在一种特殊的连接,叫做"交叉连接"(cross join),指的是表 A 和表 B 不存在关联字段,这时表 A(共有 n 条记录)与表 B (共有 m 条记录)连接后,会产生一张包含 n x m 条记录的新表(见下图)。

46db76e412321c2a86fb4ce91bdd65ae.png

作者:阮一峰

链接:http://www.ruanyifeng.com/blog/2019/01/table-join.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
dvwa的数据库连接不上的可能原因有几种。首先,你需要确保你可以进入http://localhost/phpmyadmin或连接上MySQL数据库,并且密码设置相同。如果不能连接,说明密码不一致,你需要设置相同密码,默认密码为空。其次,如果在点击Create/Reset Database按钮后提示"Could not connect to the database service. Please check the config file. Database Error #1045: Access denied for user 'dvwa'@'localhost' (using password: YES)",你需要按照图示修改config.inc.php文件。还有一种情况是,进入dvwa设置界面时出现红色字样导致无法创建数据库。这可能是由于allow_url_include参数被设置为Off所导致的,你需要将其改为On并重启Apache。如果这些方法都不能解决问题,你可以尝试在MySQL的my.ini文件中加入一条命令,保存后重启MySQL,再次刷新主页并连接数据库即可成功。以上内容参考了多个博主的经验,希望能够帮助到你解决问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [DVWA-master.zip](https://download.csdn.net/download/qq_39683062/11238752)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [dvwa无法连接数据库问题:Could not connect to the database service.](https://blog.csdn.net/weixin_45931082/article/details/121172093)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [解决dvwa连接不上数据库问题](https://blog.csdn.net/weixin_58441533/article/details/120619237)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值