如何编写SQL查询获取员工数量最多的部门?
没问题,我来帮你搞定这个需求!要找出员工数量最多的部门,我们得考虑两种情况——单个部门员工数最多,或者多个部门并列第一,下面给你几种实用的实现方式:
方法一:用子查询逐层筛选
这种方式兼容性极强,几乎所有主流数据库都能支持:
SELECT d.name AS department_name, COUNT(e.id) AS employee_count FROM department d LEFT JOIN employee e ON d.id = e.department_id GROUP BY d.id, d.name HAVING COUNT(e.id) = ( SELECT MAX(emp_count) FROM ( SELECT COUNT(id) AS emp_count FROM employee GROUP BY department_id ) AS dept_counts );
- 最内层子查询先统计每个部门的员工总数;
- 中间的子查询找出这些总数里的最大值;
- 最后主查询筛选出员工数等于这个最大值的部门。
如果不需要统计没有员工的部门,把LEFT JOIN换成INNER JOIN即可。
方法二:用窗口函数(更简洁,适合现代数据库)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),用RANK()函数可以轻松保留所有并列第一的部门:
WITH dept_employee_counts AS ( SELECT d.name AS department_name, COUNT(e.id) AS employee_count, RANK() OVER (ORDER BY COUNT(e.id) DESC) AS rnk FROM department d LEFT JOIN employee e ON d.id = e.department_id GROUP BY d.id, d.name ) SELECT department_name, employee_count FROM dept_employee_counts WHERE rnk = 1;
- 先通过CTE(公共表表达式)统计每个部门的员工数,同时按员工数降序排名;
RANK()会给所有员工数并列最多的部门都标上rnk=1,最终结果会包含所有符合条件的部门。
如果你的数据库不支持CTE,把CTE改成子查询嵌套即可,逻辑完全一致。
要是你只需要随机选一个员工数最多的部门(不考虑并列情况),可以把RANK()换成ROW_NUMBER(),不过这种场景一般用得比较少。
内容的提问来源于stack exchange,提问作者Rakesh Kohali




