SQL - 使用联接:初学者的全面指南

你好,有抱负的数据库爱好者!作为一名有着多年教学经验的计算机科学教师,我很高兴能引导你进入 SQL 联接的精彩世界。如果你是编程新手,不用担心——我们将从基础开始,逐步深入学习。在本教程结束时,你将能够像专业人士一样进行表格联接!

SQL - Using Joins

什么是 SQL 联接?

想象你在组织一个大型家庭聚会。你有一个名单列出了名字和年龄,另一个名单列出了名字和最喜欢的食物。如果你能将这些名单合并,以获得每个家庭成员的完整信息,那岂不是很好?这正是 SQL 联接在数据库表中所做的!

在 SQL 中,联接子句用于基于两个或多个表之间的相关列来组合行。这就像创建了一个包含多个来源信息的大型表格。

SQL 联接子句

SQL 联接的基本语法如下:

SELECT 列名(s)
FROM 表格1
JOIN 表格2
ON 表格1.列名 = 表格2.列名;

让我们分解一下:

  • 我们使用 SELECT 选择我们想要在结果中看到的列。
  • 我们在 FROM 子句中指定第一个表格(表格1)。
  • 我们使用 JOIN 表明我们想要与另一个表格(表格2)组合。
  • ON 子句指定表格应该如何匹配。

SQL 中的联接类型

现在,让我们探索 SQL 中可用的不同类型的联接。我喜欢将这些比作我们家庭聚会中合并客人名单的不同方式!

1. 内部联接 (INNER JOIN)

内部联接就像只邀请那些同时出现在你的名单和你姐姐名单上的堂兄弟姐妹。它会返回两个表中都有匹配值的记录。

SELECT 订单.OrderID, 客户.CustomerName
FROM 订单
INNER JOIN 客户 ON 订单.CustomerID = 客户.CustomerID;

这个查询将返回所有订单以及下单客户的姓名,但仅限于那些已经下单的客户。

2. 左部(外部)联接 (LEFT JOIN)

左部联接就像包括你在名单上的所有人,即使他们不在你姐姐的名单上。它会返回左表的所有记录以及右表的匹配记录。

SELECT 客户.CustomerName, 订单.OrderID
FROM 客户
LEFT JOIN 订单 ON 客户.CustomerID = 订单.CustomerID;

这将显示所有客户,即使那些没有下单的客户(他们的 OrderID 将为 NULL)。

3. 右部(外部)联接 (RIGHT JOIN)

右部联接与左部联接相反。它就像使用你姐姐的名单作为主要名单。它会返回右表的所有记录以及左表的匹配记录。

SELECT 订单.OrderID, 员工.LastName
FROM 订单
RIGHT JOIN 员工 ON 订单.EmployeeID = 员工.EmployeeID;

这将显示所有员工,即使那些没有处理任何订单的员工。

4. 完全(外部)联接 (FULL JOIN)

完全联接就像合并你和姐姐的名单,包括两边的所有人。当左表或右表中有匹配时,它会返回所有记录。

SELECT 客户.CustomerName, 订单.OrderID
FROM 客户
FULL OUTER JOIN 订单 ON 客户.CustomerID = 订单.CustomerID;

这将显示所有客户和所有订单,没有匹配的地方将为 NULL。

实际示例

让我们通过一些现实世界的场景来测试我们的知识!

示例 1:合并客户和订单信息

假设我们有两个表:客户订单。我们想要查看所有客户及其订单(如果有的话)。

SELECT 客户.CustomerName, 订单.OrderID, 订单.OrderDate
FROM 客户
LEFT JOIN 订单 ON 客户.CustomerID = 订单.CustomerID
ORDER BY 客户.CustomerName;

这个查询将:

  1. 列出所有客户,即使他们没有订单。
  2. 对于已下单的客户,显示 OrderID 和 OrderDate。
  3. 对于没有订单的客户,OrderID 和 OrderDate 显示为 NULL。
  4. 按客户名称对结果进行排序。

示例 2:查找尚未完成销售的员工

假设我们想要识别那些还没有处理任何订单的员工。

SELECT 员工.EmployeeID, 员工.LastName, 员工.FirstName
FROM 员工
LEFT JOIN 订单 ON 员工.EmployeeID = 订单.EmployeeID
WHERE 订单.OrderID IS NULL;

这个查询将:

  1. 联接员工和订单表。
  2. 使用 WHERE 子句过滤出没有匹配订单的员工。
  3. 只返回那些没有处理任何订单的员工。

技巧和技巧

  1. 总是从简单的联接开始,然后逐渐增加复杂度。
  2. 使用表格别名提高可读性,特别是对于长表名:
    SELECT c.CustomerName, o.OrderID
    FROM 客户 c
    LEFT JOIN 订单 o ON c.CustomerID = o.CustomerID;
  3. 在处理大型数据集时注意性能。联接可能会消耗大量资源。

常见的联接方法

以下是我们讨论过的联接方法的便捷表格总结:

联接类型 描述
INNER JOIN 返回两个表中都有匹配值的记录
LEFT JOIN 返回左表的所有记录,以及右表的匹配记录
RIGHT JOIN 返回右表的所有记录,以及左表的匹配记录
FULL JOIN 当左表或右表中有匹配时,返回所有记录

记住,熟能生巧!在不同的数据集上尝试这些联接,不久你将成为组合表格的数据库大师。快乐编码,愿你的联接总是成功!

Credits: Image by storyset