SQL 中的 JOIN:INNER、LEFT、RIGHT、FULL、Cross、Self 和 Natural Join

ops/2025/1/13 14:51:10/

在 SQL 中,JOIN 操作用于根据相关列将两个或多个表中的数据组合在一起。JOIN 是关系数据库中非常重要的概念,因为它允许我们从多个表中提取相关数据。本文将介绍 SQL 中的不同 JOIN 类型

什么是 JOIN?

JOIN 是一种 SQL 操作符,用于根据相关列将两个或多个表中的数据行组合在一起。在数据库设计中,数据通常分散在多个表中,通过 JOIN 操作可以将这些表中的数据组合起来,以便进行查询和分析。

INNER JOIN

定义

INNER JOIN 返回两个表中匹配的行。如果两个表中没有匹配的行,则不会在结果集中显示。

语法

sql">SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;

示例

假设我们有两个表:EmployeesDepartments

sql">-- Employees 表
EmployeeID | Name      | DepartmentID
-------------------------------------
1          | John Doe  | 1
2          | Jane Smith| 2
3          | Sam Brown | 3-- Departments 表
DepartmentID | DepartmentName
-----------------------------
1            | HR
2            | IT
4            | Finance

使用 INNER JOIN:

sql">SELECT e.EmployeeID, e.Name, d.DepartmentName
FROM Employees e
INNER JOIN Departments d
ON e.DepartmentID = d.DepartmentID;

结果:

sql">EmployeeID | Name       | DepartmentName
----------------------------------------
1          | John Doe   | HR
2          | Jane Smith | IT

在这个示例中,只有在 EmployeesDepartments 表中都有匹配 DepartmentID 的行才会出现在结果集中。

LEFT JOIN

定义

LEFT JOIN(或 LEFT OUTER JOIN)返回左表中的所有行,即使在右表中没有匹配的行。对于在右表中没有匹配的行,结果集中包含 NULL 值。

语法

sql">SELECT columns
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;

示例

使用相同的表:

sql">SELECT e.EmployeeID, e.Name, d.DepartmentName
FROM Employees e
LEFT JOIN Departments d
ON e.DepartmentID = d.DepartmentID;

结果:

sql">EmployeeID | Name       | DepartmentName
----------------------------------------
1          | John Doe   | HR
2          | Jane Smith | IT
3          | Sam Brown  | NULL

在这个示例中,所有 Employees 表中的行都会出现在结果集中,即使它们在 Departments 表中没有匹配的 DepartmentID

RIGHT JOIN

定义

RIGHT JOIN(或 RIGHT OUTER JOIN)返回右表中的所有行,即使在左表中没有匹配的行。对于在左表中没有匹配的行,结果集中包含 NULL 值。

语法

sql">SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;

示例

使用相同的表:

sql">SELECT e.EmployeeID, e.Name, d.DepartmentName
FROM Employees e
RIGHT JOIN Departments d
ON e.DepartmentID = d.DepartmentID;

结果:

sql">EmployeeID | Name       | DepartmentName
----------------------------------------
1          | John Doe   | HR
2          | Jane Smith | IT
NULL       | NULL       | Finance

在这个示例中,所有 Departments 表中的行都会出现在结果集中,即使它们在 Employees 表中没有匹配的 DepartmentID

FULL JOIN

定义

FULL JOIN(或 FULL OUTER JOIN)返回左表和右表中的所有行。如果在左表或右表中没有匹配的行,结果集中包含 NULL 值。

语法

sql">SELECT columns
FROM table1
FULL JOIN table2
ON table1.column = table2.column;

示例

使用相同的表:

sql">SELECT e.EmployeeID, e.Name, d.DepartmentName
FROM Employees e
FULL JOIN Departments d
ON e.DepartmentID = d.DepartmentID;

结果:

sql">EmployeeID | Name       | DepartmentName
----------------------------------------
1          | John Doe   | HR
2          | Jane Smith | IT
3          | Sam Brown  | NULL
NULL       | NULL       | Finance

在这个示例中,所有 EmployeesDepartments 表中的行都会出现在结果集中,即使它们在另一表中没有匹配的 DepartmentID

CROSS JOIN

定义

CROSS JOIN 返回两个表的笛卡尔积,即每个表的每一行与另一个表的每一行组合在一起。CROSS JOIN 通常在没有 WHERE 子句的情况下使用,会生成非常大的结果集。

语法

sql">SELECT columns
FROM table1
CROSS JOIN table2;

示例

假设我们有两个表:EmployeesDepartments

sql">-- Employees 表
EmployeeID | Name
-----------------
1          | John Doe
2          | Jane Smith
3          | Sam Brown-- Departments 表
DepartmentID | DepartmentName
-----------------------------
1            | HR
2            | IT
3            | Finance

使用 CROSS JOIN:

sql">SELECT e.EmployeeID, e.Name, d.DepartmentName
FROM Employees e
CROSS JOIN Departments d;

结果:

sql">EmployeeID | Name       | DepartmentName
----------------------------------------
1          | John Doe   | HR
1          | John Doe   | IT
1          | John Doe   | Finance
2          | Jane Smith | HR
2          | Jane Smith | IT
2          | Jane Smith | Finance
3          | Sam Brown  | HR
3          | Sam Brown  | IT
3          | Sam Brown  | Finance

在这个示例中,每个 Employees 表中的行与 Departments 表中的每一行组合在一起,生成了所有可能的行组合。

SELF JOIN

定义

SELF JOIN 是一种特殊的 JOIN,它将一个表与其自身进行连接。它通常用于在同一个表中查找相关数据。

语法

