MySQL多表连接详解:INNER JOIN、LEFT JOIN、RIGHT JOIN,区别+案例
前言
实际开发中,90%的业务数据都分散在多张表中:用户表、订单表、商品表、分类表。单表查询完全无法满足需求,多表连接查询是后端开发必备核心技能。
很多新手永远分不清 INNER JOIN、LEFT JOIN、RIGHT JOIN 的使用场景,写关联查询要么数据缺失,要么数据重复。本篇用通俗易懂的讲解+可直接运行的实战案例,彻底搞定多表连接。
一、准备测试数据表
创建两张核心测试表:用户表、订单表,后续所有案例均基于此数据。
-- 用户表 CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL COMMENT '用户名' ); -- 订单表 CREATE TABLE `order` ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT COMMENT '关联用户ID', order_name VARCHAR(50) COMMENT '订单名称' ); -- 插入测试数据 INSERT INTO user (name) VALUES ('张三'),('李四'),('王五'); INSERT INTO `order` (user_id,order_name) VALUES (1,'张三的订单1'), (1,'张三的订单2'), (2,'李四的订单1');数据说明:张三有2个订单,李四有1个订单,王五没有任何订单。
二、INNER JOIN 内连接(交集)
核心作用
只查询两张表中相互匹配、存在关联的数据,取两表数据的交集,任意一方无匹配数据则不展示。
适用场景
查询「有订单的用户」「已产生数据的关联记录」,只需要有效关联数据,过滤无匹配的冗余数据。
实战案例
-- 查询有订单的用户及对应订单 SELECT u.id, u.name, o.order_name FROM user u INNER JOIN `order` o ON u.id = o.user_id;查询结果
只展示张三、李四的订单数据,王五无订单,不会被查询出来。
三、LEFT JOIN 左连接(左表全部+右表匹配)
核心作用
以左表数据为基准,展示左表所有数据,右表匹配到数据则展示,未匹配到则填充 NULL。
适用场景
需要查询「所有用户,包含无订单的用户」「主体数据必须完整,附属数据可有可无」的场景,是开发中使用频率最高的连接方式。
实战案例
-- 查询所有用户,展示对应订单(无订单则显示null) SELECT u.id, u.name, o.order_name FROM user u LEFT JOIN `order` o ON u.id = o.user_id;查询结果
展示所有3个用户,张三、李四展示对应订单,王五订单字段为 NULL。
四、RIGHT JOIN 右连接(右表全部+左表匹配)
核心作用
以右表数据为基准,展示右表所有数据,左表匹配到数据则展示,未匹配到则填充 NULL。
适用场景
极少使用!所有 RIGHT JOIN 都可以改写为 LEFT JOIN,开发中统一用左连接,可读性更高。
实战案例
SELECT u.id, u.name, o.order_name FROM user u RIGHT JOIN `order` o ON u.id = o.user_id;五、三种连接核心区别总结
连接方式 | 查询规则 | 适用场景 |
|---|---|---|
INNER JOIN | 只查两表匹配数据(交集) | 查询有效关联数据,过滤空数据 |
LEFT JOIN | 左表全部 + 右表匹配数据 | 保留主体全部数据,附属数据可选 |
RIGHT JOIN | 右表全部 + 左表匹配数据 | 基本不用,可替换为左连接 |
六、新手高频避坑点
1、LEFT JOIN 筛选右表数据,优先放在 ON 后,不要放 WHERE 后!WHERE 会过滤 NULL 数据,导致左连接失效。
2、多表连接必须写 ON 关联条件,遗漏会产生笛卡尔积,数据爆炸。
3、优先使用 LEFT JOIN,杜绝 RIGHT JOIN,统一代码规范。