Mysql中左右连接需要注意的问题

Mysql中左右连接需要注意的问题

MySQL左连接时,有时会发现返回的记录条数比左边表数量多,这是为什么呢?
虽然大多情况下是这样:
count(table A left join table B) == count(table A) ,
但是,这个结论是错误的,因为一旦table B中有重复的数据时,最后的结果就可能比count(A)的数量多

举个例子:这里有两个表,结构如下

mysql> desc dep;
+--------+---------+------+-----+---------+----------------+
| Field  | Type    | Null | Key | Default | Extra          |
+--------+---------+------+-----+---------+----------------+
| id     | int(11) | NO   | PRI | NULL    | auto_increment |
| dep_no | int(11) | NO   |     | NULL    |                |
+--------+---------+------+-----+---------+----------------+
2 rows in set (0.03 sec)

mysql> desc list;
+----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | int(11)  | NO   | PRI | NULL    | auto_increment |
| dep_no   | int(11)  | NO   |     | NULL    |                |
| dep_name | char(20) | YES  |     | NULL    |                |
+----------+----------+------+-----+---------+----------------+
3 rows in set (0.02 sec)

向两个表中插入一些数据,如下:

mysql> **select * from dep;**
+----+--------+
| id | dep_no |
+----+--------+
|  1 |     11 |
|  2 |     12 |
|  3 |     13 |
|  5 |     14 |
+----+--------+
4 rows in set (0.01 sec)

mysql> select * from list;
+----+--------+----------+
| id | dep_no | dep_name |
+----+--------+----------+
|  1 |     11 | egg      |
|  2 |     12 | water    |
|  3 |     12 | water    |
|  4 |     13 | rice     |
|  5 |     14 | apple    |
+----+--------+----------+
5 rows in set (0.00 sec)

注意上面的list表中,id为2和3的记录其实是重复的,然后这时候进行左连接:

mysql> **select * from dep left join list on dep.dep_no = list.dep_no;**
+----+--------+------+--------+----------+
| id | dep_no | id   | dep_no | dep_name |
+----+--------+------+--------+----------+
|  1 |     11 |    1 |     11 | egg      |
|  2 |     12 |    2 |     12 | water    |
|  2 |     12 |    3 |     12 | water    |
|  3 |     13 |    4 |     13 | rice     |
|  5 |     14 |    5 |     14 | apple    |
+----+--------+------+--------+----------+
5 rows in set (0.01 sec)

左连接的结果是5条记录,而dep表只有四条记录,推翻了上面的结论,同样的,右连接同样如此。

结论:
  左连接和右连接 最终结果的记录数和左表或者右表记录条数不一定相同。
  左连接和右连接只是说以匹配的时候以哪个表为准进行搜索,左连接以左表为准,左表的每一条记录都会进行一次比较。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
左连接右连接是关系型数据库的连接操作,用于将两个或多个的数据进行关联。它们的区别在于返回的结果集包含哪些记录。 左连接(left join)返回包括的所有记录和右连接字段相等的记录。也就是说,左连接会返回的所有记录,而右没有匹配的记录则用NULL填充。这意味着左连接保留了的所有数据,而右没有匹配的数据则被忽略。\[1\] 右连接(right join)则返回包括右的所有记录和连接字段相等的记录。与左连接相反,右连接会返回右的所有记录,而没有匹配的记录则用NULL填充。右连接保留了右的所有数据,而没有匹配的数据则被忽略。\[1\] 在MySQL左连接右连接的语法如下: - 左连接:SELECT * FROM 1 LEFT JOIN 2 ON 1.字段 = 2.字段; - 右连接:SELECT * FROM 1 RIGHT JOIN 2 ON 1.字段 = 2.字段;\[3\] 需要注意的是,左连接右连接的结果集可能会有所不同,具体取决于的顺序和连接字段的匹配情况。因此,在使用左连接右连接时,需要根据实际需求选择合适的连接方式。 #### 引用[.reference_title] - *1* [秋招被问mysql左连接右连接的区别?](https://blog.csdn.net/weixin_45393094/article/details/108540750)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [数据库左连接右连接有什么区别](https://blog.csdn.net/weixin_30120123/article/details/113346016)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值