`
pcajax
  • 浏览: 2162558 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SQL的老题目:查询学生平均成绩及其名次

阅读更多

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

分享到:
评论

相关推荐

    SQL课程设计(学生成绩管理系统)

    【SQL课程设计——学生成绩管理系统】 在信息技术领域,数据库管理是至关重要的组成部分,而SQL(Structured Query Language)则是管理关系型数据库的标准语言。在这个“SQL课程设计”中,我们聚焦于一个具体的应用...

    SQL+VB学生成绩管理系统

    四、成绩查询 查询功能允许用户按不同条件查找成绩,如按学生姓名、学号、班级或科目。在VB界面上,可以设置各种查询条件的输入框和下拉列表,配合查询按钮触发SQL的SELECT语句。查询结果通常以表格形式展示,方便...

    SQL语句练习及答案

    **题目:** 查询课程编号为“3-105”的学生中成绩超过“3-245”课程的最高成绩的学生学号(sno)、姓名(sname)和成绩(degree),同时列出比最高成绩低的差值。 **SQL语句:** ```sql WITH max_score AS (SELECT MAX...

    c#.net+sqlserver毕业设计学生成绩管理系统

    4. 成绩查询:按学生、课程、学期等多种条件进行成绩查询,满足不同需求。 5. 成绩统计:生成各类统计报表,如平均分、最高分、最低分、及格率等,帮助教学评估。 6. 权限管理:设定不同角色(如管理员、教师、学生...

    学生平均成绩大于80同表sql

    sql语句 查询同表中学生评价成绩大于80 的人

    sql学生成绩查询系统(简单页面

    【SQL学生成绩查询系统】是一个基础的网页应用,主要用于教育机构或个人学习环境中,方便学生、教师或管理员快速查询学生的成绩。系统的核心是数据库管理,通过SQL(结构化查询语言)来操作和检索数据。这里,我们...

    java+SQLServer学生成绩管理系统(代码+数据库)

    【Java + SQLServer 学生成绩管理系统】 在IT领域,构建一个学生成绩管理系统是常见的实践项目,尤其对于初学者来说,它可以帮助理解和掌握数据库管理、后端编程以及用户界面设计的基本概念。在这个"java+SQLServer...

    asp+sql 新生入学查询、学生档案成绩管理系统

    《ASP+SQL构建新生入学查询与学生档案成绩管理系统详解》 在信息技术日益发达的今天,教育领域的信息化管理已经成为提升教学效率、优化教育资源分配的重要手段。本文将深入探讨一个基于ASP和SQL技术构建的新生入学...

    简单sql查询练习

    ### 题目23: 查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。 ```sql SELECT Sno, Grade FROM SC WHERE Cno = '3' ORDER BY Grade DESC; ``` - **解释**: 此查询筛选出选修了课程号为`3`的学生...

    由VB+SQLSERVER2000开发的学生成绩管理系统

    3. **成绩查询**:系统应允许教师、学生和家长根据学号、姓名、课程等条件查询成绩,VB可以通过SQL查询语句与数据库进行交互,返回查询结果。 4. **成绩统计分析**:系统能进行成绩统计,如平均分、最高分、最低分...

    几个很好的SQL题目

    ### SQL问题一:查询每位学生及其前一位学生的成绩 #### 题目描述: 假设我们有一个表`ѧɼֶ`,该表记录了学生的学号以及成绩。表中的数据如下所示: | 学号 | 成绩 | |------|------| | 1 | 199 | | 2 | 198 | |...

    学生成绩查询系统sql2005

    "学生成绩查询系统sql2005"是一款基于Visual Basic (VB) 开发的软件,结合了SQL Server 2005数据库技术,旨在提供一个高效、便捷的成绩查询平台。该系统的主要功能是帮助教育机构管理和查询学生的学术成绩,简化了...

    姓名与平均成绩排序

    面试题目:使用java代码实现类似sql语句的分组去重,求平均值,按照平均值从低到高进行输出。

    C#学生成绩管理系统+sql

    3. 成绩查询模块:按学生、课程或时间段筛选成绩,展示查询结果。 4. 成绩修改模块:允许教师对错误或过时的成绩进行修正。 5. 成绩统计模块:计算平均分、最高分、最低分,进行排名等统计分析。 6. 数据备份与恢复...

    MYSQL题目练习

    --3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩 --4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩 --4.1、查询在sc表存在成绩的学生信息的SQL语句。 --4.2、查询在sc表中不...

    C#与sql的学生成绩管理系统+sql文件

    4. **成绩查询**:按学生、课程、学期等多种条件查询成绩,展示详细的个人成绩单。 5. **统计分析**:生成班级平均分、最高分、最低分等统计数据,可以进行排名,分析不及格率,为教学改进提供参考。 6. **报表导出*...

    sql课程设计---学生成绩管理系统

    - **成绩查询**:提供多维度的成绩查询功能,如按学号、课程号等查询。 - **成绩统计**:支持按班级、年级进行成绩统计分析。 - **用户管理**:实现不同用户角色的权限控制,确保数据安全。 #### 六、关键技术 - *...

    <学生成绩管理系统>SQL+VB

    - 成绩查询:根据学生、课程、学期等条件查询历史成绩。 - 统计分析:计算平均分、排名、及格率等统计指标,为教学评估提供依据。 - 报表打印:生成成绩单、班级成绩分布图等,便于教学管理和家长沟通。 总结...

    sql server 2008学生成绩管理数据库

    使用这个数据库,学生可以查询个人的成绩和选课情况,教师可以查看全班或个别学生的成绩,管理员则可以统计分析整个学院或学校的数据,比如平均分、及格率、最高分和最低分等。 在实际应用中,我们可以通过SQL ...

    SQL学生成绩查询

    SQL学生成绩查询 本资源主要介绍了如何使用SQL语句对数据库进行操作,包括创建数据库、添加数据、修改数据和删除数据等基本操作。同时,也介绍了如何使用SQL语言来建立数据库和录入数据。 知识点1:创建数据库 在...

Global site tag (gtag.js) - Google Analytics