我得到了一个练习,其答案很大程度上依赖于关系代数过程查询语言。 不幸的是,鉴于我的经验和水平有限,我无法完全理解它的要求,特别是由于它的编写方式。
练习如下:
考虑以下关系数据库模式:
人(ID、名字、姓氏、昵称) 如下(pID1,pID2)
关系实例 person 存储每个人的信息。每个人都通过他们的 ID 来识别。关系实例 follow 跟踪谁关注谁,即 pID1 follow pID2。属性 pID1 和 pID2 都是关系人中属性 ID 的外键
编写一个关系代数查询,查找所有昵称对 (name1, name2),使得 name1 跟随 name2。
我得出的答案如下:
π_nickName (σ_pID1=ID ∧ pID2=ID (person ⨝ follows))
我将按顺序分解并逐一解释: a)人⨝如下 - 我发现有必要使用自然连接操作(也称为笛卡尔积???),以便组合表并简化过滤过程。 b) σ_pID1=ID ∧ pID2=ID - 使用选择操作过滤掉不遵守上述顺序的名称 - 名称 1 跟随名称 2 - 将约束与 ID 属性相关联。不太确定这是否有意义。 c) π_nickName - 仅检索名称为 nickName 的列及其关联域,这些域是 nickName 封装的字符类型值。
自从我在课堂上使用该符号以来已经很长时间了。
在标准 SQL 数据库中,您会看到类似这样的内容。希望这有帮助。
select distinct p1.nickName name1, p2.nickName name2
from follows f
join person p1 on p1.ID = f.pID1
join person p2 on p2.ID = f.pID2