SQLite 连接表
最后修改于 2020 年 7 月 6 日
在本 SQLite 教程中,我们将连接 SQLite 中的表。
关系数据库的真正力量和好处来自于连接表。SQL JOIN 子句将数据库中两个或多个表的记录组合在一起。 基本上有两种类型的连接:INNER 和 OUTER。
在本教程中,我们将使用 Customers 和 Reservations 表。
sqlite> SELECT * FROM Customers; CustomerId Name ---------- ----------- 1 Paul Novak 2 Terry Neils 3 Jack Fonda 4 Tom Willis
这些是 Customers 表中的值。
sqlite> SELECT * FROM Reservations; Id CustomerId Day -- ---------- ---------- 1 1 2009-22-11 2 2 2009-28-11 3 2 2009-29-11 4 1 2009-29-11 5 3 2009-02-12
这些是 Reservations 表中的值。
SQLite 内连接
内连接是最常见的连接类型。它也是默认连接。 内连接仅选择数据库表中具有匹配值的那些记录。我们有三种类型的 INNER JOINS:INNER JOIN、NATURAL INNER JOIN 和 CROSS INNER JOIN。 INNER 关键字可以省略。
INNER JOIN
sqlite> SELECT Name, Day FROM Customers AS C JOIN Reservations ...> AS R ON C.CustomerId=R.CustomerId; Name Day ----------- ----------- Paul Novak 2009-22-11 Terry Neils 2009-28-11 Terry Neils 2009-29-11 Paul Novak 2009-29-11 Jack Fonda 2009-02-12
在此 SELECT 语句中,我们选择了所有已进行一些预订的客户。 请注意,我们省略了 INNER 关键字。
该语句等同于以下语句
sqlite> SELECT Name, Day FROM Customers, Reservations ...> WHERE Customers.CustomerId = Reservations.CustomerId; Name Day ---------- ----------- Paul Novak 2009-22-11 Terry Neil 2009-28-11 Terry Neil 2009-29-11 Paul Novak 2009-29-11 Jack Fonda 2009-02-12
我们得到相同的数据。
NATURAL INNER JOIN
NATURAL INNER JOIN 自动使用所有匹配的列名进行连接。 在我们的表中,我们在两个表中都有一个名为 CustomerId 的列。
sqlite> SELECT Name, Day FROM Customers NATURAL JOIN Reservations; Name Day ----------- ---------- Paul Novak 2009-22-11 Terry Neils 2009-28-11 Terry Neils 2009-29-11 Paul Novak 2009-29-11 Jack Fonda 2009-02-12
我们得到相同的数据。 SQL 语句更简洁。
CROSS INNER JOIN
CROSS INNER JOIN 将一个表中的所有记录与另一个表中的所有记录组合起来。 这种类型的连接几乎没有实际价值。它也被称为记录的笛卡尔积。
sqlite> SELECT Name, Day FROM Customers CROSS JOIN Reservations; Name Day ----------- ---------- Paul Novak 2009-22-11 Paul Novak 2009-28-11 Paul Novak 2009-29-11 Paul Novak 2009-29-11 Paul Novak 2009-02-12 Terry Neils 2009-22-11 Terry Neils 2009-28-11 Terry Neils 2009-29-11 Terry Neils 2009-29-11 Terry Neils 2009-02-12 ...
使用以下 SQL 语句可以达到相同的结果
sqlite> SELECT Name, Day FROM Customers, Reservations;
SQLite 外连接
外连接 不需要两个连接表中的每条记录都具有匹配的记录。 外连接有三种类型:左外连接、右外连接和全外连接。 SQLite 仅支持左外连接。
LEFT OUTER JOIN
LEFT OUTER JOIN 从左表中返回所有值,即使与右表没有匹配项。 在这种行中,将有 NULL 值。 换句话说,左外连接返回左表中的所有值,加上来自右表的匹配值。 请注意,OUTER 关键字可以省略。
sqlite> SELECT Name, Day FROM Customers LEFT JOIN Reservations ...> ON Customers.CustomerId = Reservations.CustomerId; Name Day ----------- ----------- Paul Novak 2009-22-11 Paul Novak 2009-29-11 Terry Neils 2009-28-11 Terry Neils 2009-29-11 Jack Fonda 2009-02-12 Tom Willis NULL
在这里,我们有所有客户及其预订,以及一个没有预订的客户。 他的行中有一个 NULL 值。
我们可以使用 USING 关键字来达到相同的结果。 SQL 语句将更简洁。
sqlite> SELECT Name, Day FROM Customers LEFT JOIN Reservations ...> USING (CustomerId); Name Day ----------- ----------- Paul Novak 2009-22-11 Paul Novak 2009-29-11 Terry Neils 2009-28-11 Terry Neils 2009-29-11 Jack Fonda 2009-02-12 Tom Willis NULL
我们得到相同的结果,SQL 语句更短。
NATURAL LEFT OUTER JOIN
NATURAL LEFT OUTER JOIN 自动使用所有匹配的列名进行连接。
sqlite> SELECT Name, Day FROM Customers NATURAL LEFT OUTER JOIN Reservations; Name Day ----------- ---------- Paul Novak 2009-22-11 Paul Novak 2009-29-11 Terry Neils 2009-28-11 Terry Neils 2009-29-11 Jack Fonda 2009-02-12 Tom Willis NULL
我们有相同的输出,但我们使用的按键次数更少。
在本 SQLite 教程中,我们正在连接表。