inner join,left join,right join

本文详细解释了SQL中的三种联接类型:LEFT JOIN、RIGHT JOIN和INNER JOIN的区别及应用场景。通过具体的示例,展示了每种联接如何处理两个表之间的数据结合,帮助读者更好地理解和运用这些SQL联接技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

二、示例

A表:

aId                   aName

1                      name1

2                      name2

3                      name3

4                      name4

5                      name5

B表:

bId                   bAddr

1                      addr1

2                      addr2

3                      addr3

4                      addr4

6                      addr6

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

结果:

aID    aName                 bID     bName
1     name1        1        addr1
2     name2        2        addr2
3     name3        3        addr3
4     name4        4        addr4
5     name5       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    aName                 bID     bName
1     name1        1        addr1
2     name2        2        addr2
3     name3        3        addr3
4     name4        4        addr4
NULL   NULL          6          addr6

结果说明:

影响行数为5行。

仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充。

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

结果:

aID    aName                 bID     bName
1     name1        1        addr1
2     name2        2        addr2
3     name3        3        addr3
4     name4        4        addr4

结果说明:

影响行数为4行。

很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录。产生的结果集是A表与B表的交集。若使用FULL [OUTER] JOIN得到的就是A表与B表的并集。

 

### 不同SQL连接类型的使用场景及区别 #### 1. **INNER JOIN** `INNER JOIN` 返回两个表中满足连接条件的所有记录。这意味着只有当两张表中的数据匹配时,才会被包含在最终的结果集中。 例如,在一个员工信息表 `employee` 和部门信息表 `department` 中,如果希望获取所有有对应部门的员工信息,则可以使用如下语句: ```sql SELECT employee.name, department.department_name FROM employee INNER JOIN department ON employee.department_id = department.id; ``` 此查询仅会返回那些存在有效部门编号的员工记录[^1]。 #### 2. **LEFT JOIN** `LEFT JOIN`(或称为左外连接)返回左表中的所有记录以及右表中与之相匹配的数据;如果没有找到对应的匹配项,则右侧字段填充为 NULL 值。 继续以上述例子为例,如果我们想查看所有的员工及其所属部门名称,即使某些员工尚未分配到任何部门也可以显示出来,那么应该这样写: ```sql SELECT employee.name, department.department_name FROM employee LEFT JOIN department ON employee.department_id = department.id; ``` 这里即使是未指定具体部门的雇员也会被列入结果列表之中,并且其关联的部门名会被设为空值(NULL)[^4]。 #### 3. **RIGHT JOIN** 相对于`LEFT JOIN`, `RIGHT JOIN`(即右外联接)的作用正好相反——它保留的是右边那个关系里的全部元组再加上左边能配对上的部分;对于无法实现映射的情况同样给予null处理。 假设现在需求变成要找出每一个部门里有哪些成员加入进来或者暂时还没有人员编入该科室的话就可以采用这种方式来构建我们的检索命令: ```sql SELECT employee.name, department.department_name FROM employee RIGHT JOIN department ON employee.department_id = department.id; ``` 在这个情况下,即便某个特定分部当前没有任何职员隶属其间,这个单位依旧会在输出报表里面体现出来只是相关人员姓名处标注缺失状态(null卡位替代实际名字呈现形式)[^4]. --- ### 总结对比三者主要差异点在于它们如何对待不完全一致的数据集组合情况下的表现特征上做了区分设定从而适应不同的业务逻辑要求下产生的多样化应用场景需求分析结论得出各自适用范围如下所示图表概括表达清楚明了便于理解记忆掌握要点快速定位解决问题所在位置提高工作效率减少错误发生几率提升整体项目质量水平达到预期目标效果最佳化方案设计思路框架结构搭建完成任务执流程顺利推进达成共识统一动方向指引明确路径清晰可见成果显著可观测性强反馈及时调整优化持续改进不断进步成长壮大企业核心竞争力增强市场占有率扩大品牌影响力加深客户满意度增加忠诚度维护长期合作关系稳定健康发展态势良好可持续发展能力强抗风险能力突出优势明显领先同竞争者占据有利地位赢得先机抢占市场份额主导权掌控全局局势运筹帷幄决胜千里之外成就辉煌伟业共创美好未来! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值