从数据库中选择前10名学生

时间:2011-06-29 04:55:48

标签: mysql sql

  

可能重复:
  sql to select top 10 records

假设您有一个包含StuId,StuName,Subject,Grade的表。您需要提供子查询以返回荣誉学生名单(前10%),按其平均成绩排序。

例如,如果我有10名学生的平均成绩是100,90,80,...... 10。 需要输出平均值为100的第一个学生姓名。仅输出一个学生成绩。所以我不能使用限制10

我正在使用mysql 5.1。

这是我的问题:

SELECT Stuname, TOP 10 Avg(Grade) as GPA 
  FROM Table 
GROUP BY Stuid 
ORDER BY GPA

由于TOP 10,查询不正确。检查MYSQL 5.1参考,它不支持前10名。

根据评论,我不认为可以使用一个查询来解决,所以我想出了一个方法:

F(conn){
Statement stmt;
int top10percnet = 0;
try{
stmt = conn.createStatement;
String query = "select CEIL(count(stuname)*10/100) as 10percent from grades";
ResultSet rs = stmt.execute(query);
while(rs.next()){
  top10percent = rs.getString("10percent");
}
query = "select stuname, avg(grade) as average from grades group by stuname order
by average desc limit " + Integer.toString(top10percnet);
rs=stmt.execute(query);
while(rs.next()){
   ...// output result
}
}
catch(SQLException e){
}



}  

5 个答案:

答案 0 :(得分:3)

更新

听起来你想要加入一个HAVING条款来限制那些得分高于90的平均成绩的人。

尝试

SELECT Stuid, Stuname, AVG(Grade) AS GPA FROM Table
GROUP BY Stuid, Stuname
HAVING AVG(GRADE) > 90
ORDER BY GPA DESC -- If you want highest-to-lowest. Thanks Bohemian

答案 1 :(得分:2)

使用LIMITDESC订单(即从最高到最低):

select Stuname, Avg(Grade) as GPA
from Table
group by Stuid
order by 1 DESC -- Add DESC
LIMIT 10 -- Add LIMIT

答案 2 :(得分:2)

TOP是SQL Server 2000+特有的; MySQL使用LIMIT语法 - 既不是ANSI,也是最近只有FETCH FIRST 10 ROWS ONLY制作的ANSI(DB2是我所知道的唯一支持它的数据库)。

因为您将问题标记为“mysql”:

  SELECT t.stuname,
         AVG(t.grade) AS grade_avg
    FROM TABLE t
GROUP BY t.stuname
ORDER BY grade_avg DESC
   LIMIT 10

对于SQL Server 2000+,查询将是:

  SELECT TOP 10
         t.stuname,
         AVG(t.grade) AS grade_avg
    FROM TABLE t
GROUP BY t.stuname
ORDER BY grade_avg DESC

TOP始终位于SELECT子句中的列之前。从SQL Server 2005+开始,您可以在顶部值周围使用括号来允许您使用变量:

DECLARE @int_var INT
SET @int_var = 10

  SELECT TOP (@int_var)
         t.stuname,
         AVG(t.grade) AS grade_avg
    FROM TABLE t
GROUP BY t.stuname
ORDER BY grade_avg DESC

这允许您动态设置TOP,而无需动态SQL。

答案 3 :(得分:2)

count = select CEIL(count(Stuname)*10/100) from table_name;
select Stuname from table_name ORDER BY GPA DESC limit count;

第一个查询将返回10%的students.CEIL用于将其转换为整数。 第二个查询是检索数据。 从第一个查询计算的计数被设置为第二个查询的限制。

答案 4 :(得分:1)

您是否尝试过使用LIMIT?

e.g。

select Stuname, Avg(Grade) as GPA from Table group by Stuid order by GPA limit 10