繁体   English   中英

SQL-在数据库中查找丢失成绩的学生

[英]SQL- Find the students who are missing their grades in database

我的数据库中有三个表。 第一个是以 student_id 作为主键的学生。 第二个是以 course_id 作为主键的课程表,最后我有一个以 id_student 和 id_course 作为外键的成绩表,以及一个成绩字段。 我想获取成绩表中缺少成绩的学生的详细信息。 我搜索了堆栈溢出,但找不到我正在寻找的确切答案。 到目前为止,我尝试过的是以下查询:

select st.student_id,
       st.lname,
       st.fname,
       cs.course_id,
       g.grade 
from students st 
join grades g 
   on g.id_student = st.student_id 
join courses cs 
   on cs.course_id = g.id_course 
where g.grade is null

如果我在没有 where 条件的情况下尝试相同的查询,我会得到 39 行,但我应该得到 40 行,因为在我的数据库中,有一个学生在 course_id 20 中缺少成绩。**缺少的东西是 student_id,其中 course_id 是 20,而成绩不存在为了它。**

这是我的学生桌

这是课程表 在此处输入图像描述

我认为join grades需要两个键。 如果我假设学生应该学习所有课程,那么这将是这样的:

select st.student_id, st.lname, st.fname, cs.course_id,
       g.grade 
from students st cross join
     courses c left join
     grades g 
     on g.id_student = st.student_id and
        g.id_course = c.course_id
where g.grade is null;

CROSS JOIN生成学生和课程的所有组合。 LEFT JOIN / WHERE过滤掉那些缺少成绩的。

因为您使用 JOIN ,所以您只能获取所有 3 个表中存在的行。

如果您将 JOINS 更改为 LEFT OUTER JOIN,您将看到没有成绩的学生的 NULLS。

请参阅https://www.w3schools.com/sql/sql_join.asp和 web 上的许多其他链接

SELECT * FROM
(
select st.student_id,st.lname,st.fname,cs.course_id,g.grade 
from students st 
LEFT OUTER join grades g on g.id_student = st.student_id 
LEFT OUTER join courses cs on cs.course_id = g.id_course 
)SUB_Q WHERE SUB_Q.grade IS NULL

内部查询应该返回所有学生,没有成绩的学生应该有 null 的成绩。 所以外部查询的 WHERE 子句应该过滤到那些。

成绩表的联接 function 仅查找与成绩表和学生表匹配的结果。 在此处尝试完全外连接以包含所有字段,无论它们是否在两个表上都匹配。 请参见下面的代码:

SELECT 
st.student_id, st.lname, st.fname, cs.course_id, g.grade

FROM students st

FULL OUTER JOIN grades g
ON g.id_student = st.student_id

FULL OUTER JOIN courses cs
ON cs.course_ID = g.id_course

WHERE g.grade IS NULL

查询对我来说是正确的,检查你的学生是否真的有一个 NULL 里面或者可能是一个空格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM