我正在努力解决这个关系代数问题 . 以下是该问题涉及的关系 . ( Bold 属性是主键 . )
员工(开斋节,ename,工资,部门,地址)部门(deptNo,dname,building,mgrID)fk dept references Department(deptNo)fk mgrID reference Employee(eid)
这是问题:
打印部门名称,其中所有在该部门工作的员工的薪水都大于30000 .
这就是我试过的:
(G是聚合函数符号 . )
NewRelation(dname, empCount) <- dname G count(eid) (Employee ⋈ dept=deptNo Department)
∏ dname (σ salary>30000 (NewRelation))
但我猜我的方法不对 . 什么是对的? (请使用我在编写代数时使用的相同符号 . )
3 回答
您可以在MySQL中使用Query .
注意:只有离职名称,而不是员工的任何内容 .
我_ya方言'作为你的O.P.正如@philipxy所说,有很多变种 . 特别是使用
⋈
这样的等连接不是我会做的事情 . (并且有一个更合适的运算符:semidifference . )Explanation: (从右到左工作)
(σ salary<=30000 (Employee))
让员工(及其dept
)的收入不超过30000 .∏ dept
将项目归结为dept
. 这是我们不想要的部门 .∏ dept (Employee) -
其中-
是负数,将我们不想要的部门从dept
的全部集合中取出 .Department ⋈ deptNo=dept
equi-将那些dept
加入他们的部门 . 在这种用法中,⋈
仅作为对所有员工收入足够的dept
的限制 .∏ dname
仅根据要求获取部门名称 . 所以我们每个部门会得到一个元组 . (实际上每个不同的部门名称都有一个元组,以防万一有相同名称的部门 . )这个问题可能有一个问题:如果一个部门没有员工,我们是否说他们都赚了> 30000?同样我们可以说他们所有人都<= 30000 . 我假设没有任何部门是“空的” - 请参阅我的提示1 .
对于此查询,不会显示空的部门 . 实际上FK
mgrID references Employee(eid)
并不保证没有空 . 也许由mgrID
识别的员工与deptNo
处于不同的dept
?大致相当的SQL是:
这与空的部门问题相反:空部门确实出现 . (那种提问者喜欢用折磨你的东西 . )
Temp < - Employee⋈dept= deptNoDepartment
Temp2(deptNo,dname,Min_Salary)< - deptNo,dname GMIN(Salary)(Temp)
Πdname(σMin_Salary> 30000)(Temp2)
如果部门中薪水最低的员工的薪水大于30000,则表示该部门的所有员工薪水均高于30000 .