inner join、left join、right join 之间的区别

本文详细解析了SQL左join、rightjoin和innerjoin的区别,通过实际案例对比,左连接保留左表所有记录,右连接展示右表完整并填充NULL,内连接仅显示匹配的行。通过A表与B表的联接操作进行详细说明。

一、sql的left join 、right join 、inner join之间的区别

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
  right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
  inner join(等值连接) 只返回两个表中联结字段相等的行

举例如下:

表A记录如下:
aID     aNum
1     a20050111
2     a20050112
3     a20050113
4     a20050114
5     a20050115

表B记录如下:
bID     bName
1     2006032401
2     2006032402
3     2006032403
4     2006032404
8     2006032408


1.left join
sql语句如下:
select * from A
left join B
on A.aID = B.bID

结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
5     a20050115    NULL     NULL

(所影响的行数为 5 行)
结果说明:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.

2.right join
sql语句如下:
select * from A
right join B
on A.aID = B.bID

结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404
NULL     NULL     8     2006032408

(所影响的行数为 5 行)
结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.

3.inner join
sql语句如下:
select * from A
innerjoin B
on A.aID = B.bID

结果如下:
aID     aNum     bID     bName
1     a20050111    1     2006032401
2     a20050112    2     2006032402
3     a20050113    3     2006032403
4     a20050114    4     2006032404

结果说明:
很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.

转载于博客园用户【十七年的夏天】侵删

https://www.cnblogs.com/assasion/p/7768931.html

