LEFT JOIN
LEFT JOIN 保留左表的全部行,右表能匹配上就填数据,匹配不上填 NULL。"哪个员工还没有领过绩效奖金""哪些商品从来没被下过单"——这类"找缺失"问题,LEFT JOIN 是第一选择。
把条件放在 ON 还是 WHERE 决定结果:ON 条件影响连接过程——右表不满足 ON 条件时返回 NULL;WHERE 条件在连接之后过滤——如果 WHERE 要求右表某列不为 NULL,效果等价于 INNER JOIN,左表不匹配的行会被筛掉。
以飞翔科技为例。员工表连工资详细表,拿完整的工资明细:
-- 所有员工的基本工资 + 奖金(无奖金记录显示 NULL)
SELECT e.emp_name, e.basic_salary, s.bonus_amount
FROM employees e
LEFT JOIN salary_details s ON e.emp_id = s.emp_id;
-- 找出没有绩效奖金的员工(右表匹配不上)
SELECT e.emp_name, e.dept_code
FROM employees e
LEFT JOIN bonus_records b ON e.emp_id = b.emp_id
WHERE b.emp_id IS NULL;
-- LEFT JOIN 后聚合:每个部门有奖金的人数
SELECT d.dept_name, COUNT(b.emp_id) AS 有奖金人数
FROM departments d
LEFT JOIN employees e ON d.dept_id = e.dept_code
LEFT JOIN bonus_records b ON e.emp_id = b.emp_id
GROUP BY d.dept_name;
第二个例子是 LEFT JOIN 的经典"反连接"用法:WHERE 右表.关联列 IS NULL 精准定位"左表有而右表无"的行。第三个例子即使用了 LEFT JOIN,COUNT(b.emp_id) 会自动忽略 NULL——这正好统计出有奖金的人数。