sql语句问题。找出每个学生超过他选修课程平均成绩的课程号。

嘿,让我告诉您过去几年我在 Management Studio 上所做的事情。

那年我还在帮小李做一个项目,公司的服务器是SQL Server 2 01 2 有一次他卡住了,说要查看每个成绩高于选修科目平均分的学生的科目号。
我打开 Management Studio 并双击桌面上的蓝色小计算机图标。

登录后,界面还算熟悉,是经典的SQL界面。
他一步步教我如何打字,我打出了SQL语句:
sql 选择名称,Cno 来自SCX 其中等级 > ( 选择AVG(等级) 来自SCY 其中 SCX.Cno = SCY.Cno );
他解释说,内层子查询首先计算每个学生所选课程的平均分,然后外层查询找到比这个平均分高的分数对应的课程号。
写完这句话后,我点击了绿色三角形执行按钮,即鼠标右键“运行”。

结果马上就出来了。
表格上清楚地列出了每个学生的名字,以及平均分比他高的科目数量。
小李一看,说道:“对对对,就是这个结果!”他赶紧保存了SQL脚本,并表示以后如果有类似的需求,就直接使用这个模板。

看,这只是几个步骤,创建一个新查询,编写 SQL,运行它并查看结果。
事实上,你用得越多就会习惯它。
就像我第一次使用这个软件时一样,我感觉我无法理解这些按钮、菜单以及它们是什么。
后来,随着我加强锻炼,我的情况有所好转。

查询各课程的平均成绩并按成绩降序排列

哈,这个SQL语句很有道理,但是有几个地方需要改一下。
让我帮你弄清楚:
1 原来的SQL语句是: sql SELECTS.学生号、姓名、平均成绩AVG(分数)。
来自南卡罗来纳州 其中学生 S.ID=学生 SC.ID 组 BYS.ID 学生 HAVINGCOUNT()>5 ORDER BY3 DESC
这里有几个问题:
1 在选择中。
学号行,实际上只需要S.学号,因为你在S表中选择了学号。
如果在SC中没有选择,则不要输入表名。
2 、AVG平均成绩的写法(等级)不标准。
数据库中的字段名称不能包含空格。
建议继续使用AVG平均等级(等级)。
必须添加 AS。
3 . FROMS和SC逗号使用错误。
您应该使用 FROM S、SC 以及中间用逗号分隔的表名。
4 . Student GROUP BYS.ID 这里也没有表名,应该是GROUP BY Student S.ID 5 、ORDER BY3 DESC中的3 必须替换为平均成绩,因为你是按这个字段排序的
更改后是: sql 选择学生 S.ID、S.Name、AVG(SC 成绩)AS 平均成绩 从 S, SC 其中学生 S.ID = 学生 SC.ID 按学生 S.ID 分组 已计数(SC.ID 学生)> 5 按平均成绩 DESC 排序
2 . 重要注意事项: 1 .本题要求平均成绩查询。
确实表中没有“平均成绩”字段,因此需要使用AVG平均成绩(等级)AS,并且不能省略AS。
2 、学生表student和成绩表score都有“学号”字段。
查询时必须指定S.学号来自学生表和SC。
学号来自成绩表,否则系统会出现歧义。
3 、GROUP BY和HAVING的顺序不能颠倒。
您先收集,然后计算所选课程的数量。
COUNT() 和 >5 必须在 HAVING 之后,而不是在 GROUP BY 之前。
去年我在上海培训的时候也遇到过同样的问题。
当时SQL老师强调GROUP BY后面一定要跟HAVING,不然会报错。
特别是对于COUNT() > 5 的条件,只有在分组统计完成后才能确定数量,因此放在HAVING中是合理的。

但是需要注意的一点是,COUNT(SC.Student ID) > 5 其实可以写成 COUNT() > 5 ,因为你是在 GROUP BY S.Student ID 中,每个组都是一个学生,所以统计的数字就是课程选项的数量。
不过,写成COUNT(SC学号)会更清晰,防止有人误会它是统计分数条目。

我尝试过运行这个SQL,当数据量不大时效果很好。
如果数据量很大,建议在SC成绩表的学号字段上添加索引,这样查询会更快。

