数据库综合练习

下图分别是练习中的教师表,学生表,成绩表,科目表

 

 

 

 

练习如下

1、查询“c001”课程比“c002”课程成绩高的所有学生的学号;

方法一:使用自连接
selectc.sno 学号
fromsc c
inner joinsc tonc.sno=t.sno andc.cno='c001' andt.cno='c002'
wherec.score>t.score

方法二:使用相关自查询
selects.sno fromsc s
wheres.sno in (
selectc.sno fromsc c
wheres.score>c.score ands.cno='c001' andt.cno='c002'
)

2、查询平均成绩大于60分的同学的学号和平均成绩

selectc.sno,avg(score) 平均成绩
fromsc c
group byc.sno
having avg(score)>60

3、查询所有同学的学号、姓名、选课数、总成绩;

selectt.sno 学号,t.sname 姓名,count(s.cno) 选课数,sum(s.score) 总成绩
fromstudent t
left joinsc sont.sno=s.sno
group byt.sno,t.sname

4、查询姓的老师的个数;

select count(tname) 数量
fromteacher t
wheret.tname like '%'

5、查询没学过谌燕老师课的同学的学号、姓名;

方法一:
5.1查询出老师的编号
selectt.tno fromteacher t
wheret.tname='谌燕'

5.2查询出老师的所有课程
selects.cno
fromcourse s
inner jointeacher tont.tno=s.tno
wheret.tname='谌燕'
5.3查询出学过谌燕老师课的同学的学号
selectc.sno
fromsc c
wherec.cno in (
 selects.cno
fromcourse s
inner jointeacher tont.tno=s.tno
wheret.tname='谌燕'
)
group byc.sno
5.4查询出没学过谌燕老师课的同学的学号、姓名
selectd.sno,d.sname
fromstudent d
whered.sno not in (
 selectc.sno
fromsc c
wherec.cno in (
 selects.cno
fromcourse s  
inner jointeacher tont.tno=s.tno
wheret.tname='谌燕'
)
)

方法二:
 selectd.sno,d.sname
fromstudent d
whered.sno not in (
select distincts.sno fromstudent s
left joinsc conc.sno=s.sno
left joincourse oonc.cno=o.cno
left jointeacher tont.tno =o.tno
wheret.tname = '谌燕'
)

6、查询学过“c001”并且也学过编号“c002”课程的同学的学号、姓名;

方法一:通过子查询+自连接
---.1查询学过“c001”并且也学过编号“c002”课程的同学的学号
selectc.sno
fromsc c
inner joinsc tonc.sno=t.sno
where (c.cno='c001' andt.cno='c002') or (c.cno='c002' andt.cno='c001')
group byc.sno
---.2、查询学过“c001”并且也学过编号“c002”课程的同学的学号、姓名;
selectd.sno,d.sname
fromstudent d
whered.sno  in (selectc.sno
fromsc c
inner joinsc tonc.sno=t.sno
where (c.cno='c001' andt.cno='c002') or (c.cno='c002' andt.cno='c001')
group byc.sno)

方法二:通过相关子查询
selectt.sno,t.sname fromstudent t
left joinsc sons.sno=t.sno
wheres.sno in (
selectc.sno fromsc c
wheres.cno='c001' andc.cno='c002'
)

7、查询学过谌燕老师所教的所有课的同学的学号、姓名;

---5.2查询出老师的所有课程的数量
select count(s.cno)
fromcourse s
inner jointeacher tont.tno=s.tno
wheret.tname='谌燕'

SELECT DISTINCTstudent.sno,student.sname
FROMstudent
WHEREstudent.sno IN(
SELECTsc.sno
FROMsc
wheresc.cno in (
selectcourse.cno
fromcourse
wherecourse.tno in(
selectteacher.tno fromteacher
whereteacher.tname='谌燕'
)
)
group bysc.sno
having count(distinctsc.sno)=(
select count(s.cno)
fromcourse s
inner jointeacher tont.tno=s.tno
wheret.tname='谌燕'
)
)
方法二:
selects.sno,s.sname fromstudent s
left joinsc conc.sno=s.sno
wherec.cno in(
selecto.cno fromteacher t
left joincourse oont.tno=o.tno
wheret.tname='谌燕')
group bys.sno,s.sname
having count(c.cno)=(
select count(o.cno) fromteacher t
left joincourse oont.tno=o.tno
wheret.tname='谌燕'
)

8、查询课程编号“c002”的成绩比课程编号“c001”课程低的所有同学的学号、姓名;

selectt.sno 学号,t.sname 姓名
fromstudent t
wheret.sno not in (
selectc.sno 学号
fromsc c
inner joinsc tonc.sno=t.sno andc.cno='c001' andt.cno='c002'
wherec.score>t.score)

9、查询所有课程成绩小于60分的同学的学号、姓名;

