SQL JOIN 图解说明

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 排序后合并

相关推荐
白露与泡影37 分钟前
Redis 缓存实战:雪崩、穿透、击穿一次讲透
数据库·redis·缓存
-SOLO-1 小时前
停止gradle命令
android
_祝你今天愉快1 小时前
Android Binder 驱动 - 启动 ServiceManager 进程
android
农村小镇哥1 小时前
ThinkPHP-MVC什么是框架
android
赵渝强老师2 小时前
【赵渝强老师】使用Oracle可传输的表空间迁移数据
数据库·oracle
换元不配限2 小时前
Jetpack Compose 状态管理指南
android·状态管理·compose·状态·单向数据流·jetpack compose·状态容器
Csvn2 小时前
Day 3:LIKE 与模式匹配 — 让查询学会"模糊搜索"
后端·sql
IpdataCloud3 小时前
跨区服玩家延迟高怎么办?用IP离线库自动分配到最近服务器
数据库·tcp/ip·github·php·ip
wuqingshun3141594 小时前
MYSQL默认的事务隔离级别是什么?为什么选择这个级别?
数据库·mysql
空中湖4 小时前
电池简史(五):极限之梦与终章——锂硫、锂空气、量子电池,以及你该知道的电池投资与生活指南
数据库·程序人生