考虑关系“enrolled(student, course)”,其中(student, course) 是主键,以及关系“paid(student, amount)”,其中student 是主键。假设没有空值,也没有外键或完整性约束。鉴于以下四个查询:
Query1: select student from enrolled where
student in (select student from paid)
Query2: select student from paid where
student in (select student from enrolled)
Query3: select E.student from enrolled E, paid P
where E.student = P.student
Query4: select student from paid where exists
(select * from enrolled where enrolled.student
= paid.student)
以下哪一项陈述是正确的?
(A)对于任何数据库,所有查询都返回相同的行集
(B) Query2 和 Query4 为所有数据库返回相同的行集,但存在 Query1 和 Query2 返回不同行集的数据库。
(C)存在 Query3 返回的行数严格少于 Query2 的数据库
(D)存在 Query4 将在运行时遇到完整性违规的数据库。答案:(乙)
说明:举个例子:
Table enrolled
student course
----------------
abc c1
xyz c1
abc c2
pqr c1
Table paid
student amount
-----------------
abc 20000
xyz 10000
rst 10000
Output of Query 1
abc
abc
xyz
Output of Query 2
abc
xyz
Output of Query 3
abc
xyz
Output of Query 4
abc
xyz
查询 1 和查询 3 可能会返回重复的学生值,因为“学生”不是注册关系的键,但是查询 2 和查询 4 总是返回相同的行集。
所以,选项(B)是正确的。
这个问题的测验