错误预测SQL Server查询结果

时间:2016-04-21 11:58:22

标签: sql-server

我正在学习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

有人可以解释一下我可能错过的内容吗?

3 个答案:

答案 0 :(得分:4)

a)是因为执行任何类型的NOT IN (1,NULL,3,4,5)都会返回NULL结果集,因为SQL无法说明任何给定的值是否不等于NULL,从而有效地返回"我不知道"。对此on Stack Overflow有一个很好的解释。

b)错误的原因是你LEFT JOIN来自werknemer。因此,返回werknemer的所有行 - 包括HansCOUNT(*)将返回与该个人相关的行数,以便Hans返回1.您是COUNT(d.werknemer),那么Hans将为0,因为所有declaratie列都会NULLHans,因为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,因为您使用左连接,这意味着您将获得包含第二个值的所有值的整个原始表。所以这意味着你得到一个汉堡的行,但所有的空值都在左侧,因为没有匹配(但你仍然把它算作一行)