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)
…………

参考技术A select top 3 * from sc
where grade not in
(
select top 4 grade from sc
order by grade desc
)
order by grade desc追问

如果要单门课成绩排第5到第7呢?
如果该同学所有课程的成绩加起来,排第五到第七名?

追答

--额,我写的没实际意义了,不好意思,方法同上用top和in,可以先建个两个视图,简化查询
--1)如果要单门课成绩排第5到第7呢
create view v$_temp
as
select * from sc
where cno =
(
select cno from course
where cname = '某门课程'
)
go
--然后用上面的写法,替换下表名就可以了
select top 3 * from v$_temp
where grade not in
(
select top 4 grade from v$_temp
order by grade desc
)
order by grade desc
--2)如果该同学所有课程的成绩加起来,排第五到第七名?
--方法类似,创建视图,视图包括(sno,总分)
create view v$_temp_1
as
select sno, sum(grade) as "总分" from sc
group by sno
go
--视图建好了,最后一个自己知道怎么写了吧,我就不写了,自己练习下
--欢迎追问

追问

select top 3 * from v$_temp_1
where sum(grade) not in (
select top 4 sum(grade)
from v$_temp_1
order by sum(grade) desc )
order by sum(grade) desc 我这样写了报错列名grade无效?
还有就是视图开头create view v$_temp_1这一句也报错说错误的语法:“CREATE VIEW”必须是批处理中仅有的语句。这是什么情况?

追答

额,视图中没有grade列,只有总分列,你把sum(grade)换成总分就可以了,需要其他的属性就用sno和其他的表内连接···
建立视图必须是作为单独运行,你运行的时候没把它放第一句就报错

本回答被提问者和网友采纳
参考技术B 不是给你解决了么,怎么又问追问

运行有问题

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练习题

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