ZetCode

SQLite 连接表

最后修改于 2020 年 7 月 6 日

在本 SQLite 教程中,我们将连接 SQLite 中的表。

关系数据库的真正力量和好处来自于连接表。SQL JOIN 子句将数据库中两个或多个表的记录组合在一起。 基本上有两种类型的连接:INNEROUTER

在本教程中,我们将使用 CustomersReservations 表。

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 JOINSINNER JOINNATURAL INNER JOINCROSS INNER JOININNER 关键字可以省略。

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 教程中,我们正在连接表。