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

相关推荐
deli0070071 小时前
JSON 树形查看器:粘贴即解析,折叠展开一目了然
前端·数据库·json·ai编程
国科安芯1 小时前
轨道供电韧性:ASP4644四通道降压架构在低轨卫星平台电源管理中的适用性分析
运维·网络·数据库·嵌入式硬件·架构·状态模式·低轨卫星星座
好好学习的星熊2 小时前
SQL 面试题(数据分析师)
sql·mysql
破土士V2 小时前
MySQL基础知识集合
数据库·mysql
笃行3502 小时前
达梦 VS 金仓:数据库替换项目里,迁移工具的差距体现在哪一层
数据库
笃行3502 小时前
向量数据库之后,一份合同为什么在五个库里对不上
数据库
笃行3502 小时前
数据库迁移工具装在一台笔记本上的年代,该翻篇了
数据库
笃行3502 小时前
一张表底下几千个分片:金仓时序数据库的超表怎么工作
数据库
whcyhhh3 小时前
头歌实践教学平台:数据科学与大数据技术导论(七上)
大数据·数据库·python
夕除3 小时前
redis--007
数据库·分布式