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

Calling SELECT * on a primary key versus an attribute in SQL

我目前正在准备期末考试,对其中一个练习题有疑问。

问题状态:

考虑以下两个 SQL 对关系 R(A,B) 的查询,其中属性 A 是主键。

查询 1:SELECT * FROM R WHERE B > 50 OR B <= 50

查询 2:SELECT * FROM R WHERE A > 50 OR A <= 50

哪个是正确的?

一个。查询1和2returnR中的所有记录

b。查询2 returns R中的所有记录,但查询1可能没有

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

我能理解为什么查询 1 不会 return 某些记录的唯一原因是列(或您所说的属性)B 是否可为空。
当将 null 与任何 rdbms 中的任何值进行比较时,我知道你永远不会得到正确的结果,因为 null 根据定义 是一个未知值。 例如,如果您将 and null = null 添加到 where 子句中,您将不会得到任何结果。

所以任何 B 为空的记录都不会从第一个查询中 returned。

A 列不能是这种情况,因为它是主键,并且主键不能为空根据定义

绝对不是。如果有一行 B 为空怎么办?并不是说属性 B 必须不为空,因此查询 1 不会 return 所有具有空(空)B 值的行。

相反,A 不可为空,因为它是主键。

正确答案是第二个,因为A是主键,主键不能为空,所以

A > 50 OR A <= 50

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

B > 50 OR B <= 50

如果 B 为 NULL,则可能为 NULL

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

并且当 B 为 null 时不会返回行。