inner join&left join&right join的区别?

本文详细介绍了SQL中的四种连接方式:内连接、左连接、右连接和全连接,并通过具体示例进行说明,帮助读者理解不同连接方式的特点及应用场景。

今天复习了一下多表查询,简单做个笔记。

下面这个图很清楚的描述了各连接方式的区别:    

举个例子来了解有两张表,student、score,字段如下:

    


一、inner join(内连接,等同于等值连接)

      1、inner join :

          select stu.sname as 姓名, s.subject as 科目, s.grade as 分数 from student stu inner join score s on stu.sid = s.sid;

      2、等值连接:

          select stu.sname as 姓名, s.subject as 科目, s.grade as 分数 from student stu, score s where stu.sid = s.sid;

效果是一样的:

   


二、left join(左连接:包含左子表的全部记录)

select stu.sname as 姓名, s.subject as 科目, s.grade as 分数 from student stu left join score s on stu.sid = s.sid;



三、right join(右连接:包含右子表的全部记录)

select stu.sname as 姓名, s.subject as 科目, s.grade as 分数 from student stu right join score s on stu.sid = s.sid;



四、full join(全连接:包含左右子表的全部记录)

select stu.sname as 姓名, s.subject as 科目, s.grade as 分数 from student stu full join score s on stu.sid = s.sid;



要注意的:在MySQL中并不支持全连接,但是我们可以使用union(会自动去除重复字段),将左右子表联合起来构造全连接,例如

select stu.sname as 姓名, s.subject as 科目, s.grade as 分数 from student stu left join score s on stu.sid = s.sid
union
select stu.sname as 姓名, s.subject as 科目, s.grade as 分数 from student stu right join score s on stu.sid = s.sid;

这个效果跟上面的full join是一样的。


<think>首先,用户的问题是关于SQL中不同JOIN类型的区别,具体是INNER JOIN、LEFT JOINRIGHT JOIN。我需要基于提供的引用内容来回答,确保回答真实可靠。 引用内容总结: - 引用[1]:区分了INNER JOIN、LEFT JOINRIGHT JOIN在返回结果、数量记录属性上的不同。 - 引用[2]:介绍了LEFT JOIN的原理、语法使用示例。 - 引用[3]:详细解释了INNER JOINLEFT JOIN区别用法。 - 引用[4]:强调了INNER JOIN只返回完全匹配的行,而LEFT JOIN保留左表所有记录。 - 引用[5]:提到了如何选择JOIN类型,包括获取左表独有数据的示例。 系统级指令: - 所有行内数学表达式必须用$...$格式,但这个问题是关于SQL的,没有数学表达式,所以可能不需要。 - 独立公式用$$...$$,同样不适用。 - LaTeX语法正确:不相关。 - 使用中文回答:是的。 - 生成相关问题:在回答结束后,添加相关问题部分。 - 回答中引用的段落末尾自然地添加引用标识:例如[^1]。 - 回答结构清晰:帮助用户逐步解决问题。 - 用户可见层:确保回答真实可靠。 回答结构: 1. **引言**:简要介绍JOIN在SQL中的作用。 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>### SQL中INNER JOIN、LEFT JOINRIGHT JOIN区别 在SQL中,JOIN操作用于连接两个或多个表,基于共同列(如主键外键)返回数据。INNER JOIN、LEFT 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、付费专栏及课程。

余额充值