上一篇
场景引入:
小明最近接手了一个电商项目📦,用户数据存在users
表,订单数据在orders
表,当他需要查询"VIP用户的未发货订单"时,突然发现——数据像被锁在孤岛上🏝️!别急,今天我们就用最接地气的方式,搞定MySQL多表联查这个"数据拼接术"!
👉 数据分家的烦恼
举个栗子🌰:
-- 单表查询的局限(只能看到订单ID,不知道用户是谁) SELECT * FROM orders WHERE status = '未发货';
使用场景:只查两表有对应关系的记录
SELECT u.username, o.order_id FROM users u INNER JOIN orders o ON u.user_id = o.user_id WHERE u.vip_level > 3 AND o.status = '未发货';
💡 注意:ON
后面是连接条件,WHERE
是过滤条件
使用场景:查用户时,即使没订单也要显示
SELECT u.*, o.order_id FROM users u LEFT JOIN orders o ON u.user_id = o.user_id;
⚠️ 易错点:右表无匹配时显示NULL
SELECT o.*, u.username FROM orders o RIGHT JOIN users u ON o.user_id = u.user_id;
(实际工作中较少使用,通常用左连接替代)
MySQL不直接支持,但可以通过UNION
实现:
SELECT * FROM users LEFT JOIN orders ON... UNION SELECT * FROM users RIGHT JOIN orders ON...;
场景:查员工和直属上级
SELECT a.name AS 员工, b.name AS 上级 FROM employees a JOIN employees b ON a.manager_id = b.emp_id;
SELECT u.username, o.order_no, p.product_name FROM users u JOIN orders o ON u.user_id = o.user_id JOIN products p ON o.product_id = p.product_id;
SELECT u.user_id, COUNT(o.order_id) AS 订单数 FROM users u LEFT JOIN orders o ON u.user_id = o.user_id GROUP BY u.user_id;
SELECT * FROM orders WHERE user_id IN ( SELECT user_id FROM users WHERE vip_level > 3 );
性能杀手:
SELECT *
查全部字段 → 只查需要的列 歧义错误:
-- 错误示范(两表都有create_time字段) SELECT user_id, create_time FROM users JOIN orders...; -- 正确写法 SELECT u.user_id, o.create_time AS order_time...
连接条件遗漏:
ON
条件会导致笛卡尔积(数据爆炸💥) Q:查"从未下过单的用户"应该用?
A) INNER JOIN
B) LEFT JOIN + WHERE IS NULL ✅
C) RIGHT JOIN
(答案:B,左连接后过滤NULL值)
:
多表联查就像乐高积木🧩,掌握JOIN
的拼接逻辑后,你会发现:
下次遇到分散的数据,记得掏出这些SQL组合拳哦!👊
(本文基于MySQL 8.0特性整理,2025-08验证)
本文由 辜映雪 于2025-08-01发表在【云服务器提供商】,文中图片由(辜映雪)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/508031.html
发表评论