一、前言
上一篇
SQL 第三篇:表关系设计(user_id 到底是什么)
我们已经理解了:
sql
user.id
=
user_detail.user_id
也知道了:
表关系,本质是相同字段值
但新的问题来了:
数据库怎么把两张表"拼"起来?
比如:
用户表
+
用户详情表
最后变成:
用户详情页
这一步,就是:
❗ JOIN
二、什么是 JOIN?
JOIN 可以理解成:
把多张表组合成一份业务数据
例如:
user 表
| id | username |
|---|---|
| 1 | zhangsan |
user_detail 表
| user_id | real_name |
|---|---|
| 1 | 张三 |
通过 JOIN 后:
| id | username | real_name |
|---|---|---|
| 1 | zhangsan | 张三 |
三、第一条 JOIN SQL(必须记住)
sql
SELECT
u.id,
u.username,
d.real_name
FROM user u
LEFT JOIN user_detail d
ON u.id = d.user_id;
这一句非常重要。
后面很多业务查询,本质上都是这个结构。
四、这一句 SQL 到底怎么读?
很多人第一次看 JOIN 会懵。
其实拆开就很简单。
五、SELECT(查什么)
sql
SELECT
u.id,
u.username,
d.real_name
表示:
最终返回哪些字段
六、FROM(从哪张表开始)
sql
FROM user u
这里:
user
是主表。
u 是什么?
user u
等价于:
user AS u
意思是:
给 user 表起个别名
后面:
u.id
就表示:
user.id
七、LEFT JOIN(怎么拼)
sql
LEFT JOIN user_detail d
表示:
把 user_detail 拼到 user 上
d 是什么?
和 u 一样:
表别名
所以:
d.real_name
表示:
user_detail.real_name
八、ON(拼接条件)
这一句最关键:
ON u.id = d.user_id
含义:
当 user.id 和 user_detail.user_id 相等时,
认为它们属于同一个用户
这一步,就是:
❗ JOIN 的核心
九、数据库到底怎么"拼表"?
本质上:
数据库会:
1️⃣ 先查 user
| id | username |
|---|---|
| 1 | zhangsan |
| 2 | lisi |
2️⃣ 再查 user_detail
| user_id | real_name |
|---|---|
| 1 | 张三 |
3️⃣ 按 ON 条件匹配
u.id = d.user_id
于是:
user.id = 1
匹配:
user_detail.user_id = 1
拼成功。
user.id = 2
找不到:
user_detail.user_id = 2
十、LEFT JOIN 到底是什么意思?
LEFT JOIN 的核心:
❗ 左边表的数据全部保留
示例
user 表
| id | username |
|---|---|
| 1 | zhangsan |
| 2 | lisi |
user_detail 表
| user_id | real_name |
|---|---|
| 1 | 张三 |
LEFT JOIN 结果
| id | username | real_name |
|---|---|---|
| 1 | zhangsan | 张三 |
| 2 | lisi | NULL |
因为:
lisi 没有详情
但:
LEFT JOIN 会保留左表数据
十一、INNER JOIN 又是什么?
INNER JOIN 表示:
必须匹配成功才返回
INNER JOIN 结果
| id | username | real_name |
|---|---|---|
| 1 | zhangsan | 张三 |
因为:
lisi 没有匹配到 user_detail
所以被过滤掉。
十二、企业里为什么更常用 LEFT JOIN?
因为业务里:
主数据一般必须保留
例如:
用户列表
即使:
用户没填资料
也必须显示用户。
所以:
LEFT JOIN 更常见
十三、真正的企业 JOIN(多表)
企业里经常会:
user
+
user_detail
+
user_address
一起查。
示例
sql
SELECT
u.id,
u.username,
d.real_name,
a.receiver_name,
a.phone,
a.detail_address
FROM user u
LEFT JOIN user_detail d
ON u.id = d.user_id
LEFT JOIN user_address a
ON u.id = a.user_id
WHERE u.id = 1;
十四、这一句 SQL 的业务含义
其实就是:
查询用户详情页
包括:
- 用户名
- 真实姓名
- 收货地址
- 收货电话
👉 你会发现:
JOIN 开始真正服务业务了
十五、JOIN 的本质(一句话讲透)
❗ JOIN 本质不是"表拼接"
而是:
👉 根据相同字段值,组合业务数据
十六、这一篇真正的核心
这一篇最重要的不是:
LEFT JOIN
INNER JOIN
而是:
❗开始理解:
"数据库怎么从多张表,拼成接口数据"
十七、一句话总结
JOIN 的核心:
👉 ON 条件决定"谁和谁是一组数据"
下一篇
SQL 第五篇:SQL 如何真正接入 Spring Boot 项目
我们会开始讲:
Mapper
QueryMapper
MyBatis-Plus
XML
Service
以及:企业里的 SQL 到底写在哪里