在主键上调用 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 时不会返回行。
我目前正在准备期末考试,对其中一个练习题有疑问。
问题状态:
考虑以下两个 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 时不会返回行。