MySQL查询:如何筛选员工数<20且平均薪资<2000的部门信息
没问题,我来帮你搞定这个查询!
正确的MySQL查询写法
要实现你的需求,我们需要先对员工表按部门分组聚合数据,再关联部门表获取名称,最后过滤出符合条件的部门。完整的查询语句如下:
SELECT d.dept_id, d.dept_name, ROUND(AVG(e.salary), 2) AS avg_salary, -- 保留两位小数让结果更直观,可选 COUNT(e.emp_id) AS emp_count FROM Departments d INNER JOIN Employees e ON d.dept_id = e.dept_id GROUP BY d.dept_id, d.dept_name -- MySQL 5.7及以上版本要求GROUP BY包含所有非聚合字段 HAVING COUNT(e.emp_id) < 20 AND AVG(e.salary) < 2000;
关键部分拆解说明:
INNER JOIN:关联部门表和员工表,确保我们只获取有员工的部门(如果需要包含无员工的部门,可以换成LEFT JOIN,但这类部门的平均薪资为NULL,会被后续的HAVING条件过滤掉)。GROUP BY:按部门ID和名称分组,这样才能计算每个部门的聚合指标(平均薪资、员工数)。AVG(e.salary):计算每个部门的平均薪资,用ROUND()可以让数值更整洁。COUNT(e.emp_id):统计每个部门的员工数量(用emp_id而非*能避免统计NULL值,若emp_id是主键,两者效果一致)。HAVING子句:专门用于过滤分组后的聚合结果,因为WHERE子句不能直接使用聚合函数(比如AVG()、COUNT())。
为什么你之前的语句达不到需求?
你写的SELECT dept_id, salary FROM employees WHERE (salary) < 2000;只是筛选出了薪资低于2000的单个员工记录,但没有按部门进行聚合统计,所以无法得到部门级别的平均薪资和员工总数,也没法关联获取部门名称。
内容的提问来源于stack exchange,提问作者somethingelse
相关产品推荐
相关产品推荐

