SQL JOIN 图解说明
1. 基础示例表
假设有两个表:
Table A
| id | val |
|---|---|
| 1 | A1 |
| 2 | A2 |
| 3 | A3 |
Table B
| id | val |
|---|---|
| 2 | B2 |
| 3 | B3 |
| 4 | B4 |
关联条件:
sql
A.id = B.id
2 INNER JOIN(内连接)
只返回两个表匹配的数据(交集)。
图示
A B
( ) ∩ ( )
███
SQL
sql
SELECT *
FROM A
INNER JOIN B ON A.id = B.id;
查询结果
| A.id | A.val | B.id | B.val |
|---|---|---|---|
| 2 | A2 | 2 | B2 |
| 3 | A3 | 3 | B3 |
特点
- 只保留两个表的交集
- 最常用 JOIN 类型
- 性能通常较好
3 LEFT JOIN(左连接)
返回左表全部数据,右表匹配不到补 NULL。
图示
+-----------+
| LEFT |
+-----+███████----+-----+
| A |███████ | B |
+-----+-----------+-----+
SQL
sql
SELECT *
FROM A
LEFT JOIN B ON A.id = B.id;
查询结果
| A.id | A.val | B.id | B.val |
|---|---|---|---|
| 1 | A1 | NULL | NULL |
| 2 | A2 | 2 | B2 |
| 3 | A3 | 3 | B3 |
常见用途
查没有匹配数据的记录
例如:
sql
SELECT *
FROM A
LEFT JOIN B ON A.id = B.id
WHERE B.id IS NULL;
用途:
- 查没有订单的用户
- 查没有库存的商品
- 查没有绑定关系的数据
4 RIGHT JOIN(右连接)
返回右表全部数据,左表匹配不到补 NULL。
图示
+-----------+
| RIGHT |
+-----+----███████+-----+
| A | ███████| B |
+-----+-----------+-----+
SQL
sql
SELECT *
FROM A
RIGHT JOIN B ON A.id = B.id;
查询结果
| A.id | A.val | B.id | B.val |
|---|---|---|---|
| 2 | A2 | 2 | B2 |
| 3 | A3 | 3 | B3 |
| NULL | NULL | 4 | B4 |
工程实践建议
RIGHT JOIN 很少使用。
一般改写为:
sql
B LEFT JOIN A
原因:
- SQL 更统一
- 可读性更好
- 更符合主表驱动思维
5 FULL JOIN(全连接)
返回两个表全部数据,不匹配补 NULL。
图示
A B
(█████) ∪ (█████)
SQL
sql
SELECT *
FROM A
FULL JOIN B ON A.id = B.id;
查询结果
| A.id | A.val | B.id | B.val |
|---|---|---|---|
| 1 | A1 | NULL | NULL |
| 2 | A2 | 2 | B2 |
| 3 | A3 | 3 | B3 |
| NULL | NULL | 4 | B4 |
MySQL 注意
MySQL 不支持 FULL JOIN。
可以用 UNION 模拟:
sql
SELECT *
FROM A
LEFT JOIN B ON A.id = B.id
UNION
SELECT *
FROM A
RIGHT JOIN B ON A.id = B.id;
6 CROSS JOIN(笛卡尔积)
两个表所有组合。
如果:
A = 3 行
B = 3 行
结果:
3 × 3 = 9 行
图示
A1 × B1
A1 × B2
A1 × B3
A2 × B1
A2 × B2
A2 × B3
A3 × B1
A3 × B2
A3 × B3
SQL
sql
SELECT *
FROM A
CROSS JOIN B;
等价写法:
sql
SELECT *
FROM A, B;
风险
生产环境大量 SQL 性能问题来自:
意外产生笛卡尔积。
常见原因:
- 忘写 JOIN 条件
- JOIN 条件错误
- 多表关联缺失
7 JOIN 类型总结
| JOIN类型 | 返回数据 |
|---|---|
| INNER JOIN | A ∩ B |
| LEFT JOIN | A + (A ∩ B) |
| RIGHT JOIN | B + (A ∩ B) |
| FULL JOIN | A ∪ B |
| CROSS JOIN | A × B |
8 JOIN 关系整体示意图
+-----------+
| B |
+----+----███----+
| | ███ |
| A | ███ |
+----+-----------+
说明:
- 中间交集:
INNER JOIN - 左边区域:
LEFT JOIN - 右边区域:
RIGHT JOIN - 全部区域:
FULL JOIN
9 JOIN 性能优化补充
在数据库执行层面,JOIN 主要有三种执行算法:
| 算法 | 特点 |
|---|---|
| Nested Loop Join | 小表驱动大表 |
| Hash Join | 构建哈希表匹配 |
| Merge Join | 排序后合并 |