当前位置: 首页 > 知识库问答 >
问题:

SQL-在数据库中查找缺少成绩的学生

昝晗昱
2023-03-14

我的数据库中有三个表。第一个是以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_id20中缺少成绩。**缺失的东西是student_id,course_id是20,成绩不存在。**

共有3个答案

轩辕鸿祯
2023-03-14

成绩表的连接函数仅查找与成绩表和学生表都匹配的结果。在这里尝试一个完整的外部联接以包括所有字段,无论它们是否在两个表上匹配。请参见下面的代码:

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
牧献
2023-03-14

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

如果将“联接”更改为“左外联接”,您将看到没有成绩的学生的 NULL。

看见https://www.w3schools.com/sql/sql_join.asp以及网络上的许多其他链接

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 子句应筛选为仅这些子句。

常英资
2023-03-14

我认为成绩上的加入需要两个键。如果我假设学生应该参加所有课程,那么这看起来像:

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;

交叉联接生成学生和课程的所有组合。左联接/位置过滤掉缺少成绩的那些。

 类似资料:
  • 我有一个学生表学生(LRN,名字,名字,级别ID)和一个成绩表成绩(科目ID,年级,级别ID,LRN,时间添加)我想显示所有学生的所有科目的成绩在网上。我厌倦了这个查询,但我得到了这个结果。 结果:查询结果

  • 问题内容: 我有一张可以容纳一年中所有天/月的表 例如 我有一张表格,显示来自不同数据集的日期范围 例如 我如何比较这两个表以显示该特定月份的数据集中缺少哪些日期 对于上面示例中的数据集所在的示例,EG缺少日期范围01/09/2013-19/09/2013 谢谢你的帮助! 问题答案: 您可以使用CTE并通过以下方式编写查询:

  • 除了从课堂维度查看数据之外,点击左侧【学生成绩】,可以查看学生维度的统计数据,关联mooc 或 spoc 课程的慕课堂,可以在学习表现中看到学生的视频观看个数、次数、时长、讨论区主题数、评论数、回复数、线上课程的学习总成绩。 提示:学生在MOOC/SPOC中观看视频、参与互动的数据每天一次同步到慕课堂后台(课程相关数据隔天更新),学生在MOOC/SPOC 中参加测验/作业的成绩需老师确认后才会同步

  • 问题内容: 我正在尝试在Jenkins(https://jenkins-ci.org)脚本控制台中运行find命令,该控制台允许从Web界面运行groovy脚本。 我的代码是: Web UI将显示println的结果: 当詹金斯日志(/var/log/jenkins/jenkins.log)记录以下错误时: 但是,如果我通过外壳运行在Web UI()中输出的相同命令,则不会出现此类错误。 另外,如

  • 大家好,我有一些问题与我的SQLite数据库在我的java程序。我试图从几个表中检索数据,但它说我的表不存在。我已经用数据库浏览器检查过了,它肯定在那里,所以我不确定我做错了什么。这是我收到的错误: [SQLITE_ERROR]SQL错误或缺少数据库(没有这样的表:staff_clocked_in.clock_in_time) 我确信我的表存在,并且两个表中都有数据,这里是我的数据库浏览器的截图。

  • 问题内容: 我有下表,其中包含每15分钟从几个不同的设备读取的值: 我想在表中找到每个月在给定月份中没有条目的所有设备的所有差距。对于上表,结果应该是这样的: 该表大约有35000台设备和1亿个条目。 这是我尝试过的;它很慢,但是返回我需要的。但是,除了速度之外,还有另一个问题:它只能找到在给定月份设备的最后一个条目之前丢失的时间间隔;之后的所有内容都将被忽略,因此有可能会错过额外的缺失值间隔。