MySQL 多表查询

👨‍💻 关于作者:会编程的土豆

"不是因为看见希望才坚持,而是坚持了才看见希望。"

你好,我是会编程的土豆,一名热爱后端技术的Java学习者。

📚 正在更新中的专栏:

💕作者简介:后端学习者


一、先搞清楚一件事:为什么要多表?

你先记住一句话:

数据库里的数据,不会全放在一张表里

举个最简单的例子:

用户表 user

id name
1 张三
2 李四

订单表 orders

id user_id price
1 1 100
2 1 200

现在问题来了:

我要查:"张三买了多少钱"

你会发现:

  • user 表里没有 price

  • orders 表里没有 name

所以必须:

把两张表"拼在一起"查

这就是多表查询。


二、最原始的多表查询

先看一个最笨的方法:

复制代码
SELECT *
FROM user, orders;

结果会是:

两张表"乱配对"(笛卡尔积)

复制代码
张三 + 订单1
张三 + 订单2
李四 + 订单1
李四 + 订单2

明显有问题


三、加一个条件

复制代码
SELECT *
FROM user, orders
WHERE user.id = orders.user_id;

现在就正常了:

只匹配"对得上的"

复制代码
张三 + 订单1
张三 + 订单2

四、进化版写法:JOIN

上面的写法还能用,但现在基本都用 JOIN:

复制代码
SELECT *
FROM user
JOIN orders
ON user.id = orders.user_id;

你可以这样理解:

  • FROM user → 先拿用户表

  • JOIN orders → 把订单表拿过来

  • ON → 规定怎么匹配


五、第一种连接:INNER JOIN

复制代码
SELECT *
FROM user
INNER JOIN orders
ON user.id = orders.user_id;

含义:

只要"匹配成功"的数据

也就是说:

  • 有订单的用户 → 保留

  • 没订单的用户 → 直接消失


六、第二种连接:LEFT JOIN

现在加一个用户:

id name
3 王五

但他没有订单。

用 INNER JOIN:

复制代码
SELECT *
FROM user
JOIN orders
ON user.id = orders.user_id;

王五直接没了


用 LEFT JOIN:

复制代码
SELECT *
FROM user
LEFT JOIN orders
ON user.id = orders.user_id;

结果:

复制代码
张三 + 订单
李四 + NULL
王五 + NULL

一句话理解:

LEFT JOIN = 左边的表,全都要!

右边没有就补 NULL。


七、你现在真正需要记住的核心

就这两句:

INNER JOIN

只要匹配上的

LEFT JOIN

左表全要,右表没有就 NULL


八、写一个完整实战

需求:查"用户 + 订单金额"

复制代码
SELECT user.name, orders.price
FROM user
LEFT JOIN orders
ON user.id = orders.user_id;

九、多表查询(3张表)

再加一张表:

商品表 product

id name
1 手机
2 电脑

orders 变成:

| id | user_id | product_id | price |


查:谁买了什么

复制代码
SELECT u.name, p.name, o.price
FROM user u
JOIN orders o ON u.id = o.user_id
JOIN product p ON o.product_id = p.id;

理解顺序(非常重要)

复制代码
user
  ↓
join orders
  ↓
join product

一层一层拼


十、新手最容易犯的错

错误1:不写 ON

复制代码
JOIN orders

直接炸(不知道怎么匹配)


错误2:字段不加表名

复制代码
SELECT id

多表里 id 会冲突

正确写法:

复制代码
SELECT user.id

或者用别名:

复制代码
SELECT u.id

错误3:LEFT JOIN + WHERE 写错

复制代码
SELECT *
FROM user u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.price > 100;

这会把 LEFT JOIN 变成 INNER JOIN

因为 NULL 被过滤掉了。


十一、一个技巧

查:没有订单的用户

复制代码
SELECT u.*
FROM user u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;

核心思路:

  • 先 LEFT JOIN

  • 再找 NULL

相关推荐
Wang's Blog5 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
信誓旦旦的程序猿5 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
Lethehong5 小时前
Oracle 加个字段,目标库就报错?KFS 用“先拆后组“打通异构 DDL
数据库·oracle
砚底藏山河5 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年5 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym6 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
Web极客码6 小时前
锁定真正的磁盘卡顿:我用 OpenCode 配合 eBPF 诊断 NVMe 队列深度延迟与 I/O 写放大
数据库·oracle
DongQiShanRen6 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CS创新实验室6 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
CCblandy6 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构