为什么查询非管理者员工的MySQL NOT IN语句执行后无返回结果?
问题原因
你执行的查询无返回结果的核心原因是 NOT IN 子查询的返回结果中包含 NULL 值,触发SQL三值逻辑规则导致:
- 从你提供的建表语句可以看到,
mgr字段定义为int default NULL,允许为空。企业员工表中最高级管理者没有上级,mgr字段通常会被设为NULL。 - 当
NOT IN对应的子查询结果包含NULL时,条件判断逻辑等价于empno != 所有mgr非空值 AND empno != NULL。SQL中任意值与NULL做比较的结果都是 UNKNOWN,最终整个WHERE条件判定结果不为真,所以没有行能匹配上查询条件,返回空结果。
修复方案
你可以选择以下任意一种方案解决问题:
- 给子查询添加过滤规则,排除NULL值
SELECT empno FROM emp WHERE empno NOT IN (SELECT mgr FROM emp WHERE mgr IS NOT NULL);
- 改用
NOT EXISTS写法,天然规避NULL值带来的逻辑问题,兼容性更强
SELECT e1.empno FROM emp e1 WHERE NOT EXISTS (SELECT 1 FROM emp e2 WHERE e2.mgr = e1.empno);
内容的提问来源于stack exchange,提问作者Edri
相关产品推荐
相关产品推荐

