`
pcajax
  • 浏览: 2106983 次
  • 性别: 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

分享到:
评论

相关推荐

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

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

    学生成绩管理系统_数据库设计(内含sql查询语句) (2).pdf

    学生成绩管理系统_数据库设计(内含sql查询语句) (2).pdf学生成绩管理系统_数据库设计(内含sql查询语句) (2).pdf学生成绩管理系统_数据库设计(内含sql查询语句) (2).pdf学生成绩管理系统_数据库设计(内含sql查询语句)...

    SQL笔试题题目及解析.docx

    以下是一些常见的SQL笔试题题目及其解析:查询语句: 题目:请编写一个SQL查询语句,从表"Customers"中选取所有姓为"Smith"的顾客记录。 解析:使用SELECT语句配合WHERE子句进行筛选。 聚合函数: 题目:请编写一个...

    学生成绩管理系统 数据库设计(内含sql查询语句).pdf

    学生成绩管理系统 数据库设计(内含sql查询语句).pdf学生成绩管理系统 数据库设计(内含sql查询语句).pdf学生成绩管理系统 数据库设计(内含sql查询语句).pdf学生成绩管理系统 数据库设计(内含sql查询语句).pdf学生成绩...

    姓名与平均成绩排序

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

    学生成绩管理系统源代码(java)+Swing窗口程序+mysql数据库

    开发工具:eclipse 数据库:mysql 数据库参数配置类:MysqlForm 程序启动主类:MainForm 数据库脚本文件:grade_manage.sql 使用技术:mysql数据库,java数据库技术,swing组件,...按班级,科目及分数段查询学生成绩;

    SQL+VB学生成绩管理系统

    SQL+VB学生成绩管理系统,主要实现成绩的录入,查询,管理

    查询学生不同科目的成绩

    本资源 主要是根据两个表(student)和科目分数表(grade)的sql语句查询,适合目前学习mysql数据库进行练习多表查询的操作。主要是针对三个问题展开的①列出各门课程成绩最好的2位学生,要求显示字段:学号,姓名,科目...

    Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解 (黄玮) 高清PDF扫描版

    oracle数据库的性能优化直接关系到系统的运行效率,而影响数据库性能的一个重要因素就是sql性能问题。本书是作者十年磨一剑的成果之一,深入分析与解剖oracle sql优化与调优技术,主要内容包括: 第一篇“执行计划...

    SQL语言嵌套查询和数据更新操作

    13. 统计每位学生选修课程的门数、学分及其平均成绩; 14. 统计选修每门课程的学生人数及各门课程的平均成绩; 15. 找出平均成绩在85分以上的学生,结果按系分组,并按平均成绩的升序排列; 16. 查询选修了“1”...

    学生成绩管理系统_数据库设计(内含sql查询语句).pdf

    学生成绩管理系统_数据库设计(内含sql查询语句).pdf学生成绩管理系统_数据库设计(内含sql查询语句).pdf学生成绩管理系统_数据库设计(内含sql查询语句).pdf学生成绩管理系统_数据库设计(内含sql查询语句).pdf学生成绩...

    vb+sql学生成绩管理系统

    Dim 学生成绩管理系统As New 学生信息管理系统 学生成绩管理系统.添加DToolStripMenuItem.Enabled = False 学生成绩管理系统.修改KToolStripMenuItem.Enabled = False 学生成绩管理系统.删除DToolStripMenuItem....

    sql学生成绩管理数据库

    学生成绩管理数据库,SQL serves2012学生表,课程表,成绩表

    学生成绩管理系统 java+sql

    学生成绩管理系统 java+sql

    MYSQL题目练习

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

    学生成绩信息管理系统 ASP.NET (论文+源码)

    学生成绩统计:对学生成绩总分,平均分等进行统计。 系统管理员后台用户名为 admin 密码为 www.mycodes.net 普通用户(测试用例)用户名为:user01,密码:111111 DB下为Sql数据库,附加即可 论文下为该程序的论文及...

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

    (2)学生信息的查询,包括查询学生基本信息和成绩。 (3)学生信息的修改,包括修改学生基本信息和成绩。 (4)学生信息的删除,包括修改学生基本信息和成绩。 (5)登录用户密码修改,用户登录到系统可进行相应的...

    Java+MYSQL学生管理系统_javaSQL学生成绩管理_

    语言:java+SQL平台:eclipse+Mysql实现功能:连接数据库,实现对学生信息的基本的增删该查功能。

    MySQL面试题文档,MySQL面试题,包含各种场景和知识点,例如基础查询、连接、聚合、事务、表设计等

    基础查询: 题目:查询员工表(employees)中薪资高于平均薪资的员工信息。 连接: 题目:查询员工表(employees)和部门表(departments)中所有员工的详细信息,包括员工名、部门名称和部门位置。 聚合: 题目:...

Global site tag (gtag.js) - Google Analytics