SQL 语句左连接右连接内连接如何使用,区别是什么?

简介: 我是小假 期待与你的下一次相遇 ~


核心概念

连接(JOIN)用于根据两个或多个表中的列之间的关系,从这些表中查询数据。为了更直观地理解,我们假设有两个表:

员工表 (Employees)

employee_id

name

department_id

1

张三

101

2

李四

102

3

王五

NULL

部门表 (Departments)

department_id

department_name

101

技术部

102

销售部

103

市场部

内连接 (INNER JOIN)

定义:只返回两个表中连接条件匹配的记录。

结果:两个表的交集部分。

使用场景:当你只想查看在两边表中都有对应信息的记录时。例如,查询所有有部门的员工及其部门信息。

SQL语句

SELECT 
    e.name,
    d.department_name
FROM 
    Employees e
INNER JOIN 
    Departments d ON e.department_id = d.department_id;

image.gif

查询结果

name

department_name

张三

技术部

李四

销售部

注意:员工“王五”的department_id为NULL,在部门表中找不到匹配项,所以没有出现。部门“市场部”在员工表中没有对应的员工,所以也没有出现。

左外连接 (LEFT JOIN / LEFT OUTER JOIN)

定义:返回左表 (FROM子句中的表) 的所有记录,以及右表中连接条件匹配的记录。如果右表没有匹配的记录,则结果集中右表的部分返回NULL。

结果:左表的全集 + 右表的匹配部分。

使用场景:当你需要左表的所有记录,无论它们在右表中是否有对应项。例如,列出所有员工,并显示他们所在的部门(即使某些员工没有部门)。

SQL语句

SELECT 
    e.name,
    d.department_name
FROM 
    Employees e
LEFT JOIN 
    Departments d ON e.department_id = d.department_id;

image.gif

查询结果

name

department_name

张三

技术部

李四

销售部

王五

NULL

注意:员工“王五”被包含在结果中,但因为他不属于任何部门,所以department_name为NULL。

右外连接 (RIGHT JOIN / RIGHT OUTER JOIN)

定义:与左连接相反。返回右表 (JOIN子句中的表) 的所有记录,以及左表中连接条件匹配的记录。如果左表没有匹配的记录,则结果集中左表的部分返回NULL。

结果:右表的全集 + 左表的匹配部分。

使用场景:当你需要右表的所有记录,无论它们在左表中是否有对应项。例如,列出所有部门,并显示部门里的员工(即使某些部门没有员工)。

SQL语句

SELECT 
    e.name,
    d.department_name
FROM 
    Employees e
RIGHT JOIN 
    Departments d ON e.department_id = d.department_id;

image.gif

查询结果

name

department_name

张三

技术部

李四

销售部

NULL

市场部

注意:部门“市场部”被包含在结果中,但因为该部门没有员工,所以name为NULL。

全外连接 (FULL OUTER JOIN)

定义:返回左表和右表中的所有记录。当某一行在另一个表中没有匹配行时,另一个表的部分将返回NULL。如果表之间有匹配的行,则返回匹配行。

结果:两个表的并集

使用场景:当你需要看到两个表的所有数据,无论它们是否匹配。例如,生成一个包含所有员工和所有部门的完整列表。

SQL语句

-- 注意:MySQL不支持FULL OUTER JOIN,但可用LEFT JOIN和RIGHT JOIN的UNION来实现
SELECT 
    e.name,
    d.department_name
FROM 
    Employees e
LEFT JOIN 
    Departments d ON e.department_id = d.department_id
UNION
SELECT 
    e.name,
    d.department_name
FROM 
    Employees e
RIGHT JOIN 
    Departments d ON e.department_id = d.department_id;

image.gif

查询结果

name

department_name

张三

技术部

李四

销售部

王五

NULL

NULL

市场部

注意:这个结果包含了左连接和右连接的所有记录。

总结与区别

连接类型

关键字

描述

结果集(基于示例)

内连接

INNER JOIN

只返回两个表匹配的记录。

张三(技术部), 李四(销售部)

左连接

LEFT JOIN

返回左表全部记录 + 右表匹配的记录。

张三(技术部), 李四(销售部), 王五(NULL)

右连接

RIGHT JOIN

返回右表全部记录 + 左表匹配的记录。

张三(技术部), 李四(销售部), NULL(市场部)

全外连接

