我目前正在参加决赛,并对其中一个练习问题提出疑问。
问题是:
考虑关系R(A,B)
的以下两个SQL查询,其中属性A
是主键。
查询1:SELECT * FROM R WHERE B > 50 OR B <= 50
查询2:SELECT * FROM R WHERE A > 50 OR A <= 50
哪个是对的?
一个。查询1和2返回R
湾查询2返回R
中的所有记录,但查询1可能不是
官方回答说b是正确的,但我想知道原因。我知道主键必须是唯一的,这意味着查询2应该返回每条记录。但即使存在重复的B
值,查询1也不会返回每条记录吗?
答案 0 :(得分:6)
正确答案是第二个,因为A是主键而主键不能为空,所以
A > 50 OR A <= 50
永远是真的,而以下是:
B > 50 OR B <= 50
如果B为NULL,可能为NULL
NULL > 50 OR NULL <= 50 ---> NULL
,只要B为null,就不会返回行。
答案 1 :(得分:2)
我可以看到为什么查询1不会返回某些记录的唯一原因是列(或称为属性)B可以为空。
将null与任何rdbms中的任何值进行比较时,我知道您将永远无法获得正确的结果,因为null
定义是未知值。
例如,如果添加到where子句and null = null
,则根本不会得到任何结果。
因此,任何B为null的记录都不会从第一个查询中返回。
A列不是这种情况,因为它是主键,而主键根据定义不能为空。
答案 2 :(得分:0)
绝对不是。如果有一个B null行怎么办?并不是说属性B必须不为空,因此查询1不会返回所有具有空(空)B值的行。
相反,A不可为空,因为它是主键。