sql">SELECT a.columns, b.columns
FROM table a
JOIN table b
ON a.common_column = b.common_column;

示例

假设我们有一个 Employees 表,其中包含员工和他们的上级(经理)的信息。

sql">-- Employees 表
EmployeeID | Name       | ManagerID
-----------------------------------
1          | John Doe   | NULL
2          | Jane Smith | 1
3          | Sam Brown  | 1
4          | Lisa Ray   | 2

使用 SELF JOIN:

sql">SELECT e1.EmployeeID, e1.Name, e2.Name AS ManagerName
FROM Employees e1
LEFT JOIN Employees e2
ON e1.ManagerID = e2.EmployeeID;

结果:

sql">EmployeeID | Name       | ManagerName
-------------------------------------
1          | John Doe   | NULL
2          | Jane Smith | John Doe
3          | Sam Brown  | John Doe
4          | Lisa Ray   | Jane Smith

在这个示例中,我们使用 SELF JOIN 来查找每个员工的经理。

NATURAL JOIN

定义

NATURAL JOIN 是一种特殊的 JOIN,它会自动基于两个表中具有相同名称和数据类型的列进行连接。NATURAL JOIN 不需要显式指定连接条件。

语法

sql">SELECT columns
FROM table1
NATURAL JOIN table2;

示例

假设我们有两个表:EmployeesDepartments,并且它们有一个相同的列 DepartmentID

sql">-- Employees 表
EmployeeID | Name      | DepartmentID
-------------------------------------
1          | John Doe  | 1
2          | Jane Smith| 2
3          | Sam Brown | 3-- Departments 表
DepartmentID | DepartmentName
-----------------------------
1            | HR
2            | IT
3            | Finance

使用 NATURAL JOIN:

sql">SELECT e.EmployeeID, e.Name, d.DepartmentName
FROM Employees e
NATURAL JOIN Departments d;

结果:

sql">EmployeeID | Name       | DepartmentName
----------------------------------------
1          | John Doe   | HR
2          | Jane Smith | IT
3          | Sam Brown  | Finance

在这个示例中,NATURAL JOIN 自动基于 DepartmentID 列进行连接。

总结

  • INNER JOIN:返回两个表中匹配的行。
  • LEFT JOIN:返回左表中的所有行,以及右表中匹配的行。对于左表中没有匹配的行,右表列包含 NULL。
  • RIGHT JOIN:返回右表中的所有行,以及左表中匹配的行。对于右表中没有匹配的行,左表列包含 NULL。
  • FULL JOIN:返回左右表中的所有行。对于没有匹配的行,另一表的列包含 NULL。
  • CROSS JOIN:返回两个表的笛卡尔积,即每个表的每一行与另一个表的每一行组合在一起。
  • SELF JOIN:将一个表与其自身进行连接,通常用于在同一个表中查找相关数据。
  • NATURAL JOIN:自动基于两个表中具有相同名称和数据类型的列进行连接。

通过理解这些不同类型的 JOIN,可以更有效地查询和分析关系数据库中的数据。


http://www.ppmy.cn/ops/149754.html

相关文章

性能测试工具Jmeter元件运行顺序

当Jmeter工具中使用了配置元件,前置处理器,定时器,取样器,后置处理器,断言,监听器等元件的时候,它们在执行的时候顺序是怎样的? Jmeter执行顺序逻辑如下: 1>配置元件…

【51项目】51单片机自制小霸王游戏机

视频演示效果: 纳新作品——小霸王游戏机 目录: 目录 视频演示效果: 目录: 前言:

Web后端开发总结(day14)

Web后端开发总结 web后端开发现在基本上都是基于标准的三层架构进行开发的,在三层架构当中,Controller控制器 层负责接收请求响应数据,Service业务层负责具体的业务逻辑处理,Dao数据访问层也叫持久层, 就是用来处理数据…

设计模式-结构型-桥接模式

1. 什么是桥接模式? 桥接模式(Bridge Pattern) 是一种结构型设计模式,它旨在将抽象部分与实现部分分离,使它们可以独立变化。通过这种方式,系统可以在抽象和实现两方面进行扩展,而无需相互影响…

【python3】 sqlite格式的db文件获得所有表和数据

【python3】 sqlite格式的db文件获得所有表和数据 1.背景2.代码3.解析1.背景 SQLite 格式的 .db 文件就是一个包含 SQLite 数据库的文件。 SQLite 格式的 .db 文件通常存储的是一个关系型数据库。 SQLite广泛用于应用程序、移动设备、浏览器等场景。它将整个数据库存储在一个文…

ZooKeeper 核心知识全解析:架构、角色、节点与应用

1.ZooKeeper 分布式锁怎么实现的 ZooKeeper 是一个高效的分布式协调服务,它提供了简单的原语集来构建更复杂的同步原语和协调数据结构。利用 ZooKeeper 实现分布式锁主要依赖于它的顺序节点(Sequential Node)特性以及临时节点(Ep…

如何进行单体前后端项目的微服务改造

如何进行单体前后端项目的微服务改造 引言 随着互联网技术的快速发展,传统的单体架构(Monolithic Architecture)逐渐显现出其局限性。对于大型应用来说,单体架构可能会导致开发效率低下、部署困难以及扩展性差等问题。因此&…

基于单片机的粮仓环境监测系统设计

本设计是以单片机为核心的粮仓环境监测系统,由单片机、温湿度检测模块、烟雾检测模块、显示模块、继电器模块、NB-IoT通信模块、报警电路等组成,以实现对粮仓内环境的监测功能,使用NB-IoT通信技术将环境信息上传至云平台,以便管理…