MySQL查询每个部门的员工个数(部门员工数可能为0)

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后跟子查询的方法 得到的结果一致,即现在能通过连接查询得到正确结果了。

  • 20
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值