news 2026/9/5 8:52:51

如何实现MySQL多表联查

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何实现MySQL多表联查

MySQL 多表联查

多表联查核心就是JOIN(连接),分为:INNER JOINLEFT JOINRIGHT JOINFULL JOIN(MySQL 不支持,用 union 模拟),还有隐式连接(逗号写法)。

准备两张示例表

-- 用户表 user CREATE TABLE user( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), age INT ); -- 订单表 order CREATE TABLE `order`( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, -- 外键,关联user.id order_name VARCHAR(50) );

1、内连接 INNER JOIN(最常用)

只返回两张表匹配上的数据,两边都有才出结果
语法:

SELECT 字段 FROM 表A INNER JOIN 表B ON 表A.关联字段 = 表B.关联字段;

示例:查询用户以及对应的订单

SELECT u.name, o.order_name FROM user u INNER JOIN `order` o ON u.id = o.user_id;

别名:u代表 user,o代表 order

隐式内连接(逗号写法,等价 inner join)

SELECT u.name, o.order_name FROM user u,`order` o WHERE u.id = o.user_id;

⚠️不要忘记 where 条件,否则会产生笛卡尔积(数据爆炸)

2、左连接 LEFT JOIN(LEFT OUTER JOIN)

以左边表为主,左表全部数据都展示;右表匹配不到,字段为 NULL

SELECT u.name, o.order_name FROM user u LEFT JOIN `order` o ON u.id = o.user_id;

场景:查询所有用户,包含没有下单的用户

如果只想查左表有、右表没有的数据(没有订单的用户):

SELECT u.name FROM user u LEFT JOIN `order` o ON u.id = o.user_id WHERE o.id IS NULL;

3、右连接 RIGHT JOIN

以右边表为主,右表全部数据,左表匹配不到则 NULL

SELECT u.name, o.order_name FROM user u RIGHT JOIN `order` o ON u.id = o.user_id;

4、全连接 FULL JOIN

MySQL没有 FULL JOIN 关键字,想要左右全部数据,用LEFT JOIN UNION RIGHT JOIN

SELECT u.name, o.order_name FROM user u LEFT JOIN `order` o ON u.id=o.user_id UNION SELECT u.name, o.order_name FROM user u RIGHT JOIN `order` o ON u.id=o.user_id;

5、三张及以上表联查

多张表就继续JOIN ... ON往后拼接

SELECT u.name,o.order_name,g.goods_name FROM user u LEFT JOIN `order` o ON u.id = o.user_id LEFT JOIN goods g ON o.goods_id = g.id;

6、子查询实现多表(不是 JOIN,另一种方案)

-- where中子查询 SELECT * FROM user WHERE id IN (SELECT user_id FROM `order`); -- from子查询(派生表) SELECT * FROM (SELECT * FROM user WHERE age>18) t1 LEFT JOIN `order` o ON t1.id = o.user_id;

7、关键注意事项

  1. ON 和 WHERE 的区别
  • ON:join 连接时做匹配条件
  • WHERE:连接完成之后,对结果集过滤

left join 中,条件写 on 和 where 结果完全不一样!

示例坑点:

-- ❌错误:left join后where过滤order表,会把null数据过滤掉,退化成内连接 SELECT u.name,o.order_name FROM user u LEFT JOIN `order` o ON u.id=o.user_id WHERE o.order_name='手机'; -- ✅正确,把条件放on SELECT u.name,o.order_name FROM user u LEFT JOIN `order` o ON u.id=o.user_id AND o.order_name='手机';
  1. 避免笛卡尔积:join 必须写 on 关联条件
  2. 字段重名,必须指定表别名:u.id,不能只写id
  3. 性能:关联字段建议建立索引(外键字段加索引,联查速度提升巨大)

快速选型记忆

表格

连接类型作用
INNER JOIN两边匹配的数据
LEFT JOIN左边全部,右边匹配
RIGHT JOIN右边全部,左边匹配
UNION合并结果集
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 8:50:19

液位传感器选型与维护:原理分类、常见误区及标定指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 8:47:06

工业一体机选购后CAN总线通信开发实战:SocketCAN配置到报文解析全流程

CAN总线是工业控制领域广泛使用的串行通信协议,采用差分信号传输,具备总线仲裁、错误检测和自动重传机制,在电磁干扰较强的工业现场中能够保持较高的通信可靠性和实时性。搞工控的开发者大概率绕不开这东西,今天就把我自己折腾Soc…

作者头像 李华
网站建设 2026/9/5 8:45:27

程序员给娃取名踩过的那些现实坑

做开发这么多年,处理过无数需求、调过无数 bug,总觉得逻辑推演、条件筛选这套方法论可以套用到生活的方方面面。等到家里准备给新生儿取名的时候,才发现这件事和写代码完全不一样。代码的输入输出是确定的,边界条件可以枚举穷尽&a…

作者头像 李华
网站建设 2026/9/5 8:40:25

放弃垃圾的libmodbus吧, 还有很多更好的选择

如果就是“懒得手写原生协议解析,想找个靠谱、现代、架构不脑残的第三方库”,业内确实有几个比 libmodbus 好用十倍的替代方案。 针对不同需求,我给你推荐 4 个各具特色的顶流选择: ────── 1. 工业界目前口碑最好的纯 C 库…

作者头像 李华
网站建设 2026/9/5 8:39:55

文件修改管理工具核心功能与部署实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华