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

MySQL查询问题:如何找出无学生通过的课程?

修正MySQL查询:找出无学生通过的课程

问题说明

现有三张MySQL表:

  • course(课程表):包含course_id(课程ID)、course_name(课程名称)字段
  • stco(学生选课状态表):包含course_id(关联课程ID)、student_id(关联学生ID)、course_status(选课状态,如failed/passed)字段
  • student(学生表):包含student_id(学生ID)、student_firstname(学生名)字段

需要编写查询语句找出所有没有学生通过的课程,原查询无法正常运行,以下是修正方案:

原查询的问题

  1. 使用内连接(JOIN)会直接排除无学生选课的课程,若需求包含这类课程,需改用左连接(LEFT JOIN)
  2. 通过student_firstname关联学生表存在逻辑漏洞——重名学生会导致数据关联错误,应使用唯一标识student_id
  3. HAVING子句缺少比较逻辑,仅写sum(...)无法作为筛选条件;且原逻辑统计的是特定课程ID且挂科的人数,不符合“无学生通过”的核心需求

修正后的查询语句

场景1:包含无学生选课的课程(这类课程自然没有学生通过)

SELECT c.course_name, COUNT(st.student_id) AS enrolled_students
FROM course c
LEFT JOIN stco st ON st.course_id = c.course_id
LEFT JOIN student s ON st.student_id = s.student_id
GROUP BY c.course_id, c.course_name
-- 统计通过人数为0,即无学生通过该课程
HAVING SUM(CASE WHEN st.course_status = 'passed' THEN 1 ELSE 0 END) = 0;

场景2:仅筛选有学生选课但全部未通过的课程

SELECT c.course_name, COUNT(st.student_id) AS enrolled_students
FROM course c
JOIN stco st ON st.course_id = c.course_id
JOIN student s ON st.student_id = s.student_id
GROUP BY c.course_id, c.course_name
HAVING SUM(CASE WHEN st.course_status = 'passed' THEN 1 ELSE 0 END) = 0;

关键提示

  • 分组时带上course_id,避免同名课程被错误合并
  • 关联表时优先使用唯一ID,不要用姓名这类可能重复的字段
  • CASE WHEN是统计特定状态数量的通用写法,比IN子句更灵活清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:25:29