数据库练习题(1)

1、表的数据结构如下:

student表(sno,sname,sage)--学号,姓名,学生年龄

course表(cno,cname,tno)--课程代码,课程名称,老师工号

sc表(sno,cno,score)--学号,课程代码,分数

teacher表(tno,tname)--老师工号,老师姓名

1)查询'001'课程比'002'课程成绩高的的所有学生学号

分析:相关的表sc,

方法1:分别找出001课程与002课程所有信息,然后从两个表中找出001大于002的学生学号,这种方法会用到两个子查询,会比较慢

方法2:用联合查询,把第1个SC跟第2个SC通过学号联合再一起,然后找出联合表1中001的课程,表2中002的课程,且表1中001课程要大于表2中002课程

语句:

select s1.sno from sc s1,sc s2

where s1.sno = s2.sno and s1.cno = '001' and s2.cno = '002' and s1.score > s2.score;

2)查询平均成绩大于60分的学生学号和平均成绩

分析:相关的表sc,平均成绩:avg(score)

方法1:用1个子查询,通过学生学号找出所有学生的平均成绩,然后从这个 表格中找出大于60分的学生学号及平均成绩即可

方法2:显然第1个方法,比较冗余,因此在进行分组查询时,进行条件限制一下就可以了,group by sno having avg(score)>60

语句:

select sno,avg(score) from sc group by sno having avg(score)>60;

注意:

查询学生的平均成绩时,必须先对表进行分组查询。

3)查询所有学生的学号,姓名,选课数,总成绩。

分析:相关的表有学生表student,成绩表sc

方法:把student表跟sc表通过学号联合,然后通过学号进行分组,统计出每个学号的课程的总数(count),及总成绩(sum);

语句:

select s1.sno,s1.sname,count(s2.cno),sum(s2.score)

from student s1,sc s2

where s1.sno = s2.sno group by s1.sno;

4)查询姓李老师的个数

分析:相关的表teacher

方法:统计个数用count函数,查询李姓老师,用like'李%'

语句:

select count(tname) from teacher where tname like'李%';

注意:like前面要加上where

5)查询所有课程成绩小于60分的学生姓名和学号

分析:相关的表student,score

方法:把这两个表student与score通过学号进行联合,通过学号进行分组(group by),并且选出所有课程成绩小于60的学生;

又因是所有的课程成绩都要小于60,那么找出每个学生中所有课程中最大的课程,当比最大课程还小时,那么这个学生的所有课程肯定所有课程肯定都小于60(max(score)<60)

语句:

select s1.sno,s1.sname

from student s1,score s2

where s1.sno = s2.sno group by sno having max(score) < 60;

 

posted @ 2016-12-08 14:41  momo_2016  阅读(1703)  评论(0编辑  收藏  举报