我试图了解何时使用选择和投影运算符。我目前的理解是选择返回符合指定条件的元组,并且投影从它所处理的关系创建一个新关系,但仅限于指定的属性。例如:
σ(attribute="criteria"^(relation))
从关系“relation”返回具有指定属性值的所有元组。
Π name (relation)
会从“关系”关系中找到名称列表,而忽略任何其他属性。
从此示例数据库中,使用星号标记的主键:
employee(*personName*, street, city)
works(*personName*, companyName, salary)
company(*companyName*, city)
manages(*personName*, managerName)
我必须:
A)找到为M& T Bank工作的所有员工的姓名。
Π personName(σcompanyName = “M&T Bank” ^(works))
B)找出可能记录在数据库中的所有公司的名称。
Π companyName (company)
C)找出不是经理的所有员工的姓名。
Π personName (works) - ΠpersonName(manages)
基本上,以上查询是否正确?我对这些操作员的理解是否正确和完整?
答案 0 :(得分:0)
答案A)是正确的(我也不知道你的符号中^
的含义是什么,所以我忽略了它。)
对于B,您应该记住,公司不仅可以记录在公司表中,还可以记录在 works 表中。因此,您的答案应为Π companyName (company) U Π companyName (works)
。
对于C,您在识别员工时也应该更加小心。有人可能会说,前雇员仍然列在员工中但不在工作中,也应该考虑。根据您(或教师)的观点,您可能需要使用Π personName (works) U Π personName (employee)
而不是Π personName (works)
。
C中更严重的问题是管理者的识别。 ΠpersonName(manages)
是被管理的个人,而不是经理。经理是Π managerName(manages)
。
因此,对于C,您可能更喜欢(Π personName (works) U Π personName (employee)) - Π managerName(manages)
。
一般来说,您对投影和选择的理解是正确的,但在制定答案时您需要更加小心。