<think>首先,用户的问题是关于SQL中不同JOIN类型的区别,具体是INNER JOINLEFT JOINRIGHT JOIN。我需要基于提供的引用内容来回答,确保回答真实可靠。 引用内容总结: - 引用[1]:区分了INNER JOINLEFT JOINRIGHT JOIN在返回结果、数量记录属性上的不同。 - 引用[2]:介绍了LEFT JOIN的原理、语法使用示例。 - 引用[3]:详细解释了INNER JOINLEFT JOIN区别用法。 - 引用[4]:强调了INNER JOIN只返回完全匹配的行,而LEFT JOIN保留左表所有记录。 - 引用[5]:提到了如何选择JOIN类型,包括获取左表独有数据的示例。 系统级指令: - 所有行内数学表达式必须用$...$格式,但这个问题是关于SQL的,没有数学表达式,所以可能不需要。 - 独立公式用$$...$$,同样不适用。 - LaTeX语法正确:不相关。 - 使用中文回答:是的。 - 生成相关问题:在回答结束后,添加相关问题部分。 - 回答中引用的段落末尾自然地添加引用标识:例如[^1]。 - 回答结构清晰:帮助用户逐步解决问题。 - 用户可见层:确保回答真实可靠。 回答结构: 1. **引言**:简要介绍JOINSQL中的作用。 2. **逐步解释每种JOIN类型**: - INNER JOIN:定义、返回结果、示例。 - LEFT JOIN:定义、返回结果、示例。 - RIGHT JOIN:定义、返回结果、示例。 3. **比较区别**:使用表格或列表形式清晰展示区别。 4. **总结**:何时使用哪种JOIN。 5. **相关问题**:生成几个相关问题。 引用标识: - 在解释每种JOIN时,引用相关段落末尾添加[^n]。 内容基于引用: - INNER JOIN:只返回两个表中匹配的行。如果不匹配,则丢弃。[^1][^3][^4] - LEFT JOIN:返回左表所有记录右表匹配的记录。不匹配时,右表字段用NULL填充。[^1][^2][^3] - RIGHT JOIN:返回右表所有记录左表匹配的记录。不匹配时,左表字段用NULL填充。[^1] 区别总结: - 返回结果:INNER JOIN返回交集;LEFT JOIN返回左表全部加匹配;RIGHT JOIN返回右表全部加匹配。 - 数量:INNER JOIN数量小于等于两表;LEFT JOIN数量等于左表;RIGHT JOIN数量等于右表。[^1] - 记录属性:不匹配部分,INNER JOIN丢弃;LEFT JOINRIGHT JOIN用NULL填充。[^1] 生成相关问题: - 例如:1. 如何选择INNER JOINLEFT JOIN? 2. FULL OUTER JOIN是什么? 3. JOIN操作在性能上的考虑? 确保回答真实可靠:基于提供的引用,不添加额外假设。</think>### SQLINNER JOINLEFT JOINRIGHT JOIN区别SQL中,JOIN操作用于连接两个或多个表,基于共同列(如主键外键)返回数据。INNER JOINLEFT JOINRIGHT JOIN是最常用的三种类型,它们在返回结果、记录数量属性处理上有显著差异。下面我将逐步解释每种JOIN的工作原理、区别适用场景,确保回答基于可靠引用。 #### 1. **INNER JOIN(内连接)** - **定义**:INNER JOIN只返回两个表中**联结字段完全匹配的行**。如果某行在左表或右表中没有匹配项,该行会被丢弃。 - **返回结果**:结果是两个表的**交集**部分。例如,表A表B的INNER JOIN,仅返回AB中键值相等的记录。 - **记录数量**:结果行数**小于或等于**左表右表的记录数(具体取决于匹配情况)[^1][^3][^4]。 - **属性处理**:不匹配的记录直接被舍弃,不会出现在结果中[^1][^4]。 - **示例语法**: ```sql SELECT * FROM table1 INNER JOIN table2 ON table1.key = table2.key; ``` 假设`table1`有ID为1,2,3的记录,`table2`有ID为2,3,4的记录。INNER JOIN只返回ID=2ID=3的行。 #### 2. **LEFT JOIN(左连接)** - **定义**:LEFT JOIN返回**左表的所有记录**,以及右表中**联结字段匹配的记录**。如果右表无匹配,则右表字段用NULL填充。 - **返回结果**:结果包括左表全部数据 + 右表匹配数据(相当于左表的“全集”加右表匹配部分)[^1][^2][^3]。 - **记录数量**:结果行数**等于左表的记录数**(无论右表是否有匹配)[^1][^2]。 - **属性处理**:右表不匹配时,相关字段用**NULL**填充,确保左表记录不丢失[^1][^3][^4]。 - **示例语法**: ```sql SELECT * FROM table1 LEFT JOIN table2 ON table1.key = table2.key; ``` 同上例,LEFT JOIN返回左表所有ID(1,2,3),其中ID=1在右表无匹配,因此右表字段为NULL。 #### 3. **RIGHT JOIN(右连接)** - **定义**:RIGHT JOIN返回**右表的所有记录**,以及左表中**联结字段匹配的记录**。如果左表无匹配,则左表字段用NULL填充。 - **返回结果**:结果包括右表全部数据 + 左表匹配数据(相当于右表的“全集”加左表匹配部分)[^1][^2]。 - **记录数量**:结果行数**等于右表的记录数**(无论左表是否有匹配)[^1]。 - **属性处理**:左表不匹配时,相关字段用**NULL**填充,确保右表记录不丢失[^1][^4]。 - **示例语法**: ```sql SELECT * FROM table1 RIGHT JOIN table2 ON table1.key = table2.key; ``` 同上例,RIGHT JOIN返回右表所有ID(2,3,4),其中ID=4在左表无匹配,因此左表字段为NULL。 #### 关键区别总结 下表对比了三者的核心差异(基于引用[^1][^3][^4]): | **特性** | **INNER JOIN** | **LEFT JOIN** | **RIGHT JOIN** | |----------------|-----------------------------|-----------------------------|-----------------------------| | **返回结果** | 仅匹配行(交集) | 左表全部 + 右表匹配 | 右表全部 + 左表匹配 | | **记录数量** | ≤ min(左表, 右表) | = 左表记录数 | = 右表记录数 | | **属性处理** | 不匹配行丢弃 | 右表不匹配时用NULL填充 | 左表不匹配时用NULL填充 | | **适用场景** | 需要精确匹配时(如订单-商品)| 保留左表所有数据时(如用户-订单)| 保留右表所有数据时(如日志-用户) | #### 何时使用哪种JOIN? - 使用**INNER JOIN**:当只需两表完全匹配的数据时(例如,查询已支付的订单及其商品详情)[^3][^4]。 - 使用**LEFT JOIN**:当需保留左表所有记录,即使右表无匹配时(例如,列出所有用户及其订单,包括未下单用户)[^2][^5]。 - 使用**RIGHT JOIN**:当需保留右表所有记录,即使左表无匹配时(例如,列出所有产品及其销售记录,包括未销售产品)[^1]。RIGHT JOIN较少用,通常可用LEFT JOIN通过调换表顺序实现[^5]。 总之,选择JOIN类型取决于业务需求:INNER JOIN用于精确匹配,LEFT/RIGHT JOIN用于保留某侧全集。实践中,LEFT JOIN更常见,因为它能处理主表数据完整性[^2][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值