查询学生 学号、姓名和平均成绩

本文解决了在SQLServer中使用分组查询时遇到的错误,通过添加额外的分组依据,实现了正确计算学生的平均成绩。

三个表:Student(学生),Course(课程),SC(选课):

这里写图片描述

刚开始是这么写的:

select Student.sname,Student.sno,avg(grade) as avg_grade
    from Student,SC
    where Student.sno=SC.Sno
    group by Student.Sno;

结果在SQL Server中执行报错:

这里写图片描述

我在网上查了很多,答案也都是这么写的,急的想摔电脑。

这里写图片描述

然鹅,在我深邃浩瀚的脑洞之下,我还是想出了答案:在group by后面可以有多个决定因素的,加上一个Student.sname就好了:

select Student.sname,Student.sno,avg(grade) as avg_grade
    from Student,SC
    where Student.sno=SC.Sno
    group by Student.Sno,Student.sname;

或者

select Student.sname, SC.sno, avg(SC.grade) as avg_grade
    from dbo.SC inner join
            Student on SC.sno = Student.sno
    group by SC.sno, Student.sname

结果:

这里写图片描述

这里写图片描述

但如果做是题的话,就按刚开始写的那个就好了。

<think> 我们被要求查询平均成绩大于80的所有学生学号姓名平均成绩。 根据引用[2]中的方法,我们可以先计算每个学生平均成绩(按学号分组),然后筛选出平均成绩大于80的学生,最后连接学生表(stu)获取学生姓名。 步骤: 1. 从SC表(成绩表)中按学号(sno)分组,计算每个学生平均成绩avg(grade)),并筛选出平均成绩大于80的分组(使用HAVING子句)。 2. 将上一步得到的结果(临时表)与学生表(stu)进行连接,以获取学生姓名(sname)。 3. 选择输出列:学号(sno),姓名(sname),平均成绩(我们计算的平均成绩)。 注意:引用[2]中使用了MSSQL,但这里我们写的是通用SQL(或类似MySQL的语法),不过具体数据库可能有些差异,但思路一致。 因此,查询语句可以写为: ```sql SELECT a.sno AS 学号, stu.sname AS 姓名, a.avg_grade AS 平均成绩 FROM (SELECT sno, AVG(grade) AS avg_grade FROM sc GROUP BY sno HAVING AVG(grade) > 80 ) AS a JOIN stu ON a.sno = stu.sno; ``` 注意:这里假设表名为sc(成绩表)stu(学生表)。在sc表中,有sno(学号grade(成绩)。在stu表中,有sno(学号sname(姓名)。 另外,引用[2]中使用了别名,我们也使用了别名,使语句更清晰。 如果数据库是MySQL,上述语句是可行的。如果是其他数据库,如Oracle,可能不需要在子查询别名前加AS,但通常加AS也是允许的。 因此,我们按照上述SQL语句进行查询即可得到结果。 同时,我们注意到引用[1]中有一个错误的示例,它试图在子查询中获取平均成绩,但是它的子查询条件(where Cno=(select distinct Cno from SC))是不正确的,因为这样会返回多行(除非只有一门课)。所以我们不采用引用[1]的方法。 引用[3][4]是关于编程实现,与当前SQL查询无关。 所以,我们给出上述SQL查询作为答案。 </think>要查询平均成绩大于80的所有学生学号姓名平均成绩,可以使用以下SQL语句: ```sql SELECT stu.sno AS 学号, stu.sname AS 姓名, AVG(sc.grade) AS 平均成绩 FROM sc -- 成绩表 JOIN stu -- 学生表 ON sc.sno = stu.sno GROUP BY stu.sno, stu.sname HAVING AVG(sc.grade) > 80; ``` ### 关键步骤说明: 1. **表连接** 使用`JOIN`将成绩表(`sc`)学生表(`stu`)通过学号(`sno`)关联 2. **分组计算平均分** `GROUP BY stu.sno, stu.sname` 按学生分组计算 `AVG(sc.grade)` 计算每个学生平均成绩 3. **筛选条件** `HAVING AVG(sc.grade) > 80` 过滤出平均分大于80的记录 (注意:`HAVING`用于筛选分组后的结果,不同于`WHERE`) ### 执行结果示例: | 学号 | 姓名 | 平均成绩 | |------|------|----------| | 2023001 | 张三 | 85.5 | | 2023003 | 王五 | 92.0 | | ... | ... | ... | [^1]: 核心逻辑参考分组聚合条件筛选的实现方式 [^2]: 表连接方法借鉴学生信息与成绩的关联查询
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值