数据库练习题(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;