FULL OUTER JOIN

返回左右两表全部记录。

张三(技术部), 李四(销售部), 王五(NULL), NULL(市场部)

记忆技巧

可以借助韦恩图 (Venn Diagram) 来记忆:

image.gif

相关文章
|
7月前
|
存储 人工智能 自然语言处理
构建AI智能体:二十三、RAG超越语义搜索:如何用Rerank模型实现检索精度的大幅提升
本文介绍了重排序(Rerank)技术在检索增强生成(RAG)系统中的应用。Rerank作为初始检索和最终生成之间的关键环节,通过交叉编码器对初步检索结果进行精细化排序,筛选出最相关的少量文档提供给大语言模型。相比Embedding模型,Rerank能更精准理解查询-文档的语义关系,显著提高答案质量,降低Token消耗。文章详细比较了BGE-Rerank和CohereRerank等主流模型,并通过代码示例展示了Rerank在解决歧义查询(如区分苹果公司和水果)上的优势。
1950 5
【HarmonyOS Next】状态管理V2版本使用详解
现阶段状态管理V2版本还在试用阶段,但是切实解决了很多在项目中使用V1导致的痛点问题,比如: * 同一数据被多视图代理时,无法同步数据修改。 * 无法做到深度观测和深度监听。 * 更新对象中某个数据时,会导致整个对象属性都刷新,导致程序运行缓慢。
588 4
【HarmonyOS Next】状态管理V2版本使用详解
|
人工智能 边缘计算 监控
AI视频监控在大型商场的技术方案
该系统通过人脸分析模块利用FaceNet等模型提取顾客的性别、年龄和表情特征,快速生成群体画像。隐私保护模块采用匿名化技术和实时模糊处理,确保数据安全,并通过边缘计算减少隐私泄露风险。数据可视化与报告功能自动生成统计报告,支持服务优化和营销决策。核心技术包括高精度的人脸分析模型、全面的隐私保护措施及直观的数据可视化工具。
303 0
AI视频监控在大型商场的技术方案
|
存储 消息中间件 前端开发
工厂人员定位管理系统架构设计:构建一个高效、可扩展的人员精确定位
本文将深入探讨工厂人员定位管理系统的架构设计,详细解析前端展示层、后端服务层、数据库设计、通信协议选择等关键环节,并探讨如何通过微服务架构实现系统的可扩展性和稳定性。
552 10
|
监控 测试技术 开发者
单元测试问题之单元测试的工作量,如何评估
单元测试问题之单元测试的工作量,如何评估
|
图形学 C# 开发者
Unity粒子系统全解析:从基础设置到高级编程技巧,教你轻松玩转绚丽多彩的视觉特效,打造震撼游戏画面的终极指南
【8月更文挑战第31天】粒子系统是Unity引擎的强大功能,可创建动态视觉效果,如火焰、爆炸等。本文介绍如何在Unity中使用粒子系统,并提供示例代码。首先创建粒子系统,然后调整Emission、Shape、Color over Lifetime等模块参数,实现所需效果。此外,还可通过C#脚本实现更复杂的粒子效果,增强游戏视觉冲击力和沉浸感。
1716 1
|
存储 NoSQL 算法
使用图数据库进行复杂数据建模:探索数据关系的无限可能
【8月更文挑战第17天】图数据库以其高效的关系查询能力、直观的数据表示方式、灵活的数据模型和强大的可扩展性,在复杂数据建模和查询中展现出了巨大的潜力。随着大数据和人工智能技术的不断发展,图数据库的应用领域也将不断拓展和深化。对于需要处理复杂关系网络和数据关联性的场景来说,图数据库无疑是一个值得深入研究和应用的强大工具。
|
分布式计算 Hadoop Java
|
Kubernetes 网络安全 容器
k8s - WEB终端(gotty)
搭建K8S私有云之后,我们需要在私有云上提供一种能力,让研发可以直接登录容器,参看容器或者应用程序当前的状态。研发人员不可直接登录宿主主机,登录宿主主机属于危险操作。 WEB终端的话,推荐使用gotty: github 地址: https://github.
4792 0
|
存储 Java 数据库
SpringBoot使用jasypt实现数据库配置加密
这样,你就成功地使用Jasypt实现了Spring Boot中的数据库配置加密,确保敏感信息在配置文件中以加密形式存储,并在应用启动时自动解密。
1230 2