5、查询没学过“张三”老师课的学生的学号、姓名(重点)

本文重点讲解如何使用SQL语句来查询那些没有记录在‘张三’教师名下的学生学号和姓名,涉及数据库查询和过滤技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- 5、查询没学过“张三”老师课的学生的学号、姓名(重点)
SELECT s_id,s_name FROM student
WHERE s_id NOT IN (

SELECT s_id FROM score
WHERE c_id=( 

SELECT c_id FROM course
WHERE t_id=(
SELECT t_id 
FROM teacher
WHERE</
R10-3 59.显示期末平均成绩80分以上同学的学号姓名与期末平均成绩(Avg,结果保留两位小数) 分数 5 作者 宋光慧 单位 浙大宁波理工学院 本题目要求编写SQL语句,查询显示期末平均成绩80分以上同学的学号姓名与期末平均成绩(Avg,结果保留两位小数)。 现有教务管理系统的关系描述如下: 每个院系(部门)有多个班级和多名教师,每名教师各自开设有多门程。 每位教师管理多个班级(班主任),每个班级只能被一位老师管理。 每名学生属于一个班级,可以选修多门程。 每门程可被多位老师讲授,并且有些程具有先导程,每门程的成绩由平时成绩、期中成绩、期末成绩组成,最终计算总评成绩。 程信息表供教师和学生查询,包含程信息、任教师、上班级、上教室、上日期(周几)、上时间(第几节)、上学期学年等信息。 1.学生表:student 表结构 student-1.png 表数据 student-2.png 2.程表:course 表结构 course-1.png 表数据 course-2.png 3.选表:sc 表结构 sc-1.png 表数据 sc-2.png 4.班级表:grade 表结构 grade-1.png 表数据 grade-2.png 5.院系(部门)表:dept 表结构 dept-1.png 表数据 dept-2.png 6.教师表:teacher 表结构 teacher-1.png 表数据 teacher-2.png 7.程信息表:information 表结构 information-1.png 表数据 information-2.png ===>样例输出: 59.png
最新发布
04-01
<think>嗯,我现在要解决这个SQL问题,题目是显示期末平均成绩80分以上的同学的学号姓名和平均成绩,保留两位小数。首先我得理清楚各个表的结构和关系。 首先看题目给的各个表,学生表是student,选表是sc,程表是course,可能还有其他的表比如班级、院系等,但这里的问题主要涉及成绩,所以可能重点在sc表。题目里提到期末平均成绩,而sc表里有final_grade字段,应该就是期末成绩。所以需要计算每个学生的期末成绩的平均值,然后筛选出平均分大于80分的学生。 首先,学生表student有sno(学号)、sname(姓名)等字段。选表sc里有sno(学号)、cno(程号)、final_grade(期末成绩)。所以需要将student和sc表连接起来,按学号分组,计算每个学生的平均final_grade,然后过滤出平均分>=80的。 步骤应该是这样的: 1. 连接student和sc表,通过sno字段。 2. 按sno和sname分组,因为每个学生学号姓名是唯一的。 3. 计算平均期末成绩,使用AVG(final_grade),然后用ROUND保留两位小数。 4. 添加HAVING子句,筛选平均分大于等于80。 5. 最后按学号排序,或者按照题目样例输出的顺序排列。 不过,是否需要考虑其他情况?比如有的学生可能没有选,但题目里是“期末平均成绩”,所以只考虑有选记录的学生。但题目中的“同学”应该是指那些有选记录的学生,否则平均成绩无法计算。所以直接用INNER JOIN即可。 然后,可能需要注意别名的问题,比如表的别名。例如: SELECT s.sno, s.sname, ROUND(AVG(sc.final_grade), 2) AS Avg FROM student s JOIN sc ON s.sno = sc.sno GROUP BY s.sno, s.sname HAVING AVG(sc.final_grade) >= 80 ORDER BY s.sno; 这样应该就能得到正确的结果了。不过需要验证是否正确,比如是否每个学生的所有选记录都会被计算平均,并且保留两位小数。ROUND函数是否正确应用在AVG的结果上。另外,HAVING子句中的条件是否正确使用AVG后的值,而不是单个成绩。 有没有可能哪里出错?比如是否需要考虑不同学年或学期的成绩?题目里的程信息表有上学期学年等信息,但题目中的问题没有限定学期,所以可能不需要考虑,直接计算所有选的期末成绩平均。 另外,是否需要排除某些程?题目没有说明,所以应该是所有选都算进去。比如,某个学生选了多门程,不管是否同一学期,都算平均。 所以最终的SQL应该是这样的,然后按照学号姓名和Avg显示,保留两位小数。样例输出可能需要排序,比如按学号升序。 总结一下,关键点在于JOIN的正确使用,分组,聚合函数以及保留小数位数。另外,HAVING子句的条件正确应用在聚合后的结果上。</think>要解决该问题,需按以下步骤编写SQL查询: ### **步骤分析** 1. **表关联分析** - `student`表存储学生学号(`sno`)和姓名(`sname`)。 - `sc`表存储学生记录及期末成绩(`final_grade`)。 - 需通过**学号**关联两表,筛选每个学生的期末成绩并计算平均值。 2. **聚合与过滤条件** - 按学号分组,计算每个学生的期末平均成绩。 - 使用`HAVING`子句过滤出平均分≥80的学生。 - 结果保留两位小数。 3. **排序与输出** - 按学号排序(非强制,但样例输出可能有隐含要求)。 --- ### **最终SQL代码** ```sql SELECT s.sno AS 学号, s.sname AS 姓名, ROUND(AVG(sc.final_grade), 2) AS Avg FROM student s JOIN sc ON s.sno = sc.sno GROUP BY s.sno, s.sname HAVING AVG(sc.final_grade) >= 80 ORDER BY s.sno; ``` --- ### **关键点说明** 1. **表连接** - 使用`INNER JOIN`连接`student`和`sc`表,确保仅包含有选记录的学生。 2. **聚合函数与小数处理** - `AVG(sc.final_grade)`计算平均期末成绩,`ROUND(..., 2)`保留两位小数。 3. **分组与过滤** - `GROUP BY s.sno, s.sname`确保按学生唯一分组。 - `HAVING`在分组后过滤聚合结果,直接使用`AVG(sc.final_grade)`而非别名`Avg`(部分数据库不支持别名过滤)。 --- ### **示例输出** 假设数据如下: | 学号 | 姓名 | Avg | |------|------|------| | 1001 | | 85.50| | 1003 | 李四 | 90.00| 输出将显示期末平均成绩≥80的学生学号姓名及平均分(保留两位小数)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值