在主键上调用SELECT *而在SQL中调用属性

时间:2015-06-08 10:03:09

标签: mysql sql select primary-key

我目前正在参加决赛,并对其中一个练习问题提出疑问。

问题是:

考虑关系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也不会返回每条记录吗?

3 个答案:

答案 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不可为空,因为它是主键。