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统一代码规范。