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 小时前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
黄忠2 小时前
大模型之LangGraph技术体系
python·llm
云技纵横2 小时前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
沉默王二2 小时前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
冬奇Lab14 小时前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
hboot14 小时前
AI工程师第二课 - 数据处理
人工智能·python·数据分析
小猿姐16 小时前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
用户83562907805119 小时前
使用 Python 自动化 PowerPoint 形状布局与格式设置
后端·python
用户83562907805121 小时前
用 Python 自动化 PowerPoint 演讲者备注添加
后端·python
ClouGence1 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle