我有两张桌子,一张给工人,一张给部门。
工人(工人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 年的部门。
答案 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 行。
注意事项:
你写道:
<块引用>我想查找拥有平均工作经验低于 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 BY
和 HAVING
,如其他答案中所建议。使用 Department(DeptId, Experience)
上的索引,这可能会快一点。
答案 2 :(得分:0)
获得相同结果的其他方法(使用 GROUP BY
和 HAVING
):
我按部门分组,过滤那些员工平均工作经验不到五年的部门。
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;
返回所有工人的平均经验,而不是按部门。