如何找到所有在该部门工作的员工薪水超过30000的部门名称

时间:2018-03-23 10:59:31

标签: database relational-algebra

我正在努力解决这个关系代数问题。以下是该问题涉及的关系。 (粗体属性是主键。)

  

员工( 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))

但我猜我的方法不对。什么是对的? (请使用我在编写代数时使用的相同符号。)

3 个答案:

答案 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=deptdept等同于他们的部门。在此用法中,仅作为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。