我正在学习如何编写TSQL查询。我试图深入了解它们。我从教程中获得的这个查询要求我在第二个WHERE子句中检查NOT NULL。
SELECT *
FROM Person.Person AS p
WHERE NOT p.BusinessEntityID IN (
SELECT PersonID
FROM Sales.Customer
WHERE PersonID IS NOT NULL);
现在,Sales.Customer表对PersonID有一些NULL值。如果我在子查询中删除此WHERE子句,则不会返回任何结果。在我对此问题的明显错误思考中,我认为如果子查询返回NULL,则根本不满足外部查询中WHERE子句的条件。我希望得到一个PersonID不是NULL的行的结果集。为什么它根据这种推理不起作用?
答案 0 :(得分:2)
了解SQL Server如何处理NULL值对于新手来说可能很困难。值NULL表示该值未知。值NULL与空值或零值不同。没有两个空值相等。两个空值之间或NULL与任何其他值之间的比较返回未知,因为每个NULL的值都是未知的。
答案 1 :(得分:1)
如下所示稍作修改(column not in
)
SELECT *
FROM Person AS p
WHERE p.BusinessEntityID NOT IN ( <-- Here
SELECT PersonID
FROM Sales.Customer
WHERE PersonID IS NOT NULL);
您的内部查询返回获取所有字段的所有非null personid和外部查询 来自人员表的限制,BusinessEntityID不属于personid。
答案 2 :(得分:0)
NULL也可以解释为UNKNOWN,因此如果从子查询返回单个NULL,SQL Server将不返回任何行,因为它不知道结果中是否包含值。