奖金低于 1000 的员工:没有奖金也算
LeetCode 577 · LEFT JOIN、NULL 判断
面试怎么回答
LEFT JOIN 保留所有员工,WHERE 写 bonus < 1000 OR bonus IS NULL。NULL 和任何值比较都是未知,不单独处理就会把没奖金的人过滤掉,这是 SQL 三值逻辑的典型坑。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
员工表和奖金表按员工 ID 关联,找出奖金少于 1000 的员工姓名和奖金;没有奖金记录的员工也算在内,奖金显示为空。
表结构
- Employee:empId(主键)、name、supervisor、salary
- Bonus:empId(主键)、bonus
思路
没奖金记录的员工也要,所以用 LEFT JOIN。关键在过滤条件:bonus < 1000 对 NULL 的结果是未知,会被过滤掉,必须再加上 OR bonus IS NULL。
参考解法
select name,bonus
from Employee e
left join Bonus b on e.empId=b.empId
where bonus<1000 or bonus is null
易错点
- 只写
WHERE bonus < 1000,没有奖金记录的员工全丢了。 - 也可以写
COALESCE(bonus, 0) < 1000,但这会让索引失效,大表上要注意。