如何查找该部门所有员工薪水大于30000的部门名称
Posted
技术标签:
【中文标题】如何查找该部门所有员工薪水大于30000的部门名称【英文标题】:How to find name of the departments in which all employees working in the department have a salary greater than 30000 【发布时间】:2018-03-23 10:59:31 【问题描述】:我正在努力解决这个关系代数问题。以下是问题中涉及的关系。 (粗体属性是主键。)
员工(eid、姓名、薪水、部门、地址) 部门(deptNo、dname、building、mgrID)
fk dept 参考部门(deptNo) fk mgrID 引用 Employee(eid)
这是问题:
打印该部门所有员工工资大于30000的部门名称。
这是我尝试过的:
(G是一个聚合函数符号。)
NewRelation(dname, empCount) <- dname G count(eid) (Employee ⋈ dept=deptNo Department)
∏ dname (σ salary>30000 (NewRelation))
但我想我的方法不对。什么是正确的? (请使用我写代数时使用的相同符号。)
【问题讨论】:
@VadimKotov 编辑时请尽可能多地编辑。请参阅我的编辑。我知道你可能无法提高英语。 (我在作业问题中留下了一些糟糕的英语,因为它应该是一个引用,我不想改变太多。) 嗨。请给出您正在使用的 RA 的参考或定义,有很多。例如,有些人可能会认出 G,但它不是标准的。你也用错了,阅读它的定义。检查我的代码错字修复。请阅读并根据点击谷歌搜索“stackexchange 作业”采取行动。解释您认为正确的部分/子查询以及为什么以及它们返回的内容以及错误的相同。例如:你为什么要数数?和答案有什么关系?有什么作用?不需要查询 PS 约束(PK、CK、FK 等)。所以没有理由给他们。所以有些事情你不明白。 提示1:这对外键意味着没有“空”部门,所有员工都属于某个部门。提示 2:因此您不需要 Group 或 count 操作,因为... 提示 3:如果所有员工的薪水都大于 x,那么没有员工的薪水小于或等于 x。 @AntC FK 约束既不意味着没有没有员工的部门,也不意味着所有员工都属于某个部门。他们说员工部门是部门,部门经理是员工。许多业务规则可能会或可能不会与这些规则相结合,而且我们也不知道确切的表格含义。可能有没有员工的部门。可能有没有部门的员工——尽管员工中没有。反过来,您的“因此”是不健全的。 (约束总是意味着某些可能返回不同结果的查询不会。) 谢谢@philipxy,是的,我在下面的回答中承认并讨论了 FKmgrID references Employee(eid)
实际上并不能保证没有“空”部门。 ...
【参考方案1】:
Q) 打印所有员工所在部门的名称 该部门的薪水超过30000。
您可以在 mysql 中使用 Query for。
SELECT D.dname FROM
Department D WHERE (SELECT COUNT(*)
FROM Employee E
WHERE E.dept = D.deptNo AND
E.salary < 30000) <= 0
【讨论】:
谢谢,但我需要关系代数。谢谢你的尝试 是的,我明白了。祝你好运。 :) @JananathBanuka 这里有一个错误和一个可能的错误:如果有一个部门的员工收入正好是 30000 怎么办? (以及任何其他员工的收入正好是 30000 或更少。)如果有一个部门根本没有员工怎么办? (这可能会发生,我上面的提示 1 不是防水的。) 编辑:我在错误更正中添加了一个错误。显示将其搞砸是多么容易。那应该是:如果有一个部门的员工收入正好是 30000 怎么办? (以及任何其他员工的收入正好是 30000 或更多。)【参考方案2】:问。打印部门内所有员工工资大于30000的部门名称。
注意:只有部门名称,与员工无关。
NewRelation(dname) <- ∏ dname
( Department ⋈ deptNo=dept
(∏ dept (Employee) - ∏ dept (σ salary<=30000 (Employee)) ) )
我使用了与您的 O.P 相同的符号和“方言”。正如@philipxy 所说,有很多变体。特别是使用 ⋈
这样的 equi-join 不是我会做的事情。 (还有一个更合适的算子:semidifference。)
解释:(从右到左)
(σ salary<=30000 (Employee))
的员工(及其dept
)的收入不超过 30000。
∏ dept
将其投影到 dept
数字。这是我们不想要的部门。
∏ dept (Employee) -
其中-
是负数,将我们不想要的部门从dept
s 的全部集合中去掉。
Department ⋈ deptNo=dept
将dept
s 加入他们的部门。在这种用法中,⋈
只是对 dept
s 的限制,所有员工的收入都足够。
∏ dname
按照要求只取部门名称。所以我们每个部门都会得到一个元组。 (实际上每个不同的部门名称一个元组,以防万一有同名的部门。)
这个问题可能有一个问题:如果一个部门没有员工,我们是否说所有员工的收入都>30000?同样,我们可以说他们所有人的收入
对于此查询,不会出现空部门。实际上 FK mgrID references Employee(eid)
并不能保证没有一个是空的。也许mgrID
识别的员工与deptNo
位于不同的dept
?
大致等价的 SQL 是:
SELECT DISTINCT dname
FROM Department D
WHERE NOT EXISTS (SELECT *
FROM Employee E
WHERE deptNo = dept
AND salary <= 30000 )
这与空部门问题相反:出现空部门确实。 (问题设置者喜欢用这种方法来折磨你。)
【讨论】:
【参考方案3】:Temp dept = deptNo部门
Temp2(deptNo,dname,Min_Salary) MIN(Salary)(Temp)
∏dname(σMin_Salary > 30000)(Temp2)
如果一个部门中薪水最低的员工的薪水大于 30000,这意味着该部门的所有员工的薪水都大于 30000。
【讨论】:
以上是关于如何查找该部门所有员工薪水大于30000的部门名称的主要内容,如果未能解决你的问题,请参考以下文章
编写一个 PL/SQL 块,从 Employee 表中显示部门名称和该部门的总工资支出