--方法一,
selects.sno 学号,s.sname 姓名
fromstudent s
full outer joinsc tont.sno=s.sno
group bys.sno,s.sname
having sum(t.score)<60
--方法二
selects.sno 学号,s.sname 姓名
fromstudent s
wheres.sno not in(
selectc.sno
fromsc c
group byc.sno
having sum(c.score)>60
)

10、查询没有学全所有课的同学的学号、姓名;

selects.sno,s.sname
fromstudent s
wheres.sno in (
--查询出满足条件的所有sno
selectc.sno
fromsc c
group byc.sno
having count(c.cno)=(
select count(o.cno) fromcourse o
)
)

11、查询至少有一门课与学号为“s001”的同学所学相同的同学的学号和姓名;

selects.sno,s.sname
fromstudent s
full outer joinsc cons.sno=c.sno
wherec.cno in(
selectsc.cno fromsc
wheresc.sno='s001'
) andc.sno not like 's001'
group bys.sno,s.sname

12、查询至少学过学号为“s001”同学所有课的其他同学学号和姓名;

selectt.sno,t.sname fromstudent t
inner joinsc sons.sno=t.sno
wheres.cno in (
selectc.cno fromsc c
wherec.sno='s002'
) ands.sno not like 's002'
group byt.sno,t.sname
having count(s.cno)>=(
select count(n.cno) fromsc n
wheren.sno='s002'
)

13、把“SC”表中谌燕老师教的课的成绩都更改为此课程的平均成绩;

UPDATESC
SETSC.score=(
SELECT avg(s.score) fromsc s
inner joincourse oons.cno=o.cno
inner jointeacher tont.tno=o.tno
wheret.tname='谌燕' andsc.cno=s.cno
group bys.cno
)
wheresc.cno=(
selectc.cno fromcourse c
left jointeacher tont.tno=c.tno
wheret.tname='谌燕' andsc.cno=c.cno
)

14、查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名;

方法一:
selects.sno fromsc s
left join (select distinctc.cno fromsc cwherec.sno='s001')c1onc1.cno=s.cno
group bys.sno
having count(s.cno)=(select distinct count(c.cno) fromsc cwherec.sno='s001') ands.sno<>'s002'





 

15、删除学习谌燕老师课的SC表记录;

16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“c002”课程的同学学号、“c002”号课的平均成绩;

INSERT INTOsc
                 
(sno, cno, score)
VALUES  ('s005','c001',
(select AVG(s.score)
fromsc s
group bys.cno
havings.cno='c002'
))

17、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分

select s.cno课程ID,MAX(s.score)最高分,min(s.score)最低分
from sc s
group by s.cno

18、按各科平均成绩从低到高和及格率的百分数从高到低顺序

selects.cno 科目,avg(s.score) 平均成绩,cast(
round(cast(SUM(case whens.score>60 then 1 else 0 end) as float)/cast(count(*) as float)*100,2)
asnvarchar(10) )+'% ' 及格率
fromsc s
group bys.cno
order by avg(s.score) asc,cast(
round(cast(SUM(case whens.score>60 then 1 else 0 end) as float)/cast(count(*) as float)*100,2)
asnvarchar(10) ) desc

 
selects.cno 科目
 ,
cast
(
round(cast(SUM(case whens.score>60 then 1 else 0 end) as float)/cast(count(*) as float)*100,2)
asnvarchar(10) )+'% ' 及格率
fromsc s
group bys.cno

19、查询不同老师所教不同课程平均分从高到低显示

selectt.tname 教师,c.cno 科目,avg(s.score) 平均值
fromsc s
right joincourse cons.cno=c.cno
right jointeacher tonc.tno=t.tno
group byc.cno,t.tname
order by avg(s.score) desc

-- select *
--fromsc s
--full outer joincourse cons.cno=c.cno
--full outer jointeacher tonc.tno=t.tno
--group byc.cno,t.tname

20、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]

select
c.cno 课程id,
o
.cname 课程名称,
sum(case whenc.score>85 andc.score<100 then 1 else 0 end) [100-85],
sum(case whenc.score>70 andc.score<85 then 1 else 0 end) [85-70],
sum(case whenc.score>60 andc.score<70 then 1 else 0 end) [70-60],
sum(case whenc.score<60 then 1 else 0 end) [ <60]
fromsc c
joincourse oonc.cno=o.cno
group byc.cno,o.cname

21、查询各科成绩前三名的记录:(不考虑成绩并列情况)

 selects.score,s.cno
 fromsc s
 
left joinsc conc.cno=s.cno andc.score<s.score
 group bys.score,s.cno
 having count(c.cno)<3
 order bys.cno

22、查询每门课程被选修的学生数

selecto.cname 课程,count(s.cno) 人数
fromsc s
right joincourse oons.cno=o.cno
group byo.cname

23、查询出只选修了一门课程的全部学生的学号和姓名

