我正在学习SQL服务器考试,我得到了这些问题我回答错了,但我不明白为什么正确的答案是正确的以及你是如何得到的。
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
这两个问题是:
一个。
SELECT naam
FROM werknemer
WHERE nr NOT IN (SELECT werknemer
FROM declaratie);
湾
SELECT naam, COUNT(*)
FROM werknemer w LEFT OUTER JOIN declaratie d ON w.nr = d.werknemer
GROUP BY naam;
我的回答是:
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
有人可以解释一下我可能错过的内容吗?
答案 0 :(得分:4)
a)是因为执行任何类型的NOT IN (1,NULL,3,4,5)
都会返回NULL
结果集,因为SQL无法说明任何给定的值是否不等于NULL
,从而有效地返回"我不知道"。对此on Stack Overflow有一个很好的解释。
b)错误的原因是你LEFT JOIN
来自werknemer
。因此,返回werknemer
的所有行 - 包括Hans
。 COUNT(*)
将返回与该个人相关的行数,以便Hans
返回1.您是COUNT(d.werknemer)
,那么Hans
将为0,因为所有declaratie
列都会NULL
为Hans
,因为JOIN
谓词不会得到满足。
答案 1 :(得分:1)
您错过的很可能是使用' ='无法比较NULL和INT。这会使您的结果不同,您正在考虑将来自declaratie的2(Hans)与NULL进行比较将返回false。您应该尝试运行此查询以查看我的意思:
if 1=null or 1=1 print 'true' else print 'false'
if 1=null and 1=1 print 'true' else print 'false'
答案 2 :(得分:1)
好的,所以这是空的错误。 你无法使用(1,2,3,null,5) 这将返回一个无效的结果,你将不会收到任何结果。 对于b,因为您使用左连接,这意味着您将获得包含第二个值的所有值的整个原始表。所以这意味着你得到一个汉堡的行,但所有的空值都在左侧,因为没有匹配(但你仍然把它算作一行)