推荐人不是 2 号的客户:NULL 不等于任何值
LeetCode 584 · NULL 与三值逻辑
面试怎么回答
NULL 参与比较的结果是 UNKNOWN,WHERE 会把它过滤掉,所以条件要写成 referee_id != 2 OR referee_id IS NULL。这是 SQL 三值逻辑最常见的坑,NOT IN 遇到 NULL 也是同样的原因。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
客户表里每个客户可能有一个推荐人编号,也可能没有。列出推荐人不是 2 号的所有客户姓名,没有推荐人的客户也算。
表结构
- customer:id(主键)、name、referee_id(可能为空)
思路
SQL 的比较是三值逻辑:NULL 和任何值比较(包括 != 2)结果都是 UNKNOWN,WHERE 只保留 TRUE 的行,所以没有推荐人的客户会被漏掉。要显式加上 OR referee_id IS NULL。
参考解法
SELECT name FROM customer WHERE referee_id != 2 OR referee_id IS NULL;
易错点
- 只写
referee_id != 2或<> 2,没有推荐人的客户全部丢失。 - 也可以写
IFNULL(referee_id, 0) != 2,但对列套函数会让索引失效。