SQL查询学生成绩问题:未录入成绩需显示NULL
问题解决:查询学生选课成绩(未录入时显示NULL)
问题根源
你的SQL语句存在两个核心问题:
- 内连接
scores表:使用JOIN scores属于内连接,只有scores表存在对应记录时才会返回结果,直接过滤掉了无成绩的课程记录。 - 关联字段错误+连接逻辑混乱:
RIGHT JOIN courses中错误使用了scores.course(实际字段为scores.course_code),且整体未以学生的选课记录(krs_detail)为核心,导致无成绩时无法返回完整选课列表。
修正后的SQL语句
以学生的选课详情表krs_detail作为主表,关联学生、课程信息后,通过左连接scores表保留所有选课记录,无成绩时自动填充score为NULL:
SELECT s.nim, s.name, kd.course_code, c.course_name, c.sks, sc.score FROM krs_detail kd JOIN krs kr ON kr.code_krs = kd.code_krs JOIN students s ON s.nim = kr.nim JOIN courses c ON c.course_code = kd.course_code LEFT JOIN scores sc ON sc.nim = s.nim AND sc.course_code = kd.course_code AND sc.academic_year = kr.academic_year -- 匹配对应选课学年的成绩 WHERE kd.code_krs = '2161206003-20211';
逻辑说明
- 从
krs_detail出发,关联krs表获取对应学生的nim和选课学年academic_year。 - 关联
students、courses表分别获取学生基本信息和课程详情。 LEFT JOIN scores确保所有选课记录都会被返回,即使scores表中无对应成绩,score字段也会显示NULL。- 增加
sc.academic_year = kr.academic_year的关联条件,避免匹配到跨学年的错误成绩。
验证效果
替换code_krs为任意值时:
- 成绩已录入:
score字段显示对应分数; - 成绩未录入:
score字段显示NULL,同时保留完整的选课课程信息。
内容的提问来源于stack exchange,提问作者Franky
相关产品推荐
相关产品推荐