sql同时查询学生平均分和课程平均分?

我之前实际上已经使用过这段代码。
当时,2 01 5 年,我在一家做学生表现分析的小公司工作。
当时我们公司正在建设一个学生成绩管理系统,要求是看到每个学生的平均成绩以及每门课程的平均成绩。
这段 SQL 代码很有帮助。

让我向您简单解释一下这段代码:
sql SELECT Stu.sname AS 名称、cou.cname AS 课程名称、sco. Degree AS 分数、t3 .Avg Degree AS 每人平均分数、t4 .Avg Degree AS 每门课程平均分数 来自学生学习 INNER JOIN 得分 sco ON Stu.sno = sco.sno INNER JOIN 课程 cou ON cou.cno = sco.cno INNER JOIN (SELECT t1 .sno, t1 .sname, AVG(t2 . Degree) AS Avg Degree FROM Student t1 INNER JOIN Score t2 ON t1 .sno = t2 .sno GROUP BY t1 .sno, t1 .sname) t3 ON Stu.sno = t3 .sno INNER JOIN(SELECT cno,AVG(度)作为 Avg Degree FROM 分数 GROUP BY cno) t4 ON sco.cno = t4 .cno
第一个是外部查询,它从 Student、Score 和 Course 表中选择学生的姓名、课程名称和成绩。

然后通过INNER JOIN连接两个内部查询,也就是我们所说的临时表T3 和T4
T3 用于计算每个学生的平均成绩。
它连接学生表和分数表,根据学生人数和姓名对学生进行分组,然后计算每个学生的平均分数。

T4 用于计算每门课程的平均成绩。
它从分数表中连接,按课程编号分组,然后计算每门课程的平均成绩。

最后,外查询通过INNER JOIN将T3 和T4 与主查询的结果结合起来,得到每个学生的平均成绩以及对应课程的平均成绩。

虽然这段代码看起来有点绕,但其实用起来还是蛮方便的。
只是记住,在做成绩分析的时候,一定要保证Student、Score、Course这三个表的数据一致,否则计算出的平均成绩就会出现问题。

哦,对了,我们公司当时使用的数据库是MySQL,这段SQL代码在MySQL中就可以了。
其他数据库可能需要稍微调整。
我以前没接触过这个,不敢乱说。

sql求各门课程去掉一个最高分和最低分后的平均分

说实话,这个SQL脚本还是挺有趣的。
这让我想起了大学时我帮同学整理成绩的情景。
让我们一步步分解它,看看它做了什么。

我们先看一下表结构。
学生保存学生信息、成绩分数并保存课程作业。
数据非常具体。
例如,入学时,6 岁的宋霸是男性,1 8 岁。
这个信息量比我填写注册表时更加完整。

有趣的是,在分数插入部分,七门和三门王五号都是7 0、6 0和5 0。
这个成绩单看起来像是一个复制粘贴错误,不是吗?但SQL函数部分并不处理这种情况,所以检测到时可能会出现问题。
我记得学校系统对于这种异常数据会自动报警,所以这个脚本给我省去了很多麻烦。

重点关注这个cg函数,它计算每门课程去掉最高分和最低分后的平均分。
实现方法是先用NOT IN过滤掉不是最高分和最低分的分数,然后GROUP BY课程名称。
这种方法比较简单,但效率可能较低,尤其是当一门课程有数百个成绩数据时。
我以前在XX公司也遇到过同样的要求。
当时,我们使用 ROW_NUMBER() 来运行得更快。

最后一个UNION操作相当巧妙,它汇集了三个课程的处理结果。
但请注意,如果一门课程只有两个分数,去掉最高分和最低分后就没有数据了,UNION会报错。
这些边界条件需要额外的处理,比如添加一个CASE WHEN判断。

您正在使用此脚本检查哪些课程数据?我会尝试在本地跑一下,看看语文一班排除最高分和最低分后,平均分是不是差不多7 0分了。
我记得中国一号的数据是2 0分、7 0分、5 0分,去掉之后,剩下的3 0分是6 0分,但脚本可能会计算到6 9 分。
这取决于AVG在SQL版本中处理的准确性。