SQL 连接详解:内连接、左连接与右连接
在 SQL 查询中,表之间的数据关联是最常见的操作之一。不同的连接类型决定了数据如何组合展示。本文将详细讲解 内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN) 的概念、用法和实际效果。
1️⃣ 内连接(INNER JOIN)
概念
内连接用于 只显示两张表中匹配的记录。如果某条数据在另一张表中没有对应,则不会出现在结果集中。
示例
假设有两张表:
Customers(客户表)
customer_id | customer_name |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
Orders(订单表)
order_id | customer_id | amount |
---|---|---|
101 | 1 | 500 |
102 | 1 | 200 |
103 | 3 | 300 |
SQL 查询:
SELECT c.customer_name, o.order_id, o.amount FROM Customers c INNER JOIN Orders o ON c.customer_id = o.customer_id;
结果:
customer_name | order_id | amount |
---|---|---|
Alice | 101 | 500 |
Alice | 102 | 200 |
Charlie | 103 | 300 |
✅ 说明:
只有在 Customers 和 Orders 中都存在匹配的记录才显示。
Bob 没有订单,所以不出现在结果中。
2️⃣ 左连接(LEFT JOIN)
概念
左连接保证 左表的所有记录都显示,右表匹配上的显示数据,不匹配显示 NULL
。
SQL 示例:
SELECT c.customer_name, o.order_id, o.amount FROM Customers c LEFT JOIN Orders o ON c.customer_id = o.customer_id;
结果:
customer_name | order_id | amount |
---|---|---|
Alice | 101 | 500 |
Alice | 102 | 200 |
Bob | NULL | NULL |
Charlie | 103 | 300 |
✅ 说明:
左表(Customers)所有客户都会显示。
如果客户没有订单,订单列显示
NULL
。对于高并发数据统计和报表,这种方式非常常用。
3️⃣ 右连接(RIGHT JOIN)
概念
右连接保证 右表的所有记录都显示,左表匹配上的显示数据,不匹配显示 NULL
。
SQL 示例:
SELECT c.customer_name, o.order_id, o.amount FROM Customers c RIGHT JOIN Orders o ON c.customer_id = o.customer_id;
假设 Orders 表有一条额外订单(customer_id = 4,不在 Customers 表中):
order_id | customer_id | amount |
---|---|---|
104 | 4 | 100 |
结果:
customer_name | order_id | amount |
---|---|---|
Alice | 101 | 500 |
Alice | 102 | 200 |
Charlie | 103 | 300 |
NULL | 104 | 100 |
✅ 说明:
右表(Orders)所有订单都会显示。
如果对应客户在 Customers 表中不存在,显示
NULL
。JOIN 类型 结果保证 不匹配部分显示 INNER JOIN 仅显示匹配记录 不显示 LEFT JOIN 左表全部显示 右表不匹配显示 NULL RIGHT JOIN 右表全部显示 左表不匹配显示 NULL - 图示理解(用圆圈表示表):
- Customers Orders
________ ________
/ \ / \
| LEFT |---- | RIGHT |
\________/ \________/ INNER JOIN → 只取重叠部分
LEFT JOIN → 左表全 + 重叠部分
RIGHT JOIN → 右表全 + 重叠部分
5️⃣ 使用场景
INNER JOIN:当只关心匹配数据,例如统计每个有订单的客户总金额。
LEFT JOIN:当要保留主表信息,即使没有匹配也要显示,如客户报表、订单缺失提醒。
RIGHT JOIN:较少使用,一般可以用 LEFT JOIN 交换表顺序替代。