订阅更新

奖金低于 1000 的员工:没有奖金也算

SQL 实战 123 题 · 第 22 题 简单 约 2 分钟读完

LeetCode 577 · LEFT JOIN、NULL 判断

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

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,但这会让索引失效,大表上要注意。
刷题进度保存在当前浏览器