SQL 第四篇:JOIN 实战(数据库到底是怎么“拼表”的)

一、前言

上一篇
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 到底写在哪里

相关推荐
这个DBA有点耶1 小时前
数据库教程:从零基础到实战的完整学习路径(2026版)
数据库·程序员·代码规范
forestsea1 小时前
从零构建 Java 智能体 RAG 系统:Milvus 向量数据库实战指南
java·数据库·milvus
默 语2 小时前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
probex_2 小时前
从 ByConity 到 VictoriaMetrics:一次指标数据迁移引发的四种存储对比
数据库
用户3074596982072 小时前
MySQL EXPLAIN 零基础完全精通指南:从"看不懂"到"会优化"
mysql
Patrick在香港3 小时前
Python 审计香港开放数据目录:两个端点差 10 倍,只有 9.3% 的资源标了「最后修改时间」
开发语言·数据库·python·数据分析·api·数据治理·开放数据
这个DBA有点耶3 小时前
自增主键用尽了怎么办?INT溢出、在线迁移与预防策略全解析
数据库·mysql·代码规范
迷茫的大专生3 小时前
高可用总结
redis·mysql·nginx·高可用
老纪的技术唠嗑局3 小时前
Agent 习惯性删库跑路,数据库纷纷学 Git 续命
数据库·人工智能
Data_Journal3 小时前
使用 AutoScraper 进行网页抓取:分步教程
大数据·开发语言·数据库·python·scrapy