sql排序问题 查询学生成绩5-7名的学生学号、课程号、成绩

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql排序问题 查询学生成绩5-7名的学生学号、课程号、成绩相关的知识,希望对你有一定的参考价值。

自己做的,但是运行结果不是自己想要的,而且有点复杂了
selectsc.sno,course.cno,sc.grade
fromsc,course
wheresc.snonotin(selecttop3sc.sno
fromsc
wheregradenotin(selecttop4grade
fromsc
orderbygradeDESC)
orderbygradeDESC
);

建立的三个表
create table student
(sno char(20) primary key,
sname char(30),
ssex char(4),
sage int,
sdept char(4)
)
insert into student(sno,sname,ssex,sage,sdept)
values('95001','李勇','男','20','CS')
insert into student
values('95002','刘晨','女',19,'IS')
insert into student
values('95003','王敏','女',18,'MA')
insert into student
values('95004','张立','男',19,'IS')

create table course
(cno char(4) primary key,
cname char(20),
cpno char(4),
ccredit int
)
insert into course(cno,cname,cpno,ccredit)
values('1','数据库','5',4)
insert into course(cno,cname,cpno,ccredit)
values('2','数学',NULL,2)
insert into course(cno,cname,cpno,ccredit)
values('3','信息系统','1',4)
insert into course(cno,cname,cpno,ccredit)
values('4','操作系统','6',3)
insert into course(cno,cname,cpno,ccredit)
values('5','数据结构','7',4)
insert into course(cno,cname,cpno,ccredit)
values('6','数据处理',null,2)
insert into course(cno,cname,cpno,ccredit)
values('7','PASCAL语言','6',4)

create table sc
(sno char(20),
cno char(4),
grade smallint,
primary key(sno,cno),
foreign key(sno) references student(sno),
foreign key(cno) references course(cno),
)
insert into sc(sno,cno,grade)
values('95001','1',92)
insert into sc(sno,cno,grade)
values('95001','2',85)
insert into sc(sno,cno,grade)
values('95001','3',88)
insert into sc(sno,cno,grade)
values('95002','2',90)
insert into sc(sno,cno,grade)
values('95002','3',80)
…………

select sno,cno,grade,rnk
from (select sno,cno,grade,row_number() over (partition by cno order by grade desc) rnk from sc)
where rnk between 5 and 7
order by cno,rnk
;
这样能查出每门课程排名第5-7名的信息
参考技术A SELECT * FROM
(
SELECT
sc.sno, student.sname, sc.cno, course.cname, sc.grade,
ROW_NUMBER() OVER( ORDER BY sc.grade DESC) AS NO
FROM
sc JOIN student ON (sc.sno = student.sno)
JOIN course ON (sc.cno = course.cno)
) subQuery
WHERE
NO between 5 and 7;

如果你数据库是 SQL Server 2005 以上版本的话, 应该没有问题。

ROW_NUMBER() 是 行号。
可能对于你这种, 要排名的, 不是很合适。

你可以换成 RANK() 函数, 或者 DENSE_RANK() 函数来实现。

排名或顺序的函数 ROW_NUMBER/RANK/DENSE_RANK/NTILE 的举例说明:

http://hi.baidu.com/wangzhiqing999/item/f353c04e08665fa7de2a9f2a

SQL语句查询每个学生的学号、姓名、平均成绩、最高成绩和最低成绩

参考技术A select 学生表.学号,学生表.姓名,
average(成绩表.成绩) as 平均成绩,
max(成绩表.成绩) as 最高成绩,
min(成绩表.成绩) as 最低成绩
from 学生表 left join 成绩表 on 学生表.学号=成绩表.学号
order by 学生表.学号
成绩表可换成语文、数学、英语等,查询结果就是各个学生相应课程的平均成绩、历史最高成绩、历史最低成绩.

以上是关于sql排序问题 查询学生成绩5-7名的学生学号、课程号、成绩的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句查询每个学生的学号、姓名、平均成绩、最高成绩和最低成绩

sql,查询每门课程最高分的学生的学号,课程号,成绩。再一张表里

学生成绩管理程序

查询课程1比课程2成绩高的学生

深耕MySQL - 50道SQL练习题

数据库查询总成绩最高的三名学生的学号