我正在努力解决这个关系代数问题。以下是该问题涉及的关系。 (粗体属性是主键。)
员工( eid ,ename,薪水,部门,地址)
部门( deptNo ,dname,building,mgrID)fk dept 引用部门( deptNo )
fk mgrID 引用员工( eid )
这是问题:
打印部门名称,其中所有在该部门工作的员工的薪水都超过30000。
这就是我的尝试:
(G是聚合函数符号。)
NewRelation(dname, empCount) <- dname G count(eid) (Employee ⋈ dept=deptNo Department)
∏ dname (σ salary>30000 (NewRelation))
但我猜我的方法不对。什么是对的? (请使用我在编写代数时使用的相同符号。)
答案 0 :(得分:0)
Q)打印所有员工所在部门的名称 该部门的薪水超过30000。
您可以在MySQL中使用Query。
SELECT D.dname FROM
Department D WHERE (SELECT COUNT(*)
FROM Employee E
WHERE E.dept = D.deptNo AND
E.salary < 30000) <= 0
答案 1 :(得分:0)
Q值。打印部门名称,其中所有在该部门工作的员工的薪水都大于30000。
注意:只有离职名称,而不是员工的任何内容。
NewRelation(dname) <- ∏ dname
( Department ⋈ deptNo=dept
(∏ dept (Employee) - ∏ dept (σ salary<=30000 (Employee)) ) )
我使用了相同的符号和'方言'作为你的O.P.正如@philipxy所说,有很多变种。特别是使用⋈
这样的等同连接不是我会做的事情。 (并且有一个更合适的运算符:semidifference。)
说明:(从右到左工作)
(σ salary<=30000 (Employee))
让员工(及其dept
)的收入不超过30000.
∏ dept
项目只有dept
个数字。这是我们不想要的部门。
∏ dept (Employee) -
-
为负值,将我们不想要的部门从dept
的全部集合中删除。
Department ⋈ deptNo=dept
将dept
等同于他们的部门。在此用法中,⋈
仅作为dept
的限制,所有员工的收入都足够。
∏ dname
仅根据要求获取部门名称。所以我们每个部门会得到一个元组。 (实际上每个不同的部门名称都有一个元组,以防万一有相同名称的部门。)
这个问题可能有一个问题:如果一个部门没有员工,我们是否说他们所有人都赚了> 30000?同样我们可以说他们所有人都获得<= 30000。我假设没有任何部门是“空的” - 请参阅我的提示1.
对于此查询,不会显示空的部门。实际上FK mgrID references Employee(eid)
并不保证没有空。也许mgrID
标识的员工与dept
的{{1}}不同?
大致相当的SQL是:
deptNo
这在空的部门问题上采取了相反的一面:出现空部门做。 (那种质疑者可以用来折磨你的那种捕获。)
答案 2 :(得分:0)
Temp&lt; - Employee⋈ dept = deptNo Department
Temp2(deptNo,dname,Min_Salary)&lt; - deptNo,dname G MIN(薪水)(Temp)
Π dname (σ Min_Salary&gt; 30000)(Temp2)
如果某个部门薪水最低的员工薪水大于30000,这意味着该部门的所有员工的薪水都超过30000。