订阅更新

推荐人不是 2 号的客户:NULL 不等于任何值

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

LeetCode 584 · NULL 与三值逻辑

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

面试怎么回答

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,但对列套函数会让索引失效。
刷题进度保存在当前浏览器