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

相关推荐
白杨尚青1 分钟前
C++入门篇(十):string(上)——认识string:构造与三大遍历(一条龙讲透operator[]、迭代器、auto、范围for)
java·开发语言·c++·笔记·stl
2601_952196362 分钟前
计算机科学与技术专业应届生投商业分析岗,需要哪些额外能力?
数据库·oracle
可乐鸡翅yeah_6 分钟前
hls.js 切换多个视频源,新手开发常见踩坑
开发语言·前端·javascript·ios·ffmpeg·音视频·safari
皮皮学姐分享-ppx7 分钟前
地级市、省级人才政策强度测算(2000-2025)
大数据·数据库·人工智能·百度·高考
Tanshu_API君9 分钟前
API 聚合平台选型指南:从参数拆解到生产落地的十个评估维度
开发语言·api
Chen—LSN10 分钟前
C语言——⽂件操作(1)
c语言·开发语言·c++·经验分享·笔记·算法·链表
晚安日记wanna13 分钟前
大厂禁 JOIN 的真正原因,拆到第四层才清楚
数据库·后端·面试
狗凯之家源码网13 分钟前
PHP 开源 IM 即时通讯系统效果实测与功能展示
开发语言·开源·php
虎虎(_ _)。゜zzZ27 分钟前
关于字典中的解包问题
python
辛苦才能30 分钟前
C++ map/set 深度解析:从关联式容器的本质到 operator[] 的三重身份
开发语言·c++