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

相关推荐
先吃饱再说5 分钟前
从零开发到工程查询:SQLite 嵌入式数据库与高级 SQL 实战
数据库
用户7395480020610 分钟前
本地 CSV 清洗的小细节:先标准化,再去重,并保留可检查的报告
python
ShineWinsu20 分钟前
对于MySQL:数据库的操作的解析
linux·数据库·c++·mysql·面试·笔试·库的操作
AC赳赳老秦30 分钟前
文旅市场公开数据分析:基于 OpenClaw 采集景区客流与门票公示数据,生成区域文旅热度监测报告
java·c语言·python·php·symfony·deepseek·openclaw
青 春 记 忆31 分钟前
零基础入门python68:FastAPI 完整博客运行与项目验收
python·fastapi·后端开发
鹿鹿学长34 分钟前
发题前三天,组委会在过三道关:赛题七渠道首发、知网统一收卷、AI 详情 PDF 首进支撑材料
python·自动化
‎ദ്ദിᵔ.˛.ᵔ₎36 分钟前
MySQL 数据类型
数据库·mysql
云小逸37 分钟前
C++ 第一阶段:对象、内存与生命周期
开发语言·c++
这个DBA有点耶44 分钟前
索引合并不是万能药:MySQL同时用两个索引,为什么比不用还慢?
数据库·mysql·dba
玖玥拾1 小时前
Lua 基础语法(二)
开发语言·unity·lua