Sql server 错误预测的SQL Server查询结果

Sql server 错误预测的SQL Server查询结果,sql-server,Sql Server,我正在为SQL server考试学习,这些问题我回答错了,但我不明白为什么正确的答案是正确的,以及你是如何得到这些答案的 nr naam aantal chef 1 Anouk 14 2 2 Hans 14 NULL 3 Ali 13 5 4 Kees 12 5 5 Ben 3 2 nr soort stad chef 1 cursus DenHaag 2 2 cursus Amsterdam NULL 3

我正在为SQL server考试学习,这些问题我回答错了,但我不明白为什么正确的答案是正确的,以及你是如何得到这些答案的

nr   naam  aantal  chef
1    Anouk  14  2
2    Hans  14  NULL
3    Ali  13  5
4    Kees  12  5
5    Ben  3  2

nr   soort  stad  chef
1    cursus  DenHaag  2
2    cursus  Amsterdam  NULL
3    congres  NewYork  5
4    lezing  Utrecht  5

nr   werknemer  reis  aantal  datum  bedrag
01   1           4  8  17-04-2013  420,56
02   3           3  5  05-04-2013  825,80
03   1           1  5  10-04-2013  140,00
04   null        2  2  10-04-2013  156,75
05   4           4  8  17-04-2013  328,90
06   5           3  5  05-04-2013  560,45
这两个问题是:

a

b

我的答案是:

a: Hans
b: naam   count(*)
Anouk   2
Hans    0
Ali     1
Kees    1
Ben     1
a: none 
b: naam   count(*)
Anouk   2
Hans    1
Ali     1
Kees    1
Ben     1
但正确的答案是:

a: Hans
b: naam   count(*)
Anouk   2
Hans    0
Ali     1
Kees    1
Ben     1
a: none 
b: naam   count(*)
Anouk   2
Hans    1
Ali     1
Kees    1
Ben     1

有人能解释一下我可能漏掉了什么吗?

很可能你漏掉的是,没有办法用“=”来比较NULL和INT。这使您的结果有所不同,您正在考虑将2(Hans)与declaratie中的NULL进行比较将返回false。您应该尝试运行此查询以了解我的意思:

if 1=null or 1=1 print 'true' else print 'false'
if 1=null and 1=1 print 'true' else print 'false'
a) 这是因为执行任何类型的
notin(1,NULL,3,4,5)
返回一个
NULL
结果集,因为SQL不能说任何给定值是否不等于
NULL
,因此有效地返回“我不知道”。对此有一个很好的解释


b)错误的原因是您是从
werknemer
加入的
LEFT-JOIN
。因此,
werknemer
中的所有行都将返回-包括
Hans
COUNT(*)
将返回与该个人相关的行数,因此
Hans
返回1。如果要
COUNT(d.werknemer)
Hans
将为0,因为
Hans
的所有
declaratie
列都将为
NULL
,因为将不满足
JOIN
谓词。

好,因此a是错误的,因为它是NULL。 不能在(1,2,3,null,5)中使用 这将返回一个为空的结果,而您将不会收到任何结果。
对于b,因为使用了左联接,所以这意味着您将获得包含第二个表的所有值的整个原始表。这意味着你得到了hans的一行,但是所有的空值都在左边,因为没有匹配项(但你仍然把它算为一行)

我现在明白了。我在没有NOT的情况下从SQL server上的a启动了查询,它会生成除Hans之外的所有名称,但您说(在(1,NULL,3,4,5)中)会生成一个NULL结果集?我已经澄清了我的观点(a),并提供了一个链接,非常清楚地回答了您的问题。