MySQL查询每个部门的员工个数

问题:查询每个部门的员工个数

注意!某些部门可能是没有员工的(员工个数为0)。(事实上是department_id在120之后的那些部门)
这时候如果简单利用连接查询并分组,将会使得员工个数为0的部门不会被查询出来。

SELECT e.department_id,COUNT(*)
FROM employees e
JOIN departments d ON e.`department_id` = d.`department_id`
GROUP BY e.`department_id`;

查询结果如下:
可以看到结果中并没有人数为0的部门
可以看到结果中并没有人数为0的部门
对此,可以利用在SELECT后跟子查询的方法进行查询:

SELECT d.*,(
	SELECT COUNT(*)
	FROM employees e
	WHERE e.department_id = d.`department_id`
 ) 个数
 FROM departments d;

查询结果如下:
此时包含了所有的部门(包括人数为0的)
此时包含了所有的部门
那么是不是连接查询就不能解决本题呢?
答案是否定的。既然上面的内连接不行,自然想到使用外连接:

SELECT d.*,COUNT(*) 部门人数
FROM departments d
LEFT JOIN employees e ON e.`department_id` = d.`department_id`
GROUP BY d.`department_id`;

查询结果如下:
可以看到还是有问题,员工个数为0的部门此时统计出来员工个数为1了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201218201323466.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Rhb21lZWNoaWxkcmVu,size_16,color_FFFFFF,t_70

我们需要对外连接查询所SELECT的字段做一些改进,“强行”把这些员工人数为0的部门的统计人数纠正为0。修改如下:

SELECT d.*,IF(employee_id IS NULL,0,COUNT(*)) 部门人数
FROM departments d
LEFT JOIN employees e ON e.`department_id` = d.`department_id`
GROUP BY d.`department_id`;

查询结果如下:
一样是27行
这和 在SELECT后跟子查询的方法 得到的结果一致,即现在能通过连接查询得到正确结果了。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