在数据库管理中,表连接(JOIN)是一种将两个或多个表中的数据根据一定条件组合在一起的技术。本系列文章将向展示如何编写查询语句来合并多个表中的数据。通过这些示例,将理解如何编写基本的命令来实现这一操作,以及为什么数据最初会被分开存储。
本文首先介绍了表连接的概念。重点将放在连接的类型上,而不是它们的语法。后续文章将专注于不同类型的连接。通过叙述和示例,将对每一种连接方式变得非常熟悉。
在之前的文章中,了解到了为了便于维护数据而进行规范化的必要性。虽然这使得数据维护和更新变得更加容易,但它使得查看和报告信息变得非常不方便。通常,需要查看的信息必须跨多个表进行交叉引用,才能看到完整的情况。
如果数据被分开存储在不同的表中,就很难将它们整合在一起并理解数据的含义。通过使用连接,可以将数据重新拼接在一起,使其易于人们使用和理解。
在开始之前,让看看为什么需要合并数据。SQLite和其他数据库,如Microsoft SQL Server和MySQL,都是关系型数据库。这些类型的数据库使得创建数据表和关联(连接或组合)数据变得非常容易。
在开发数据库时,会特别注意确保冗余数据最小化。数据库会经历一个称为规范化的过程,帮助将每个数据库表减少到单一的含义或目的。
例如,如果有一个包含所有学生及其课程的表,然后想要更改一个学生的名字,将不得不多次更改它,一次为学生注册的每个课程。
规范化将数据分开到学生和课程表中。这使得更新学生名字变得非常容易,但代价是必须将数据重新组合在一起,以回答向数据库提出的大多数问题。这正是需要连接的原因。
当分解时,连接的机制相当简单。要执行连接,需要两个项目:两个表和一个连接条件。表包含要组合的行,连接条件是将行匹配在一起的指令。
看看下面的维恩图。圆圈代表表,它们重叠的地方是满足连接条件的行。
可能会想知道连接条件由什么组成。在许多情况下,连接条件只是将一个表中的一个或多个字段与另一个表中的字段进行匹配。这种类型的连接有时被称为等值连接(equijoin),因为使用的比较类型只有等号。
连接不仅限于等值连接这样的精确匹配。将在后续文章中看到,使用其他比较运算符(如大于号)在某些情况下是有用的。
将遇到的一个常见连接模式是将一个表的主键连接到它的外键。认为这是显而易见的,但认为强调这一点很重要。能想到为什么吗?
如果猜到的是规范化,那么是正确的。通过该过程,分解表内的依赖关系以消除更新异常等问题,但为了保持关系,引入了外键。
让以示例数据库中的数据模型为例。考虑涉及员工和订单表的数据模型。在这个模型中,每个员工可以下零个或多个订单。
EmployeeID是员工表的主键,也是订单表的外键。对于每个员工,可能没有、一个或多个订单。
以下是所有员工的列表。为了保持简单,只显示了LastName。
在示例数据库中,可以编写以下语句来获得这些结果:
SELECT EmployeeID, LastName FROM Employees
以下是订单。可以使用以下select语句查看这些数据:
SELECT OrderID, EmployeeID, ShippedDate FROM Orders
要创建员工LastName和他们下订单的ShippedDate的报告,需要从两个表中组合信息。为此,需要在EmployeeID上创建两个表之间的连接条件。
当处理涉及多个表的select语句时,需要一种方法来非常清楚地知道哪个字段来自哪个表。这是通过在列名前放置表名来完成的。使用点号将两者分开。
使用这种约定,使用的连接条件是:
Employees.EmployeeID = Orders.EmployeeID
查看以下图表。连接的表是寻找EmployeeID匹配的行。因此,对于每个订单,其中EmployeeID = 4,数据库将匹配员工表并匹配相应的行。在这种情况下,那就是姓“Baker”的员工。
这种类型的连接称为内连接,将在稍后的文章中详细解释,但如果现在就想尝试,以下是命令!
SELECT Employees.LastName, Orders.ShippedDate FROM Employees INNERJOINOrders ON Employees.EmployeeID = Orders.EmployeeID
本节中将讨论的连接类型,其特点是在满足连接条件时返回哪些行。已经知道内连接返回满足连接条件的每个表中的行,但也有一些连接即使连接条件未满足也会返回表中的行。这些被称为外连接。
内连接返回满足连接条件的行。这是最常见的连接。在最常见的例子中,主键与外键匹配时,只返回匹配键的行组合。
外连接用于除了返回内连接的结果外,还希望返回一个表中不匹配另一个表的行。在上面的例子中,一个员工可以下零个或多个订单。如果只使用内连接,那么结果只包括已经下订单的员工。那些没有下订单的员工将被包括在结果中。
可能有这样的情况,希望列出所有员工,不管他们是否下过订单。在这种情况下,外连接很有用。不管与订单表的匹配情况如何,员工记录的选定列都会列在结果中。
有三种类型的外连接:
在接下来的文章中,将深入探讨各种连接类型,探索涉及多个表的连接,并进一步解释连接条件,特别是非等值连接条件可以做什么。