前言上一篇我们学习了INNER JOIN 内连接它只返回两张表的交集数据。但在真实企业场景里我们经常需要保留左表全部数据无论右表是否匹配。比如查询所有用户包括没下过单的用户查询所有商品包括没被卖过的商品查询所有部门包括还没有员工的部门。这时内连接就不够用了必须使用LEFT JOIN 左连接—— 它是企业实际开发中使用率最高、面试必考的连接方式。本篇从原理、语法、实战、对比、避坑全维度精讲学完直接落地工作。一、本章知识点汇总LEFT JOIN 左连接核心原理左连接标准语法与书写规范LEFT JOIN 与 INNER JOIN 的本质区别左表、右表定义与数据保留规则右表无匹配时 NULL 产生规律与处理实战场景查询全部用户 订单含无订单用户实战场景查询左表存在、右表不存在的数据高频面试题左连接 过滤条件的书写位置ON 与 WHERE 大坑三表左连接实战与企业规范高频避坑与核心总结二、各知识点详解1. LEFT JOIN 核心原理一句话秒懂LEFT JOIN 左连接 保留左表全部记录 右表匹配记录左表写在 LEFT JOIN 左边的表所有行强制保留右表写在 LEFT JOIN 右边的表能匹配就显示不能匹配显示NULL最终结果条数≥ 左表条数等价于左表全集 ∪左表∩右表通俗理解以左表为主右表为辅左表一个都不能少右表匹配不上就填空。2. 左表与右表的定义左表FROM 后面第一张表主表右表LEFT JOIN 后面的表从表企业原则数据量大、必须全显示的表放左边主表3. 标准语法企业强制规范sqlSELECT 左表.字段, 右表.字段 FROM 左表 [AS 别名] LEFT JOIN 右表 [AS 别名] ON 左表.关联字段 右表.关联字段 -- 必须写 [WHERE 过滤条件];4. LEFT JOIN 与 INNER JOIN 核心区别表格对比项INNER JOINLEFT JOIN结果范围只返回交集左表全返回 右表匹配无匹配数据直接丢弃左表保留右表填 NULL企业使用率中等最高典型场景只看有效关联数据必须看全部主数据5. ON 与 WHERE 在 LEFT JOIN 中的关键区别超级大坑ON连接时是否匹配的条件不影响左表保留WHERE连接完成后的过滤会过滤掉左表数据面试高频题想保留左表全部过滤条件必须写在ON还是WHERE 答案右表条件放 ON左表条件放 WHERE。6. 右表为 NULL 的两大用途判断右表无匹配数据如没下单的用户用于取左表独有数据面试高频差集查询三、实战环境准备沿用上篇案例可直接运行sql-- 用户表左表主表 CREATE TABLE users ( user_id INT PRIMARY KEY, user_name VARCHAR(20) NOT NULL, age INT, create_time DATE ); -- 订单表右表从表 CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, amount DECIMAL(10,2), order_time DATE ); INSERT INTO users VALUES (1,张三,25,2024-01-01), (2,李四,30,2024-01-10), (3,王五,28,2024-02-01), (4,赵六,32,2024-03-01), (5,孙七,26,2024-03-15); -- 无订单 INSERT INTO orders VALUES (1001,1,299.00,2024-06-01), (1002,1,158.50,2024-06-15), (1003,2,420.00,2024-06-20), (1004,3,88.00,2024-07-01), (1005,6,350.00,2024-07-10); -- 无用户四、应用案例及结果分析案例 1基础左连接 —— 查询所有用户含无订单用户需求展示所有用户以及他们的订单信息没下单的用户也要显示。sqlSELECT u.user_id, u.user_name, o.order_id, o.amount, o.order_time FROM users u -- 左表主表 LEFT JOIN orders o -- 右表从表 ON u.user_id o.user_id;结果分析左表 5 个用户全部保留有订单的用户订单信息正常显示无订单的用户孙七、赵六右表字段全部为NULL结果条数 ≥ 左表条数这里有 6 条因为张三有 2 个订单案例 2左连接 条件 —— 查询 2024-07 之后的订单保留所有用户需求所有用户都显示只匹配 7 月后订单没下单的依然显示。sqlSELECT u.user_id, u.user_name, o.order_id, o.amount FROM users u LEFT JOIN orders o ON u.user_id o.user_id AND o.order_time 2024-07-01; -- 右表条件放 ON不影响左表结果分析左表依然全部保留只有 7 月后订单被匹配其余订单为 NULL千万不要把条件放 WHERE否则会把左表无匹配数据过滤掉变成内连接效果案例 3面试高频 —— 查询从来没有下过单的用户左表有、右表无sqlSELECT u.user_id, u.user_name FROM users u LEFT JOIN orders o ON u.user_id o.user_id WHERE o.order_id IS NULL; -- 右表主键为NULL 无匹配结果分析直接筛选出赵六、孙七这是企业流失用户、沉默用户、未使用用户的标准查询写法案例 4三表左连接企业真实场景需求所有用户 订单 订单明细无数据显示 NULLsql-- 先建商品表、订单明细表 CREATE TABLE goods(goods_id INT PRIMARY KEY,goods_name VARCHAR(20),price DECIMAL(10,2)); CREATE TABLE order_item(id INT PRIMARY KEY,order_id INT,goods_id INT,num INT); INSERT INTO goods VALUES(1,笔记本,299),(2,键盘,158.5),(3,鼠标,88); INSERT INTO order_item VALUES(1,1001,1,1),(2,1002,2,1),(3,1003,3,1),(4,1004,3,1); -- 三表左连接 SELECT u.user_name, o.order_id, g.goods_name, oi.num FROM users u LEFT JOIN orders o ON u.user_id o.user_id LEFT JOIN order_item oi ON o.order_id oi.order_id LEFT JOIN goods g ON oi.goods_id g.goods_id;结果分析左表 users 全程为主表全部保留多级关联不匹配均显示 NULL电商、报表、统计最常用写法五、注意事项左表右表不要搞反必须全显示的表放左边右表过滤条件优先放 ON否则会把左表数据过滤掉等价于内连接判断无匹配用 IS NULL不能用 NULL** 不要用 SELECT ***多表连接字段多影响性能关联字段必须加索引左连接大数据量下极吃索引左连接结果条数 ≥ 左表条数出现更少说明条件写错禁止在左连接后用 NOT IN容易踩 NULL 陷阱优先用 IS NULL多表连接保持顺序主表 → 从表 1 → 从表 2逻辑清晰六、核心总结LEFT JOIN 以左表为主左表所有记录强制保留右表匹配不上字段全部显示NULL右表条件写 ON左表条件写 WHERE右表主键 IS NULL 左表独有、右表无面试 / 工作高频企业场景用户、商品、部门、员工等必须全量展示的优先用左连接左连接是工作中最常用的连接远超内连接、右连接三表 / 多表左连接主表一直放最左依次关联从表一句话记忆左连接主表全保留右表不匹配填 NULL右表条件放 ON无匹配用 IS NULL七、课后实战练习题附答案思路题目 1用 LEFT JOIN 查询所有用户的姓名、总订单数、总消费金额没下过单的显示 0。 提示用 IFNULL/COALESCE 处理 NULL题目 2查询所有商品以及被购买的次数、总销量没被买过的商品也要显示。参考答案思路题目 1sqlSELECT u.user_name, COUNT(o.order_id) AS order_cnt, COALESCE(SUM(o.amount),0) AS total_amount FROM users u LEFT JOIN orders o ON u.user_id o.user_id GROUP BY u.user_id, u.user_name;题目 2sqlSELECT g.goods_name, COUNT(oi.id) AS buy_cnt, COALESCE(SUM(oi.num),0) AS total_num FROM goods g LEFT JOIN order_item oi ON g.goods_id oi.goods_id GROUP BY g.goods_id, g.goods_name;