SQL Joins

2025年6月24日 | 阅读9分钟

顾名思义,JOIN 意味着组合某些东西。在 SQL 中,JOIN 意味着 “组合两个或多个表”

SQL Joins 是 SQL 查询中执行的基本操作,用于将多个表组合成一个输出表。它使用两个表中都存在的公共行来组合它们。我们使用 Joins 来一次性检索数据并对多个表执行操作。

Joins 允许高效地从多个表中检索数据。它有助于解决复杂的查询。为了合并两个或多个表,我们使用 join 关键字来创建一个临时数据表。

我们使用带有某些子句的 join 关键字,这些子句有助于获取我们想要的数据。SQL Joins 还有助于减少冗余并删除不必要的数据。它有助于规范化数据。

SQL 中,我们使用主键和外键来组合表。主键在第一个表中是唯一的不为 NULL。外键在第二个表中也是唯一的,有助于合并表。

参数

SELECT:SELECT 用于选择我们想要从表中检索的数据。

列:这些是我们需要在结果中显示的列。

JOIN:JOIN 用于根据公共列连接表中的行。

ON:ON 子句用于指定连接条件,它说明这些表是如何连接的。

示例

为了更好地解释 Join,我们使用逐步解释的示例。

步骤 1

我们创建第一个名为 actors 的表并插入数据。

创建表 actors

将数据插入 actors

从 actors 表中检索数据

输出

actor_idactor_namemovie_id
1范·迪塞尔301
2玛丽莲·梦露302
3阿尔瓦罗·莫特303
4罗斯·德威特304
5哈莉·贝瑞306

步骤 2

创建第二个名为 movies 的表并插入数据。

创建表 movies

将数据插入 movies

从 movie 表中检索数据

movie_idmovie_title
301速度与激情
302金发美人
303纸钞屋
304泰坦尼克号
305疾速追杀

步骤 3

编写查询以执行 Join 操作以匹配电影 ID。

输出

actor_namemovie_title
范·迪塞尔速度与激情
玛丽莲·梦露金发美人
阿尔瓦罗·莫特纸钞屋
罗斯·德威特泰坦尼克号

说明

在上面的示例中,我们创建了两个表并向其中插入了数据。在第一个表中,我们有演员姓名和 movie_id,我们将其连接到第二个表中,其中有 movie_idmovie_title。借助 SELECT 语句,我们只在输出中看到 actor_namemovie_title

我们看到 movie_id 在两个表中都是公共的,这有助于连接这两个表。公共 movie_id 的数据被获取到输出中。借助 ON 子句,我们使用条件来连接表中的公共列。

连接类型

SQL Joins
  • Inner Join
  • 左连接 (Left Join)
  • 右连接 (Right Join)
  • 完整连接
  • Self Join
  • 交叉连接

INNER JOIN (内连接)

Inner Join 是用于根据特定条件从表中获取匹配记录的语句。借助 INNER JOIN,我们根据公共列获取了两个表中存在的匹配行。

它从表中删除重复项。我们只在输出表中看到冗余数据。

文氏图

SQL Joins

语法

参数

FROM table1:借助 FROM,我们可以选择第一个表来连接第二个表。

INNER JOIN table2:INNER JOIN 用于获取两个表中匹配的数据。

示例

为了更好地理解,我们可以看下面的示例。

表 1:员工

emp_idname年龄
1艾米丽30
2艾米25
3伊娃28
4戴安娜35
5朱莉安娜40

表 2:部门

dept_idemp_iddepartment_name
1011HR
1023销售
1034营销
1046IT
1057融资

执行内连接的查询

输出

emp_idnamedepartment_name
1艾米丽HR
3伊娃销售
4戴安娜营销

说明

在上面的示例中,借助 emp_id,我们将连接两个表并在输出中显示 emp_id、namedepartment_name

LEFT JOIN

LEFT JOIN 主要用于根据条件从左表中获取所有列和行,其中包括来自右表的列。当行存在于左表中但不存在于右表中时,返回 NULL 值。但当行存在于右表中但不存在于左表中时,它将不会出现在输出中。

文氏图

SQL Joins

语法

参数

LEFT JOIN table2:LEFT JOIN 表示我们执行左连接操作,通过该操作我们获取来自 table 1 的所有数据和来自 table 2 的匹配数据。

示例

表 1:客户

customer_idname
1安妮
2安吉丽娜
3凯拉

表 2:订单

order_idcustomer_id产品
1011笔记本电脑
1022智能手机

左连接查询

输出

customer_idnameorder_id产品
1安妮101笔记本电脑
2安吉丽娜102智能手机
3凯拉NULLNULL

说明

在上面的示例中,安妮安吉丽娜的订单匹配,结果中显示了两个表的订单详细信息,但凯拉没有订单,因此其 order_id产品详细信息为 null。

RIGHT JOIN

RIGHT JOIN 主要用于根据条件从右表中获取所有列和行,其中包括来自左表的列。当行存在于右表中但不存在于左表时,返回 NULL 值。但当行存在于左表中但不存在于右表中时,它将不会显示在输出中。

文氏图

SQL Joins

语法

参数

RIGHT JOIN table2:它将右表连接到左表,以从右表获取数据并从左表获取匹配数据。

示例

表 1:员工

