MySQL not in查询不出数据,not in结果集中不能包含null
MySQL not in查询不出数据
前言
mysql 的 not in 中,不能包含 null 值。否则,将会返回空结果集。
对于 not in 来说,如果子查询中包含 null 值的话,那么,它将会翻译为 not in null。除了 null 以外的所有数据,都满足这一点。所以,就会出现 not in “失效”的情况。
在MySQL中,当你在 NOT IN 子查询中使用 NULL 值时,可能会导致查询结果为空。具体来说,NOT IN 子查询的行为是:如果子查询结果中有任何 NULL 值,整个 NOT IN 的条件判断就会变得不可确定,从而导致查询返回空结果。
解决方法:
- 1.使用 NOT EXISTS 替代 NOT IN: NOT EXISTS 不会受到子查询结果中包含 NULL 值的影响,因为它只关心子查询是否返回任何行,而不是具体的值。这是解决 NOT IN 查询返回空结果的常见做法。
- 2.确保子查询没有 NULL 值: 你可以修改子查询,确保它不返回 NULL 值。例如,使用 WHERE account IS NOT NULL 来排除 NULL 值。
解决方案1:使用 NOT EXISTS
SELECT
m.cCode, m.cName, a.cBankAccount, a.cBankAccountName
FROM
agentfinancialnew a
LEFT JOIN
merchant m ON a.imerchantId = m.id
WHERE
NOT EXISTS (
SELECT 1
FROM bank_zzg b
WHERE b.account = a.cBankAccount
);
解决方案2:排除 NULL 值
SELECT
m.cCode, m.cName, a.cBankAccount, a.cBankAccountName
FROM
agentfinancialnew a
LEFT JOIN
merchant m ON a.imerchantId = m.id
WHERE
a.cBankAccount NOT IN (
SELECT `account`
FROM bank_zzg
WHERE `account` IS NOT NULL
);
为什么 NOT IN 子查询会导致空结果:
假设 bank_zzg 表的 account 列中有 NULL 值,NOT IN 子查询的行为是:如果其中有一个值是 NULL,那么整个 NOT IN 操作就变得不可确定,因为 NULL 与任何值的比较结果都是 UNKNOWN,不会被认为是 TRUE 或 FALSE,因此会导致结果为空。
结论:
使用 NOT EXISTS 是更稳定且不受 NULL 值影响的解决方案。
如果坚持使用 NOT IN,则确保子查询结果没有 NULL 值,或者在子查询中明确排除 NULL 值。

浙公网安备 33010602011771号