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

SQL查询求助:基于年份与学历级别筛选女毕业生多于男毕业生的院系

嘿,我来帮你搞定这个SQL查询的问题!你的需求是根据表单输入的年份(ANNEE)和学历级别(LABEL),找出女毕业生人数超过男毕业生的院系名称,对吧?先看看怎么优化你的查询,让它逻辑更清晰、结果更准确:

完整的SQL查询方案

假设你的NB_DIPLOMES_DEPT表包含SEXE字段(值为'F'表示女性,'M'表示男性)和NUM字段(对应该性别/院系/学历/年份的毕业生人数),可以用下面的查询:

SELECT d1.NOM
FROM DEPARTEMENTS d1
JOIN NB_DIPLOMES_DEPT d2 ON d1.NUM = d2.DEPT
JOIN NIVEAUX_DIPLOMES d3 ON d2.NIVEAU = d3.ID
WHERE d2.ANNEE = :input_annee  -- 替换为表单提交的年份参数
  AND d3.LABEL = :input_label  -- 替换为表单提交的学历级别参数
GROUP BY d1.NUM, d1.NOM
HAVING SUM(CASE WHEN d2.SEXE = 'F' THEN d2.NUM ELSE 0 END) > SUM(CASE WHEN d2.SEXE = 'M' THEN d2.NUM ELSE 0 END)

关键部分解释

  • 用JOIN替代逗号连接:相比你原来的逗号表连接,显式的JOIN语法更清晰,能明确表之间的关联关系,避免意外的笛卡尔积问题。
  • 参数化过滤::input_annee和:input_label是参数占位符,你需要把它们替换成HTML表单提交的实际值(比如在后端用PreparedStatement绑定参数,不要直接拼接SQL,防止SQL注入)。
  • 分组统计与条件筛选:
    • GROUP BY按院系的ID和名称分组,确保每个院系只被统计一次。
    • HAVING子句里用CASE语句分别计算每个院系的女、男毕业生总数,然后比较两者的大小,只保留女毕业生更多的院系。

适配不同表结构的情况

如果你的NB_DIPLOMES_DEPT表是用单独的字段存储男女毕业生数(比如NB_FEMMES和NB_HOMMES),那查询可以更简洁:

SELECT d1.NOM
FROM DEPARTEMENTS d1
JOIN NB_DIPLOMES_DEPT d2 ON d1.NUM = d2.DEPT
JOIN NIVEAUX_DIPLOMES d3 ON d2.NIVEAU = d3.ID
WHERE d2.ANNEE = :input_annee
  AND d3.LABEL = :input_label
GROUP BY d1.NUM, d1.NOM
HAVING SUM(d2.NB_FEMMES) > SUM(d2.NB_HOMMES)

注意事项

  • 确认你的表结构和字段名完全匹配,比如SEXE字段的取值是否和示例一致,NUM字段是否确实代表人数。
  • 用参数化查询处理用户输入,这是Web开发中防范SQL注入的关键步骤。

内容的提问来源于stack exchange,提问作者B_ Trn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:47:18