【Java 开发日记】SQL 语句左连接右连接内连接如何使用,区别是什么?

目录

核心概念

内连接 (INNER JOIN)

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

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

全外连接 (FULL OUTER JOIN)

总结与区别

记忆技巧


核心概念

连接(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;

查询结果

|------|-----------------|
| 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;

查询结果

|------|-----------------|
| 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;

查询结果

|------|-----------------|
| 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;

查询结果

|------|-----------------|
| name | department_name |
| 张三 | 技术部 |
| 李四 | 销售部 |
| 王五 | NULL |
| NULL | 市场部 |

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

总结与区别

|----------|-------------------|------------------------------|---------------------------------------|
| 连接类型 | 关键字 | 描述 | 结果集(基于示例) |
| 内连接 | INNER JOIN | 只返回两个表匹配的记录。 | 张三(技术部), 李四(销售部) |
| 左连接 | LEFT JOIN | 返回左表全部 记录 + 右表匹配的记录。 | 张三(技术部), 李四(销售部), 王五(NULL) |
| 右连接 | RIGHT JOIN | 返回右表全部 记录 + 左表匹配的记录。 | 张三(技术部), 李四(销售部), NULL(市场部) |
| 全外连接 | FULL OUTER JOIN | 返回左右两表全部记录。 | 张三(技术部), 李四(销售部), 王五(NULL), NULL(市场部) |

记忆技巧

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

如果小假的内容对你有帮助,请点赞评论收藏。创作不易,大家的支持就是我坚持下去的动力!

相关推荐
凯尔萨厮5 分钟前
Java学习笔记十五(GUI)
java·笔记·学习
星云API技术支持8 分钟前
企业微信二次开发外部群:群聊数据与联系人信息如何建立关联
数据库·php·企业微信
磐链科技9 分钟前
区块链开发入门实战:用 Hardhat 与 Ethers.js 搭建你的第一个 DApp
开发语言·javascript·区块链
我不是程序员三三10 分钟前
桌面管理软件哪个最好?从一次上线翻车事故,拆解选型评估与配置落地全流程
数据库
落木萧萧82513 分钟前
MyBatis 关联查询的四种写法,为什么最后都变回了手写 XML
java·数据库·后端
csdn2015_13 分钟前
java springboot项目,接收到的参数多个逗号
java·开发语言·spring boot
cui_hao_nan14 分钟前
Spring AOP 自调用、代理与 private 方法引发的诡异 NPE
java·后端·spring·ai开发
春风解人意18 分钟前
从零开始学习嵌入式P35----数据库
数据库·嵌入式硬件·学习
sunoo-22919 分钟前
【网络编程 + 数据库】select 与 epoll 核心区别详解 + SQLite 入门到 C 接口全攻略
linux·网络·数据库·vscode·学习·sqlite
TDengine (老段)20 分钟前
TDengine 错误处理 — 错误码、异常传播、故障恢复
大数据·数据库·物联网·时序数据库·tdengine·涛思数据