在包含`NOT`的SQL中需尤其注意NULL的情况 Beware NULL Values When SQL Contains `NOT`

MySQL运算:

SELECT NULL != 1 => NULL (false)

SELECT NULL = 1 => NULL (false)

SELECT NULL IN ('A', 'B') => NULL (false)

SELECT NULL NOT IN ('A', 'B') => NULL (false)

当你书写如下SQL(返回所有t.attr不为1或者2的行) - When you write the below SQL:

SELECT * FROM table_ t WHERE t.attr NOT IN (1, 2)

很可能应该是 - Probably what you really mean is:

SELECT * FROM table_ t WHERE t.attr IS NULL OR t.attr NOT IN (1, 2)

这样表述的情况是:只要t.attr不是1,也不是2, 但t.attr值可以为NULL。

结论:在包含‘NOT’的SQL中需尤其注意NULL的情况 Beware NULL Values When SQL Contains ‘NOT’