如何筛选无女性员工的部门?SQL查询逻辑咨询
搞定“筛选仅含男性员工的部门”的正确SQL写法
兄弟,我懂你想找出全是男性员工的部门的需求,但你原来写的SQL里的WHERE sex = ALL('M')可没起到你想要的作用哦!
先说说你原来的问题在哪
ALL关键字一般是和子查询搭配使用的,比如sex = ALL(SELECT ...),但你直接跟个常量'M',这效果其实和sex = 'M'完全一样——只会把部门里的男性员工挑出来统计数量,但那些部门里同时有女性员工的情况根本没被排除掉,最后得到的结果只是每个部门里的男性人数,不是全男性部门的总人数。
给你几种靠谱的正确解法:
方法1:用NOT EXISTS排除有女性的部门
这个思路最直观:找出所有不存在女性员工的部门,再统计这些部门的员工总数:
SELECT d.Dnumber, COUNT(e.Ssn) AS total_employees FROM Department d JOIN Employee e ON d.Dnumber = e.Dno WHERE NOT EXISTS ( SELECT 1 FROM Employee e2 WHERE e2.Dno = d.Dnumber AND e2.Sex = 'F' ) GROUP BY d.Dnumber;
方法2:分组后对比男性数和总员工数
先按部门分组,统计每个部门的总员工数和男性员工数,只要两者相等,就说明这个部门全是男性:
SELECT d.Dnumber, COUNT(e.Ssn) AS total_employees FROM Department d JOIN Employee e ON d.Dnumber = e.Dno GROUP BY d.Dnumber HAVING COUNT(e.Ssn) = SUM(CASE WHEN e.Sex = 'M' THEN 1 ELSE 0 END);
要是你确定Sex字段只有'M'和'F'两种值,还能更简洁:
SELECT d.Dnumber, COUNT(e.Ssn) AS total_employees FROM Department d JOIN Employee e ON d.Dnumber = e.Dno GROUP BY d.Dnumber HAVING MAX(e.Sex) = 'M' AND MIN(e.Sex) = 'M';
原理很简单:如果部门里全是男性,那最大和最小的性别值都是'M'。
方法3:左连接过滤有女性的部门
通过左连接该部门的女性员工,要是左连接后找不到对应的女性记录(也就是e2.Ssn IS NULL),就说明这个部门没有女性:
SELECT d.Dnumber, COUNT(e.Ssn) AS total_employees FROM Department d JOIN Employee e ON d.Dnumber = e.Dno LEFT JOIN Employee e2 ON e2.Dno = d.Dnumber AND e2.Sex = 'F' WHERE e2.Ssn IS NULL GROUP BY d.Dnumber;
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

