我已经创建了一些查询,无法理解为什么结果不像我预期的那样。
我不明白为什么查询II和III不会返回相同的结果。我希望查询II返回查询I未选择的所有行。
我希望查询II和III能够给出相同的结果。在我看来,III的结果是正确的。
我确定我错过了什么,我只是不知道是什么。
示例:
表:
CREATE TABLE [dbo].[TestTable](
[TestTableId] [int] NOT NULL,
[ValueA] [int] NULL,
[ValueB] [int] NULL
) ON [PRIMARY]
数据:
TestTableId ValueA ValueB
1 10 5
2 20 5
3 10 NULL
4 20 NULL
5 NULL 10
6 10 10
7 NULL NULL
查询:
所有记录: 从TestTable中选择*
予。选择查询:
select * from TestTable
where (ValueA = 10 or ValueA = 20) AND ValueB = 5
结果:
TestTableId ValueA ValueB
1 10 5
2 20 5
II。相同的查询,但不是
select * from TestTable
where NOT ((ValueA = 10 or ValueA = 20) AND ValueB = 5)
结果:
TestTableId ValueA ValueB
5 NULL 10
6 10 NULL
III。与第二个相同的查询(我认为)
select * from TestTable where TestTable.TestTableId not in
(select TestTableId from TestTable
where (ValueA = 10 or ValueA = 20) AND ValueB = 5)
结果:
TestTableId ValueA ValueB
3 10 NULL
4 20 NULL
5 NULL 10
6 10 10
7 NULL NULL
答案 0 :(得分:5)
NULL是有趣的生物。他们会对以下两个问题回答“我不知道”:
Are you 5? (... WHERE ValueB = 5)
和
Are you Not 5? (... WHERE NOT ValueB = 5)
这会导致从两个查询中排除NULL值,如您所见。
您必须以明确解释NULL的方式提出问题:
... WHERE (ValueB IS NULL OR NOT ValueB = 5) ...
答案 1 :(得分:2)
使用NOT
时,NULL
值是特殊情况。
NULL
是未知值。 SQL不能说是NOT
是否为12,但它可以说 是否为12。
一个很好的例子:
你正在参加派对。你知道房间里有12个人中的2个,两个人都叫约翰。你可以告诉我“约翰”是谁。你不能告诉我除了2个“John”之外谁是“Not Jack”。对于SQL,会议室中其他10人的名称为NULL
。