🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# SQLite 连接表 > 原文: [http://zetcode.com/db/sqlite/joins/](http://zetcode.com/db/sqlite/joins/) 在 SQLite 教程的这一部分中,我们将在 SQLite 中连接表。 关系数据库的真正力量和收益来自于连接表。 `SQL JOIN`子句合并了数据库中两个或多个表中的记录。 基本上有两种连接类型:`INNER`和`OUTER`。 在本教程的这一部分中,我们将使用`Customers`和`Reservations`表。 ```sql sqlite> SELECT * FROM Customers; CustomerId Name ---------- ----------- 1 Paul Novak 2 Terry Neils 3 Jack Fonda 4 Tom Willis ``` 这些是`Customers`表中的值。 ```sql 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`关键字可以省略。 ### 内连接 ```sql 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`关键字。 该语句等效于以下语句: ```sql 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`的列。 ```sql 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`将一个表中的所有记录与另一表中的所有记录组合在一起。 这种连接几乎没有实用价值。 它也称为记录的笛卡尔积。 ```sql 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 语句可以达到相同的结果: ```sql sqlite> SELECT Name, Day FROM Customers, Reservations; ``` ## SQLite 外连接 外连接不需要两个连接表中的每个记录都具有匹配的记录。 外连接共有三种类型:左外连接,右外连接和全外连接。 SQLite 仅支持左外连接。 ### 左外连接 即使与右表不匹配,`LEFT OUTER JOIN`也将从左表返回所有值。 在此类行中,将有`NULL`值。 换句话说,左外连接返回左表中的所有值,以及右表中的匹配值。 注意,可以省略`OUTER`关键字。 ```sql 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 语句将不再那么冗长。 ```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`自动使用所有匹配的列名进行连接。 ```sql 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 教程的这一部分中,我们将连接表。