employee_idnamedepartment_id
1John101
2艾玛102

表 2:部门

department_iddepartment_name
101HR
102IT
103营销

执行右连接的查询

输出

namedepartment_iddepartment_name
John101HR
艾玛102IT
NULLNULL营销

说明

在上面的示例中,我们检索了所有部门的列表,包括员工姓名和员工部门名称。右连接在 Employees 表和 Departments 表之间使用并获取数据。

在输出中,我们看到所有部门的列表是从右表中获取的,公共数据是从左表中获取的,但是营销部门没有员工,因此该部门的 namedepartment_idNULL

FULL JOIN/FULL OUTER JOIN

SQL 中的 FULL JOIN 检索两个表中的所有行,无论值是 NULL 还是 NOT NULL。它是 LEFT JOINRIGHT JOIN 的组合。它创建多个表的组合,其中包括所有空值。

当我们想要将所有值(无论是否匹配)存储在一个表中时,使用它。它还存储缺失的数据。

注意:FULL JOIN 在 PostgreSQL、Microsoft SQL Server、Oracle、IBM DB2、Amazon Redshift 和 Snowflake 中受支持,但在 MySQL、SQLite、Google BigQuery 和 MariaDB 等数据库中不受支持。在不受支持的数据库中,使用 UNION 运算符来组合左表和右表。

文氏图

SQL Joins

语法

参数

FULL JOIN table2:借助它,我们在 table1table2 之间执行 FULL JOIN

示例

为了更好地理解 FULL JOIN,我们使用了两个表并执行了操作。

表 1:销售

sale_idcustomer_idsale_amountsale_date
1001201500.002025-01-10
10022021200.002025-01-11
1003203300.002025-01-12
1004205450.002025-01-13

表 2:客户

feedback_idcustomer_idfeedback_scorefeedback_date
50120242025-01-14
50220352025-01-15
50320432025-01-16

执行 FULL JOIN 的查询

输出

customer_idsale_amountsale_datefeedback_scorefeedback_date
2015002025-01-10NULLNULL
20212002025-01-1142025-01-14
2033002025-01-1252025-01-15
204NULLNULL32025-01-16
2054502025-01-13NULLNULL

说明

在输出中,我们看到 ID 为 201205 的客户有销售但没有反馈。这种类型的连接在业务中非常有用,可以跟踪客户销售的记录。它有助于显示数据的完整视图。

自连接 (SELF JOIN)

SELF JOIN 是一种用于将表与其自身进行比较的操作。为了执行自连接,它将行与同一表进行比较。当我们处理层次数据或比较同一表中的行时,它非常有用。

为了比较表,它会复制表并开始在它们之间进行比较。在同一表内连接表时,使用别名是强制性的。

文氏图

SQL Joins

语法

参数

FROM table_name AS A:这里,我们使用表一次,并为该表指定别名 A。

FROM table_name AS B:我们第二次使用同一个表,并使用不同的别名 B。

示例

表:Employees

emp_idnamemanager_id
1史蒂文NULL
2亚伦1
31
4格伦2
5Alex2

执行自连接的查询

输出

员工经理
史蒂文NULL
亚伦史蒂文
史蒂文
格伦亚伦
Alex亚伦

说明

在上面的示例中,我们将 Employees 表与其自身连接起来,以获取员工和经理的详细信息。我们将表与 e.manager_id = m.emp_id 进行比较,以将员工与其经理匹配。我们使用左连接,以便将没有经理的员工包含在输出中。

交叉连接

CROSS JOIN 是一种将一个表的每一行与另一个表的每一行组合起来的操作。它在结果中返回所有可能的对组合。它也称为笛卡尔连接。我们使用 CROSS JOIN 来创建大型数据集以进行测试。当我们处理不相关的数据集并希望在输出表中获取数据时,也使用它。

文氏图

SQL Joins

语法

参数

CROSS JOIN table2:它用于返回结果中所有可能的行组合。

如果一个表有 x 行,另一个表有 y 行,它将在结果中返回 x*y 行。

示例

为了更好地理解 CROSS JOIN,我们将在下面使用一个示例。

表 1:产品

product_idproduct_name
1笔记本电脑
2智能手机
3耳机
4智能手表

表 2:商店

store_idstore_location
101纽约
102洛杉矶
103Chicago

执行 CROSS JOIN 的查询

输出

product_namestore_location
笔记本电脑纽约
笔记本电脑洛杉矶
笔记本电脑Chicago
智能手机纽约
智能手机洛杉矶
智能手机Chicago
  
耳机纽约
耳机洛杉矶
耳机Chicago
智能手表纽约
智能手表洛杉矶
智能手表Chicago

说明

在上面的示例中,我们在产品表中选取了个产品,并在商店表中选取了个商店及其位置和 store_id。当我们执行交叉连接时,它返回 product_namestore_location 的笛卡尔积。每个产品都与每个商店配对。

结论

SQL Joins 是允许根据列组合来自多个表的数据的操作。它能够高效地检索信息。通过使用各种类型的 Joins,如 Inner Join、Left Join、Right Join、Full Join、Self Join 和 Cross Join

借助 Joins,我们从行中检索所有匹配和不匹配的数据。Joins 适用于关系数据库。我们可以处理复杂的查询并高效地处理数据。


下一主题SQL Outer Join