[英]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.