【SQL】NOT IN 遇到 NULL 为什么返回空集?三值逻辑与反关联实战有一条“找出从未下过单的用户”的 SQL,测试环境返回几十行,上线后却突然变成 0 行。用户表有数据、订单子查询也有数据,执行计划看起来正常,问题可能只藏在一条订单的 user_id IS NULL。NOT IN 的结果不是简单的“左边不在右边集合里”:只要匹配失败但候选集合里有 NULL,比较结果就可能是 UNKNOWN,WHERE 会把它过滤掉。本文用 SQLite 自带的 Python 驱动构造最小复现,再给出何时选 NOT EXISTS、何时保留 NOT IN,以及怎样避免改写时意外改变 NULL