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 值。

posted @ 2026-05-21 16:47  数据库小白(专注)  阅读(17)  评论(0)    收藏  举报