You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选无女性员工的部门?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:20:17