如何编写SQL查询:显示员工数大于5的部门编号及员工数量
解决部门员工数统计的SQL查询问题
首先看你的需求:要展示部门编号(deptno)和对应部门的员工数量,并且只保留员工人数超过5人的部门。你的现有查询有两个关键问题:
- 你只选择了
D.DNAME(部门名称),所以自然看不到部门编号和员工数量 - 过滤条件写的是
> 3,和你需求里的> 5不匹配
下面给你两种可行的解决方案,优先推荐第一种,因为效率更高:
方案1:使用GROUP BY + HAVING(推荐)
这是统计分组数据最标准的写法,只需要扫描一次员工表,性能更优:
SELECT deptno, COUNT(*) AS employee_count FROM emp GROUP BY deptno HAVING COUNT(*) > 5;
GROUP BY deptno:按照部门编号对员工进行分组COUNT(*):统计每个分组里的员工数量,通过AS给结果列起一个易读的别名HAVING COUNT(*) > 5:过滤出员工数量超过5的分组(注意这里不能用WHERE,因为WHERE是过滤单条行数据,HAVING才是过滤分组后的聚合结果)
如果需要同时显示部门名称,可以关联dept表:
SELECT D.deptno, D.dname, COUNT(E.empno) AS employee_count FROM dept D JOIN emp E ON D.deptno = E.deptno GROUP BY D.deptno, D.dname HAVING COUNT(E.empno) > 5;
方案2:修正你原来的子查询写法
如果你想保留子查询的思路,可以修改成下面这样,同时获取部门编号和员工数量:
SELECT D.deptno, (SELECT COUNT(*) FROM emp E WHERE E.deptno = D.deptno) AS employee_count FROM dept D WHERE (SELECT COUNT(*) FROM emp E WHERE E.deptno = D.deptno) > 5;
不过这种写法的缺点是,对于每个部门都会执行两次子查询(一次在SELECT里,一次在WHERE里),当数据量较大时,性能会比方案1差很多。
内容的提问来源于stack exchange,提问作者micke
相关产品推荐
相关产品推荐

