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

相关推荐
2601_956319881 分钟前
最新AI量化提效,先做可验证的小流程
人工智能·python
KaMeidebaby32 分钟前
卡梅德生物技术快报|小 RNA 适配体合成 + 多方法亲和力表征全流程标准化操作手册
前端·网络·数据库·人工智能·算法
卓怡学长42 分钟前
w269基于spring boot + vue 候鸟监测数据管理系统
java·数据库·spring boot·spring·intellij-idea
ClouGence1 小时前
MySQL 到 StarRocks 数据迁移同步:同步方案与实践指南
数据库·mysql
行业研究员1 小时前
当数据生产者变成 Agent,数据库底座如何重构?
大数据·数据库·重构
人工智能培训1 小时前
破解数据发展瓶颈 激活数字经济新动能
大数据·数据库·人工智能·深度学习·神经网络·机器学习·生成对抗网络
李燚1 小时前
Go 项目怎么组织:DDD 4 层 vs MVC vs 脚本式
开发语言·golang·mvc·ddd·agent框架·eino
开飞机的舒克_1 小时前
FastAPI 实战入门:从路由、参数校验到依赖注入的后端开发指南
python·fastapi
1234567890@world2 小时前
知识管理 | 数字化 | APQC
大数据·数据库·人工智能
霸道流氓气质2 小时前
Kiro 中反编译 JAR 包并分析字节码的流程指南
chrome·python·jar