SQL 联查(Join)是将来自两个或多个表的数据结合在一起的操作。以下是一些常用的 SQL 联查示例,包括内联接、左联接、右联接和全外联接。
示例数据库表和数据
1. Customers (客户表)
| CustomerID | Name | City |
|---|---|---|
| 1 | Alice | New York |
| 2 | Bob | Los Angeles |
| 3 | Charlie | Chicago |
| 4 | David | San Francisco |
| 5 | Eve | Miami |
2. Orders (订单表)
| OrderID | CustomerID | OrderDate | Amount |
|---|---|---|---|
| 101 | 1 | 2025-01-15 | 150.00 |
| 102 | 1 | 2025-02-20 | 200.00 |
| 103 | 2 | 2025-01-25 | 300.00 |
| 104 | 3 | 2025-03-05 | 450.00 |
| 105 | 4 | 2025-04-10 | 500.00 |
查询和输出效果
1. 内联接 (INNER JOIN)
查询所有下过订单的客户及其订单信息:
sql
SELECT
Customers.CustomerID,
Customers.Name,
Orders.OrderID,
Orders.OrderDate,
Orders.Amount
FROM
Customers
INNER JOIN
Orders ON Customers.CustomerID = Orders.CustomerID;
输出结果:
| CustomerID | Name | OrderID | OrderDate | Amount |
|---|---|---|---|---|
| 1 | Alice | 101 | 2025-01-15 | 150.00 |
| 1 | Alice | 102 | 2025-02-20 | 200.00 |
| 2 | Bob | 103 | 2025-01-25 | 300.00 |
| 3 | Charlie | 104 | 2025-03-05 | 450.00 |
| 4 | David | 105 | 2025-04-10 | 500.00 |
2. 左联接 (LEFT JOIN)
查询所有客户及其订单信息,包括没有下过订单的客户:
sql
SELECT
Customers.CustomerID,
Customers.Name,
Orders.OrderID,
Orders.OrderDate,
Orders.Amount
FROM
Customers
LEFT JOIN
Orders ON Customers.CustomerID = Orders.CustomerID;
输出结果:
| CustomerID | Name | OrderID | OrderDate | Amount |
|---|---|---|---|---|
| 1 | Alice | 101 | 2025-01-15 | 150.00 |
| 1 | Alice | 102 | 2025-02-20 | 200.00 |
| 2 | Bob | 103 | 2025-01-25 | 300.00 |
| 3 | Charlie | 104 | 2025-03-05 | 450.00 |
| 4 | David | 105 | 2025-04-10 | 500.00 |
| 5 | Eve | NULL | NULL | NULL |
3. 右联接 (RIGHT JOIN)
查询所有订单及其客户信息,包括没有客户信息的订单:
sql
SELECT
Customers.CustomerID,
Customers.Name,
Orders.OrderID,
Orders.OrderDate,
Orders.Amount
FROM
Customers
RIGHT JOIN
Orders ON Customers.CustomerID = Orders.CustomerID;
输出结果:
| CustomerID | Name | OrderID | OrderDate | Amount |
|---|---|---|---|---|
| 1 | Alice | 101 | 2025-01-15 | 150.00 |
| 1 | Alice | 102 | 2025-02-20 | 200.00 |
| 2 | Bob | 103 | 2025-01-25 | 300.00 |
| 3 | Charlie | 104 | 2025-03-05 | 450.00 |
| 4 | David | 105 | 2025-04-10 | 500.00 |
4. 全外联接 (FULL OUTER JOIN)
查询所有客户与所有订单的信息,包括没有匹配的客户和订单:
sql
SELECT
Customers.CustomerID,
Customers.Name,
Orders.OrderID,
Orders.OrderDate,
Orders.Amount
FROM
Customers
FULL OUTER JOIN
Orders ON Customers.CustomerID = Orders.CustomerID;
输出结果:
| CustomerID | Name | OrderID | OrderDate | Amount |
|---|---|---|---|---|
| 1 | Alice | 101 | 2025-01-15 | 150.00 |
| 1 | Alice | 102 | 2025-02-20 | 200.00 |
| 2 | Bob | 103 | 2025-01-25 | 300.00 |
| 3 | Charlie | 104 | 2025-03-05 | 450.00 |
| 4 | David | 105 | 2025-04-10 | 500.00 |
| 5 | Eve | NULL | NULL | NULL |