如何在 SQL 中使用 AVG 函数进行比较?

时间:2021-07-30 23:50:40

标签: mysql sql

我有两张桌子,一张给工人,一张给部门。

工人(工人ID,部门ID,姓名,年龄,经验)
部门(DeptID, Name)

我想查找拥有平均工作经验低于 5 年的员工的部门名称。

我写的查询是,

SELECT DISTINCT Department.Name AS DeptName
FROM Department
LEFT OUTER JOIN Worker ON Worker.DeptID = Department.DeptID
WHERE 5 > ( SELECT AVG (Experience)  FROM Workers);

这不会给我任何输出或错误。我做错了什么?

如果我将 5 放在引号中作为“5”,它会返回所有部门,而不仅仅是那些平均经验低于 5 年的部门。

3 个答案:

答案 0 :(得分:0)

您的查询有什么问题

SELECT DISTINCT Department.Name AS DeptName
FROM Department
LEFT OUTER JOIN Worker ON Worker.DeptID = Department.DeptID
WHERE 5 > ( SELECT AVG (Experience)  FROM Workers);

A.您计算所有工人的平均经验

 ( SELECT AVG (Experience)  FROM Workers)

你会得到一个值。

该值可能大于或小于 5。

B.您将计算值与 5 进行比较

WHERE 5 > ( SELECT AVG (Experience)  FROM Workers);

此谓词将始终为 False 或始终为 True。

<块引用>

这不会给我任何输出或错误。

如此有效地它变成了所有行的 WHERE False

这不是错误,但您会得到 0 行。

我认为需要什么

注意事项:

  • “我想” - 通常建议准备一个 db fiddle 以备问题。
  • 最好指定mysql版本

你写道:

<块引用>

我想查找拥有平均工作经验低于 5 年的员工的部门名称。

各部门的平均经验?

你需要:

SELECT Department.Name AS DeptName
FROM Department
LEFT OUTER JOIN Worker ON Worker.DeptID = Department.DeptID
GROUP BY Department.Name
HAVING AVG(Experience) < 5

答案 1 :(得分:0)

如果您愿意,可以使用 WHERE 子句中的子查询来执行此操作:

SELECT d.Name AS DeptName
FROM Department d
WHERE (SEELCT AVG(w.Experience)
       FROM Workers w
       WHERE w.DeptID = d.DeptId
      ) < 5;

您也可以使用 GROUP BYHAVING,如其他答案中所建议。使用 Department(DeptId, Experience) 上的索引,这可能会快一点。

答案 2 :(得分:0)

获得相同结果的其他方法(使用 GROUP BYHAVING):

我按部门分组,过滤那些员工平均工作经验不到五年的部门。

SELECT Department.Name AS DeptName
FROM Department
INNER JOIN Worker ON Worker.DeptID = Department.DeptID
GROUP BY Department.Name
HAVING AVG(Experience) < 5;

此查询 SELECT AVG(Experience) FROM Worker; 返回所有工人的平均经验,而不是按部门。