精华内容
下载资源
问答
  • 查询学生平均成绩及其名次

    万次阅读 2020-10-07 09:43:13
    查询学生平均成绩及其名次 SELECT st.s_id, st.s_name, ROUND((CASE WHEN AVG(sc.s_score) IS NULL THEN 0 ELSE AVG(sc.s_score) END),2) "avg" FROM student st LEFT JOIN score sc ON sc.s_id=st.s_id GROUP ...

    建表语句点击详见

    查询学生平均成绩及其名次

    
    
    SELECT
    
    st.s_id,
    st.s_name,
    ROUND((CASE WHEN AVG(sc.s_score) IS NULL THEN 0 ELSE AVG(sc.s_score) END),2) "avg" 
    
    FROM student st
    LEFT JOIN score sc ON sc.s_id=st.s_id
    GROUP BY st.s_id ORDER BY  AVG(sc.s_score) DESC
    
    
    
    展开全文
  • SQL 查询:查询学生平均成绩

    千次阅读 2018-04-03 11:57:00
    写一条SQL 语句查出各科平均成绩并按学生姓名分组,按如下格式显示:学生姓名|语文|数学|英语。一开始遇到的时候挺懵的,有印象但是却忘了怎么写了,接下来就是查阅资料并亲自上手测试是否可行~  第一次代码修修改...

      编程萌新,因为遇到这么个SQL 查询的问题:在一张表A里有如下字段:学生姓名、学科名、学科成绩。写一条SQL 语句查出各科平均成绩并按学生姓名分组,按如下格式显示:学生姓名|语文|数学|英语。一开始遇到的时候挺懵的,有印象但是却忘了怎么写了,接下来就是查阅资料并亲自上手测试是否可行~

      第一次代码修修改改如下,此时还是在只用一张表来查询(无法实现上述目标结果,贴图只是为了说明下思考路线):

        

     1 select UName,
     2 (select AVG(Grades) from UserInfo where GName = '语文') as '语文',
     3 (select AVG(Grades) from UserInfo where GName = '数学') as '数学',
     4 (select AVG(Grades) from UserInfo where GName = '英语') as '英语' 
     5 from UserInfo
     6 where UName = '小明'
     7 group by UName
     8 /*having GName = '语文' and GName = '数学' and GName = '英语'*/
     9 order by AVG(Grades)
    10 go

     

      然后查阅资料也没有头绪,就想只用一张表是否真的可行,要不用两张表试一下?接下来就是在原表A(实际为如下代码中 UserInfo表)基础上插入一个 学生id 的字段,然后新建一张学生表(T_User),拥有两个字段:id、姓名,学生表的id匹配表A里的学生id,查询语句通过连接实现(因为是思考一个问题,就不考虑内外或者交叉连接的问题了),代码如下:

    1 select UName,
    2 (select AVG(Grades) from UserInfo where GName = '语文' and UName = tu.name) as '语文',
    3 (select AVG(Grades) from UserInfo where GName = '数学' and UName = tu.name) as '数学',
    4 (select AVG(Grades) from UserInfo where GName = '英语' and UName = tu.name) as '英语' 
    5  from UserInfo as ui join T_User as tu
    6  on ui.UName = tu.name
    7 group by ui.UName,tu.name
    8 go

     

      运行测试如下:

      成功!研究并解决差不多花了1个多小时,可能资质不行,但是会继续努力。从简单入手,从萌新出发~

    转载于:https://www.cnblogs.com/CharmRabbit/p/8707687.html

    展开全文
  • --创建一个学生表 ...--分组查询平均成绩 select Name 姓名,Course 科目,Avg(Score) 平均成绩 from Stu Group By Name,Course --行专列查询平均成绩 select Name 姓名,Avg(语文) as 语文,avg(数学) as 数学, a
    --创建一个学生表
    create table Stu
    (
        ID int primary key identity,
    	Name varchar(50),
    	Course varchar(50),
    	Score int
    )
    --分组查询平均成绩
    select Name 姓名,Course 科目,Avg(Score) 平均成绩 from Stu Group By Name,Course
    

    在这里插入图片描述

    --行专列查询平均成绩
    select Name 姓名,Avg(语文) as 语文,avg(数学) as 数学, avg(物理) as 物理 from Stu
    pivot (avg(Score) for Course in (语文,数学,物理)) as T group by Name
    

    在这里插入图片描述

    --创建一个视图
    alter view V_Stu
    as
    select Name 姓名,Avg(语文) as 语文,avg(数学) as 数学, avg(物理) as 物理 from Stu
    pivot (avg(Score) for Course in (语文,数学,物理)) as T group by Name
    --列转行
    select * from V_Stu unpivot (Score for Course in (语文,数学,物理)) as T
    

    在这里插入图片描述

    展开全文
  • Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 ...24、查询学生平均成绩及其名次 答:SELECT 1+(SELECT COUNT( distinct 平均成绩) FROM (SELECT S#,AVG(score) AS...

    Student(S#,Sname,Sage,Ssex) 学生表
    Course(C#,Cname,T#) 课程表
    SC(S#,C#,score) 成绩表
    Teacher(T#,Tname) 教师表

    24、查询学生平均成绩及其名次

    答:SELECT 1+(SELECT COUNT( distinct 平均成绩)
                  FROM (SELECT S#,AVG(score) AS 平均成绩
                          FROM SC
                      GROUP BY S#
                      ) AS T1
                WHERE 平均成绩 > T2.平均成绩) as 名次,
          S# as 学生学号,平均成绩
        FROM (SELECT S#,AVG(score) 平均成绩
                FROM SC
            GROUP BY S#
            ) AS T2
        ORDER BY 平均成绩 desc;


    --------------------------------------------------------------------------------

    网上找了一下,没有分析的文章,或许太简单了。那我们自己来分析。这里涉及到一个SELECT 表1.* FROM 表1 where 表1.字段=表2.字段的表遍历匹配的问题(表1、表2是数据库中同一个表或同一个表查询结果的别名)。

    但是代码一大堆,看得一头雾水,我们先拆开来,看T1表的查询(先去了COUNT有助于我们的分析)。

    view plaincopy to clipboardprint?
    SELECT distinct 平均成绩 FROM (SELECT S#,AVG(score) AS 平均成绩   
    FROM SC GROUP BY S#) T1 
    SELECT distinct 平均成绩 FROM (SELECT S#,AVG(score) AS 平均成绩
    FROM SC GROUP BY S#) T1

     

     图 T1

    接着看,T2表的查询。(加入"order by 平均成绩",可以让之后的对比效果更明显)

    view plaincopy to clipboardprint?
    SELECT S#,AVG(score) 平均成绩 FROM SC GROUP BY S# order by 平均成绩 
    SELECT S#,AVG(score) 平均成绩 FROM SC GROUP BY S# order by 平均成绩

     

     图 T2

    对比T1和T2的SQL查询语句及结果,可以看出,除了distinct的效果以外,其他代码基本上一致。

    拆分开来看,是简单的SQL语句,那么联合起来是一种什么效果呢?语句执行的顺序又是什么呢?

    我们参照图T1和图T2一步步来描述语句的执行顺序。
    view plaincopy to clipboardprint?
    循环第一次  
    for (select @i=1 from T2 order by  平均成绩 desc)  
    {  
        //取出 T2.平均成绩 = 87  
        if(T1.平均成绩 > T2.平均成绩) //即扫一遍T1看下有没有大于87的  
        {  
            return count(T1.平均成绩); //返回0个(T1中没有大于87的)  
        }  
    }  
     
     
    循环第二次  
    for (select @i=2 from T2 order by  平均成绩 desc)  
    {  
        //取出 T2.平均成绩 = 85  
        if(T1.平均成绩 > T2.平均成绩) //即扫一遍T1看下有没有大于85的  
        {  
            return count(T1.平均成绩); //返回1个(T1中刚好有87,大于T2的85)  
        }  
    }  
     
     
    循环第三次  
    for (select @i=3 from T2 order by  平均成绩 desc)  
    {  
        //取出 T2.平均成绩 = 85  
        if(T1.平均成绩 > T2.平均成绩) //即扫一遍T1看下有没有大于85的  
        {  
            return count(T1.平均成绩); //返回1个(T1中刚好有87,大于T2的85)  
        }  
    }  
     
     
    循环第四次  
    for (select @i=4 from T2 order by  平均成绩 desc)  
    {  
        //取出 T2.平均成绩 = 83  
        if(T1.平均成绩 > T2.平均成绩) //即扫一遍T1看下有没有大于85的  
        {  
            return count(T1.平均成绩); //返回2个(T1中刚好有87,85,大于T2的83)  
        }  
    }  
     
    以此类推... 直到遍历匹配完毕。 
    循环第一次
    for (select @i=1 from T2 order by  平均成绩 desc)
    {
        //取出 T2.平均成绩 = 87
        if(T1.平均成绩 > T2.平均成绩) //即扫一遍T1看下有没有大于87的
        {
            return count(T1.平均成绩); //返回0个(T1中没有大于87的)
        }
    }


    循环第二次
    for (select @i=2 from T2 order by  平均成绩 desc)
    {
        //取出 T2.平均成绩 = 85
        if(T1.平均成绩 > T2.平均成绩) //即扫一遍T1看下有没有大于85的
        {
            return count(T1.平均成绩); //返回1个(T1中刚好有87,大于T2的85)
        }
    }


    循环第三次
    for (select @i=3 from T2 order by  平均成绩 desc)
    {
        //取出 T2.平均成绩 = 85
        if(T1.平均成绩 > T2.平均成绩) //即扫一遍T1看下有没有大于85的
        {
            return count(T1.平均成绩); //返回1个(T1中刚好有87,大于T2的85)
        }
    }


    循环第四次
    for (select @i=4 from T2 order by  平均成绩 desc)
    {
        //取出 T2.平均成绩 = 83
        if(T1.平均成绩 > T2.平均成绩) //即扫一遍T1看下有没有大于85的
        {
            return count(T1.平均成绩); //返回2个(T1中刚好有87,85,大于T2的83)
        }
    }

    以此类推... 直到遍历匹配完毕。


    清晰理解了这一点,相信整段SQL代码就不难理解了。完整查询结果如下:

     

    另外需要补充一点的是distinct在这里的使用效果。

    需不需要distinct,要看排名的要求方式,要distinct是指顺序排名(如上面的例子,则为1,2,2,3...),不要是指跳序排名(如上面的例子,则为1,2,2,4...)。可见后者其实就是我们日常成绩的排名方式。

     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/djlzxzy/archive/2009/02/16/3897069.aspx

    展开全文
  • -- 24、查询学生平均成绩及其名次

    千次阅读 2020-10-06 07:47:00
    SELECT st.s_id,st.s_name,ROUND((CASE WHEN AVG(sc.s_score) IS NULL THEN 0 ELSE AVG(sc.s_score) END),2) "avg" FROM student st LEFT JOIN score sc ON sc.s_id=st.s_id GROUP BY st.s_id ORDER BY AVG(sc.s_...
  • 查询学生平均成绩及其名次_24

    千次阅读 2012-10-16 10:27:06
    --Student(S#,Sname,Sage,Ssex) 学生表 --Course(C#,Cname,T#) 课程表 --SC(S#,C#,score) 成绩表 --Teacher(T#,Tname) 教师表 ...-- 平均成绩相同的排名不影响后面的名次 select S# as 学号,平均成绩, (s
  • 3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩 SELECT st.s_id, st.s_name, ROUND (AVG(sc.s_score),2) FROM student st JOIN score sc ON st.s_id=sc.s_id GROUP BY st.s_id HAVING AVG(sc.s_...
  • 查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩 SELECT st.s_id, st.s_name, AVG(sc.s_score) FROM student st LEFT JOIN score sc ON sc.s_id=st.s_id GROUP BY st.s_id HAVING AVG(sc.s_score)&...
  • SQL查询学生平均成绩及其名次

    千次阅读 2021-01-19 10:38:55
    Student(Sid,Sname,Sage,Ssex) 学生表 Course(Cid,Cname,Tid) 课程表 SC(Sid,Cid,score) 成绩表 Teacher(Tid,Tname) 教师表 SQL查询语句为: SELECT 1+(SELECT COUNT( distinct ...平均成绩) 名次, Sid 学生学...
  • 4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩 – (包括有成绩的和无成绩的) SELECT st.s_id, st.s_name,CASE WHEN AVG(sc.s_score) IS NULL THEN '无' ELSE ROUND (AVG(sc.s_score) ,2) END AS '...
  • 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩 SELECT st.s_id, st.s_name, ROUND(AVG(sc.s_score),2) FROM student st LEFT JOIN score sc ON sc.s_id=st.s_id GROUP BY st.s_id HAVING ...
  • 查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩 (包括有成绩的和无成绩的) SELECT st.s_id, st.s_name, CASE WHEN AVG(sc.s_score) IS NULL THEN '无' ELSE ROUND (AVG(sc.s_score) ,2) END AS '...
  • 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩 写法一: 先从成绩表分组过滤平均成绩大于60的学生id和成绩。再和学生表连接,获取学生姓名 select student.s_id,student.s_name,a.avg from ...
  • select 住址,avg(入学成绩) as 平均入学成绩 from...select * from (select 住址,avg(入学成绩) as '入学平均成绩' from 学生表 group by 住址) as t where 入学平均成绩 >=80 这个应该以后能看懂,就不多写解释了
  • -- 创建学生课程表 create table tb_record ( recid int auto_increment comment '选课记录编号', sid int not null comment '选课学生', cid int not null comment '所选课程', seldate date not null ...
  • sql查询学生大于平均值的成绩

    千次阅读 2020-09-24 19:20:09
    查出每个学生对应的 平均值再与原表连接,然后查询条件就比较该课程成绩分数和平均值 select t1.student_id,course_id from t_mark t1, ( SELECT student_id,AVG(mark) avg from t_mark group by student_id ...
  • -- 2、查询平均成绩大于60分的学生的学号和平均成绩(简单,第二道重点) SELECT s_id,AVG(s_score) FROM score GROUP BY s_id HAVING AVG(s_score)>60

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,385
精华内容 554
关键字:

查询学生平均成绩