# 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 教程的这一部分中，我们将连接表。