数据库中的左连接和右连接

              左连接和右连接算是比较简单的概念,但是有时候突然会忘记,有时候想起概念,但是没有实践结果可供观看,感觉也不深刻,故此记录一下。

               左连接和右连接简单的说:左连接只影响右表,右连接只影响左表。

mysql> select * from stu1;
+------+----------+
| num  | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
+------+----------+
2 rows in set (0.00 sec)

mysql> select * from stu2;
+------+---------+
| num  | name    |
+------+---------+
|    1 | wangwu  |
|    3 | zhaoliu |
+------+---------+
2 rows in set (0.00 sec)

mysql> select * from stu1 left join stu2 on (stu1.num=stu2.num);
+------+----------+------+--------+
| num  | name     | num  | name   |
+------+----------+------+--------+
|    1 | zhangsan |    1 | wangwu |
|    2 | lisi     | NULL | NULL   |
+------+----------+------+--------+
2 rows in set (0.00 sec)
mysql> select * from stu1 right join stu2 on (stu1.num=stu2.num);
+------+----------+------+---------+
| num  | name     | num  | name    |
+------+----------+------+---------+
|    1 | zhangsan |    1 | wangwu  |
| NULL | NULL     |    3 | zhaoliu |
+------+----------+------+---------+
2 rows in set (0.00 sec)

stu1左连接stu2,左连接只影响右表(这里右表是stu2),则左表中的数据全部返回,右表中的数据只返回满足条件的。

stu1右连接stu2,右连接只影响左表(这里的左表是stu1),则右表中的数据全部返回,左表中的数据只返回满足条件的。

实验结果一目了然。

 

<think>嗯,用户问的是数据库左连接连接的区别。首先我得确认自己对这些概念的理解是否正确。左连接连接都属于SQL中的连接连接不同,外连接会保留至少一个表中的所有记录,即使另一表中没有匹配的行。 左连接,也就是LEFT JOIN,应该是以左边的表为基础,返回左表的所有记录,即使表中没有匹配的行。这时候表中没有匹配的部分会用NULL填充。比如说,如果左表有10条数据,而表只有5条匹配,那么左连接的结果应该会有10条记录,其中5条有表的数据,剩下的5条表字段都是NULL。 连接,RIGHT JOIN,应该左连接相反,是以表为基础,保留表的所有记录,左表没有匹配的部分用NULL填充。同样的例子,如果表有10条数据,左表只有5条匹配,那么连接的结果会有10条记录,5条有左表数据,5条左表字段为NULL。 但是用户可能想知道它们的实际应用场景,比如什么时候用左连接,什么时候用连接。可能还需要提到两者在功能上是相对的,可以通过调换表的顺序来互换使用。例如,A LEFT JOIN B 其实可以转换为 B RIGHT JOIN A,这样可能更灵活。 不过需要注意,有些数据库系统可能对RIGHT JOIN的支持不如LEFT JOIN好,或者用户可能更习惯使用LEFT JOIN,因此在实际开发中左连接可能更常见。另外,外连接还有全外连接(FULL OUTER JOIN),但用户没问这个,暂时不需要展开。 还需要举一个例子来帮助理解。比如有两个表:员工表部门表。左连接可以查询所有员工及其所属部门,包括没有部门的员工;而连接可以查询所有部门及其员工,包括没有员工的部门。这样用户可能更容易明白两者的区别应用场景。 另外,可能需要注意ONWHERE子句在左连接连接中的使用区别,比如条件放在ON里WHERE里会导致不同的结果,因为ON是在连接时过滤,而WHERE是在连接后过滤。这可能是一个常见的误区,但用户的问题可能不需要深入到这里,不过如果有必要的话可以简单提一下。 总结来说,左连接保留左表所有数据,连接保留表所有数据,两者的主要区别在于保留哪个表的全部记录。同时,可以通过调换表的顺序来达到相同的结果,所以连接的使用可能较少,但了解其区别还是有必要的。</think>在数据库中,**左连接(LEFT JOIN)****连接(RIGHT JOIN)**是两种常见的外连接(Outer Join)操作,主要区别在于**保留哪个表的全部记录**,以及如何处理未匹配的数据。以下是它们的核心区别示例: --- ### **1. 左连接(LEFT JOIN)** - **定义**:以左表(`LEFT JOIN`左侧的表)为基准,返回左表的**所有记录**,即使表没有匹配的行。 - **未匹配时的处理**:表中没有匹配的字段会用 `NULL` 填充。 - **使用场景**:需要获取左表全部数据,同时关联表的补充信息(即使表可能不存在对应数据)。 **示例**: 假设有表 `员工表` `部门表`: ```sql SELECT * FROM 员工表 LEFT JOIN 部门表 ON 员工表.部门ID = 部门表.ID; ``` 结果会包含所有员工信息,即使某些员工没有所属部门(此时部门相关字段为 `NULL`)。 --- ### **2. 连接(RIGHT JOIN)** - **定义**:以表(`RIGHT JOIN`侧的表)为基准,返回表的**所有记录**,即使左表没有匹配的行。 - **未匹配时的处理**:左表中没有匹配的字段会用 `NULL` 填充。 - **使用场景**:需要获取表全部数据,同时关联左表的信息(即使左表可能不存在对应数据)。 **示例**: ```sql SELECT * FROM 员工表 RIGHT JOIN 部门表 ON 员工表.部门ID = 部门表.ID; ``` 结果会包含所有部门信息,即使某些部门没有员工(此时员工相关字段为 `NULL`)。 --- ### **3. 核心区别总结** | **特性** | 左连接(LEFT JOIN) | 连接(RIGHT JOIN) | |------------------|-----------------------------|-----------------------------| | **基准表** | 左表(`FROM`后的表) | 表(`JOIN`后的表) | | **保留数据** | 左表所有记录 | 表所有记录 | | **未匹配填充值** | 表字段为 `NULL` | 左表字段为 `NULL` | | **实际使用频率** | 较高(更直观) | 较低(可通过调换表顺序替代) | --- ### **4. 补充说明** - **功能等价性**:左连接连接可以相互替代,只需调换表顺序。例如: `A LEFT JOIN B` 等价于 `B RIGHT JOIN A`。 - **内连接(INNER JOIN)**:仅返回两表完全匹配的记录,与外连接形成对比。 - **全外连接(FULL OUTER JOIN)**:保留两表所有记录,未匹配部分用 `NULL` 填充(但并非所有数据库都支持)。 --- ### **直观示例** - **左连接**:查所有员工(包括未分配部门的员工)。 - **连接**:查所有部门(包括没有员工的部门)。 通过理解两者的方向性差异,可以更灵活地根据业务需求选择连接方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值