在 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
关键字可以省略。
内连接
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
自动使用所有匹配的列名进行连接。 在我们的表中,两个表中都有一个名为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
将一个表中的所有记录与另一表中的所有记录组合在一起。 这种连接几乎没有实用价值。 它也称为记录的笛卡尔积。
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
也将从左表返回所有值。 在此类行中,将有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
自动使用所有匹配的列名进行连接。
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 教程的这一部分中,我们将连接表。