常见问题,预设答案:
NOT IN 子句的行为可能会令人困惑,因此需要一些解释。考虑以下查询:
SELECT LastName, FirstName FROM Person.Contact WHERE LastName NOT IN('Hedlund', 'Holloway', NULL)
尽管 AdventureWorks.Person.Contact 中有一千多个不同的姓氏,但该查询不会返回任何内容。对于初学者数据库程序员来说,这可能看起来违反直觉,但实际上是完全有道理的。该解释由几个简单的步骤组成。首先,考虑以下两个查询,它们显然是等价的:
SELECT LastName, FirstName FROM Person.Contact
WHERE LastName IN('Hedlund', 'Holloway', NULL)
SELECT LastName, FirstName FROM Person.Contact
WHERE LastName='Hedlund' OR LastName='Holloway' OR LastName=NULL
请注意,两个查询都会返回预期结果。现在,让我们回顾一下德摩根定理,该定理指出:
not (P and Q) = (not P) or (not Q)
not (P or Q) = (not P) and (not Q)
我从维基百科(http://en.wikipedia.org/wiki/De_Morgan_duality)剪切和粘贴。将 DeMorgan 定理应用于此查询,可以得出这两个查询也是等价的:
SELECT LastName, FirstName FROM Person.Contact WHERE LastName NOT IN('Hedlund', 'Holloway', NULL)
SELECT LastName, FirstName FROM Person.Contact
WHERE LastName<>'Hedlund' AND LastName<>'Holloway' AND LastName<>NULL
最后一个 LastNameNULL 永远不可能为 true