Sql server 错误预测的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
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),并提供了一个链接,非常清楚地回答了您的问题。