如何查找该部门所有员工薪水大于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,是的,我在下面的回答中承认并讨论了 FK mgrID 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&lt;=30000 (Employee)) 的员工(及其dept)的收入不超过 30000。

∏ dept 将其投影到 dept 数字。这是我们想要的部门。

∏ dept (Employee) - 其中- 是负数,将我们不想要的部门从depts 的全部集合中去掉。

Department ⋈ deptNo=deptdepts 加入他们的部门。在这种用法中, 只是对 depts 的限制,所有员工的收入都足够。

∏ 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)

dnameMin_Salary > 30000)(Temp2)

如果一个部门中薪水最低的员工的薪水大于 30000,这意味着该部门的所有员工的薪水都大于 30000。

【讨论】:

以上是关于如何查找该部门所有员工薪水大于30000的部门名称的主要内容,如果未能解决你的问题,请参考以下文章

编写一个 PL/SQL 块,从 Employee 表中显示部门名称和该部门的总工资支出

数据库笔试——查出各部门超出部门平均薪资的员工的姓名,薪资,所在部门名称及部门平均薪水

PLSQL块增加部门的工资

当我使用特定部门 ID 时,我想要所有员工姓名

数据库实验 创建触发器

Mysql 练习题10道(11-20题)