SQL - 使用连接操作:初学者的全面指南

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

SQL - Using Joins

SQL连接是什么?

想象你正在组织一个大型家庭聚会。你有一份名单,上面写着名字和年龄,另一份名单上写着名字和最喜欢的食物。如果你能把这些名单合并起来,以获得每位家庭成员的完整信息,岂不是很好?这正是SQL连接在数据库表中做的事情!

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

SQL连接子句

SQL JOIN的基本语法如下:

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 OUTER JOIN)

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

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

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

3. 右连接 (RIGHT OUTER JOIN)

右连接是左连接的反义词。它就像使用你姐姐的名单作为主要名单。它会返回右表的所有记录以及左表的匹配记录。

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

这将显示所有员工,即使他们没有处理任何订单。

4. 全连接 (FULL OUTER 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. 按CustomerName排序结果。

示例 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