右连接 / 全连接|场景区分 + NULL 值处理技巧(实战演练) 前言前面我们已经掌握了INNER JOIN 内连接取交集和LEFT JOIN 左连接保留左表全部这两种基本能覆盖企业 90% 的场景。但在部分特殊业务中我们还需要保留右表全部或两张表都要全部保留这时就要用到RIGHT JOIN 右连接和FULL JOIN 全连接。本篇会把右连接、全连接的原理、语法、场景、区别、NULL 处理、避坑一次性讲一、本章知识点汇总RIGHT JOIN 右连接核心原理FULL JOIN 全连接核心原理右连接与左连接的互换关系全连接在 MySQL 中的实现方式UNION ALLNULL 值产生规律与处理技巧IFNULL、COALESCE右连接实战案例以订单表为主全连接实战案例两张表数据全保留四大连接对比总结内 / 左 / 右 / 全企业使用规范与避坑要点课后实战练习题二、各知识点详解1. RIGHT JOIN 右连接保留右表全部核心原理一句话RIGHT JOIN 保留右表全部数据左表能匹配就显示不能匹配显示 NULL。右表全部强制保留左表匹配成功显示不成功 → NULL结果条数≥ 右表条数与左连接关系超级重要A RIGHT JOIN B B LEFT JOIN A实际工作中几乎不用 RIGHT JOIN全部可以转成 LEFT JOIN 写更易读。标准语法sqlSELECT 字段列表 FROM 左表 RIGHT JOIN 右表 ON 左表.关联字段 右表.关联字段;2. FULL JOIN 全连接两张表都保留核心原理FULL JOIN 左表全部 右表全部匹配不上的一侧全部填 NULL。等价于左表结果 UNION 右表结果去重重要提醒MySQL 8.0 不支持 FULL JOIN 语法必须用LEFT JOIN UNION RIGHT JOIN实现。3. 四大连接一次性对比面试必背表格连接类型保留数据匹配规则企业使用率INNER JOIN交集两边都匹配才显示中LEFT JOIN左表全部左表全保留右表补 NULL最高90%RIGHT JOIN右表全部右表全保留左表补 NULL极低FULL JOIN两张表全部两边都保留不匹配补 NULL少统计用4. NULL 值处理技巧工作必备多表连接一定会出现 NULL必须学会处理IFNULL (字段替换值)MySQL 专用COALESCE (字段 1, 字段 2…, 替换值)通用标准推荐示例sqlCOALESCE(SUM(amount), 0) -- 没订单时金额显示0不显示NULL三、实战环境准备直接复制运行继续使用用户表 订单表包含脏数据方便观察连接效果sql-- 用户表 CREATE TABLE users ( user_id INT PRIMARY KEY, user_name VARCHAR(20) NOT NULL, age INT ); -- 订单表 CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, amount DECIMAL(10,2), order_time DATE ); INSERT INTO users VALUES (1,张三,25), (2,李四,30), (3,王五,28), (4,赵六,32), (5,孙七,26); INSERT INTO orders VALUES (1001,1,299,2024-06-01), (1002,1,158.5,2024-06-15), (1003,2,420,2024-06-20), (1004,3,88,2024-07-01), (1005,6,350,2024-07-10); -- 无对应用户四、应用案例及结果分析案例 1RIGHT JOIN 右连接实战以订单表为主需求显示所有订单包括无对应用户的脏订单匹配不到用户的显示 NULL。sqlSELECT u.user_name, o.order_id, o.amount FROM users u RIGHT JOIN orders o ON u.user_id o.user_id;结果分析订单 1005user_id6强制保留该订单无对应用户 → user_name NULL右表orders5 条记录全部显示案例 2右连接查询 “无对应用户的脏订单”需求找出订单表存在、但用户表不存在的脏数据运维 / 数据治理高频。sqlSELECT o.order_id, o.amount FROM users u RIGHT JOIN orders o ON u.user_id o.user_id WHERE u.user_id IS NULL;结果分析只会返回订单 1005典型用于数据清洗、脏数据排查案例 3FULL JOIN 全连接实现MySQL 兼容版需求显示所有用户 所有订单不管是否能匹配。sql-- 左连接 右连接去重合并 全连接 SELECT u.user_name, o.order_id, o.amount FROM users u LEFT JOIN orders o ON u.user_id o.user_id UNION -- 自动去重 SELECT u.user_name, o.order_id, o.amount FROM users u RIGHT JOIN orders o ON u.user_id o.user_id;结果分析所有用户5 人全部出现所有订单5 单全部出现不匹配的一侧全部为 NULL用于全量对账、全量统计场景案例 4带 NULL 处理的统计报表需求按订单统计用户名、订单金额无用户则显示 “未知用户”。sqlSELECT COALESCE(u.user_name, 未知用户) AS user_name, o.order_id, COALESCE(o.amount, 0) AS amount FROM users u RIGHT JOIN orders o ON u.user_id o.user_id;五、注意事项右连接能不用就不用全部换成左连接可读性更高MySQL 无 FULL JOIN必须用 UNION 实现UNION 会去重UNION ALL 更快全连接优先用 UNION ALL 再去重判断不存在数据必须用IS NULL / IS NOT NULL不能用 NULL报表展示必须用COALESCE处理 NULL避免前端显示异常右连接 / 全连接尽量少用在大表性能低于左连接脏数据排查优先用RIGHT JOIN IS NULL多表连接时主业务表永远放左边用 LEFT JOIN六、核心总结RIGHT JOIN 保留右表全部左表不匹配补 NULL右连接 ↔ 左连接可以互换企业优先用LEFT JOINFULL JOIN 两张表全部保留MySQL 用 UNION 实现NULL 处理统一用COALESCE (字段0/‘未知’)四大连接核心口诀内连接看交集左连接看左表右连接看右表全连接全都要工作中 90% 场景用LEFT JOIN即可搞定一句话记忆右连接保右表全连接全都保MySQL 无全连接UNION 来代劳NULL 不美观COALESCE 搞一搞七、课后实战练习题附思路题目 1使用 RIGHT JOIN 查询所有订单信息并显示对应用户名没有用户的显示 “脏订单”。题目 2用 FULL JOINUNION 实现查询所有用户与所有订单的完整清单并处理 NULL 展示。参考答案思路题目 1sqlSELECT o.order_id, o.amount, COALESCE(u.user_name, 脏订单) AS user_name FROM users u RIGHT JOIN orders o ON u.user_id o.user_id;题目 2sqlSELECT COALESCE(u.user_name,无用户) AS user_name, COALESCE(o.order_id,0) AS order_id FROM users u LEFT JOIN orders o ON u.user_id o.user_id UNION SELECT COALESCE(u.user_name,无用户), COALESCE(o.order_id,0) FROM users u RIGHT JOIN orders o ON u.user_id o.user_id;