selects.sno 学号,s.sname 姓名
fromstudent s
inner joinsc conc.sno =s.sno
--group byc.cno, s.sno,s.sname
--having count(c.cno)=1
wherec.sno in (
selectt.sno fromsc t
group byt.sno
having count(t.sno)=1
)

24、查询男生、女生人数

selectt.ssex 性别,count(t.ssex) 人数 fromstudent t
group byt.ssex

25、查询姓的学生名单

selects.sname fromstudent s
wheres.sname like '%'

26、查询同名同性学生名单,并统计同名人数

selectt.sname,count(t.sname)
fromstudent t
left joinstudent sons.sname=t.sname ands.ssex=s.ssex
group byt.sname
having count(t.sname)>1

271981年出生的学生名单(注:Student表中Sage列的类型是numeric)

28、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列

select avg(c.score) fromsc c
group byc.cno
order by avg(c.score) asc,c.cno desc

29、查询平均成绩大于85的所有学生的学号、姓名和平均成绩

selectt.sno,t.sname,avg(s.score) fromstudent t
left joinsc sons.sno=t.sno
wheret.sno in (
selectc.sno fromsc c
group byc.sno
having avg(c.score)>60
)
group byt.sno,t.sname

30、查询课程名称为数据库,且分数低于60的学生姓名和分数

selectt.sname,s.score fromstudent t
left joinsc sont.sno=s.sno
wheres.cno in(
selecto.cno fromcourse o
whereo.cname='SQL SERVER 2005'
) ands.score<60

31、查询所有学生的选课情况;

selectt.sname,count(s.cno) fromstudent t
left joinsc sont.sno=s.sno
group byt.sno,t.sname

32、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;

selects.sname 姓名,o.cname 课程名称,c.score 课程成绩  fromstudent s
left joinsc conc.sno=s.sno
left joincourse oonc.cno=o.cno
group byc.sno,s.sname,o.cname,c.score
havingc.score>70

33、查询不及格的课程,并按课程号从大到小排列

selecto.cname 课程名称 fromsc s
left joincourse oono.cno=s.cno
wheres.score<60
order bys.cno desc

34、查询课程编号为c001且课程成绩在80分以上的学生的学号和姓名;

selects.sno 学号,s.sname 名称
fromstudent s
left joinsc conc.sno=s.sno
wherec.score>80 andc.cno='c001'
--

35、求选了课程的学生人数

select count(distinct s.sno) from sc s

36、查询选修谌燕老师所授课程的学生中,成绩最高的学生姓名及其成绩

selecttop1s.sname 姓名,c.score 成绩 fromstudent s
left joinsc conc.sno=s.sno
left joincourse oono.cno=c.cno
left jointeacher tont.tno=o.tno
wheret.tname='谌燕'
order byc.score desc

37、查询各个课程及相应的选修人数

selecto.cname 课程,count(s.cno) 人数 fromsc s
left joincourse oono.cno=s.cno
group byo.cname

38、查询不同课程成绩相同的学生的学号、课程号、学生成绩

select distincts.sno 学号,c.score 课程号,o.cname 学生成绩 fromstudent s
left joinsc conc.sno=s.sno
left joincourse oono.cno=c.cno
wherec.sno in
(
select distincta.sno fromsc a
left joinsc bonb.sno=a.sno andb.cno !=a.cno
wherea.score=b.score
)

39、查询每门功课成绩最好的前两名

selects.cno,s.sno fromsc s
left joinsc conc.cno=s.cno andc.score<s.score
group byc.cno,s.cno,s.sno
having count(c.cno)<3
order bys.cno desc

40、统计每门课程的学生选修人数(超过10人的课程才统计)。--要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

lselect s.cno 课程号,count(s.cno) 参与人数 fromsc s
group bys.cno
having count(s.cno)>=10
order by count(s.score) desc,s.cno asc

41、检索至少选修两门课程的学生学号

selects.sno fromsc s
group bys.sno
having count(s.cno)>2

42、查询全部学生都选修的课程的课程号和课程名

selecto.cno,o.cname fromcourse o

43、查询没学过谌燕老师讲授的任一门课程的学生姓名

select distincts.sno,s.sname fromstudent s
left joinsc conc.sno=s.sno
left joincourse oonc.cno=o.cno
left jointeacher tont.tno=o.tno
wheret.tname='刘阳'

44、查询两门以上不及格课程的同学的学号及其平均成绩

selects.sno,avg(s.score) 平均成绩
fromsc s
wheres.sno in(
selectc.sno fromsc c
wherec.score<60
group byc.sno
having count(c.sno)>1
)
group bys.sno

45、检索“c004”课程分数小于60,按分数降序排列的同学学号

selectsc.sno 学号 fromsc
wheresc.score<60 andsc.cno='c004'
order bysc.score desc

46、删除“s002”同学的“c001”课程的成绩

delete fromsc
wheresc.sno='s002' andsc.cno='c001'


版权声明:本文为weixin_57726902原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。