在SQL中,调用主键与属性的SELECT *有何区别?

3

我目前在备考期末考试,有一个关于练习问题的疑问。

问题陈述如下:

考虑以下两个针对关系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

哪个是正确的?

a. 查询1和查询2都返回R中的所有记录

b. 查询2返回R中的所有记录,但查询1可能不会

官方答案说b是正确的,但我想知道为什么。我明白主键必须是唯一的,这意味着查询2应该返回每条记录。但是,即使存在重复的B值,查询1也不会返回每条记录吗?

3个回答

6
正确答案是第二个,因为A是主键,主键不能为null,所以。
A > 50 OR A <= 50

将始终为真,而以下内容:

B > 50 OR B <= 50

如果B为NULL,则可能为空

NULL > 50 OR NULL <= 50 ---> NULL

当B为null时,相应的行将不会被返回。


2
我能理解的唯一一个导致查询1无法返回某些记录的原因是列B(或者你称之为属性)可以为空。
在任何我所知道的关系型数据库管理系统中,当将null与任何值进行比较时都无法得到正确的结果,因为null从定义上来说是一个未知的值。 例如,如果你在where子句中添加and null = null,你将不会得到任何结果。

因此,任何B为空的记录都不会从第一个查询中返回。

对于列A来说,这种情况是不可能的,因为它是主键,而主键从定义上来说不能为null。


0
绝对不行。如果有一行B为空怎么办?并没有说属性B必须非空,因此查询1将不会返回所有具有空(null)B值的行。
相反,A是不可为空的,因为它是主键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接