数据库练习题(2--简单查询题)
2、表的结构如下:
student表(id,name,sex,class_id,address);
score表(id,student_id,course_id,score);
class表(id,name,grade_id);
grade表(id,name);
course表(id,name);
1)查询出“高一年级”下面的所有班级信息
分析:用到的表有grade,class
方法:把grade与class通过年级号联合后,选出高一年级的班级信息即可
语句:
select s1.* from class s1,grade s2 where s1.grade_id = s2.id and s2.name= \’高一年级\’;
2)查询出“高一年级”下面的所有班级里面的学生信息
分析:用到的表有grade,class,student
方法:把这三个表联合后,选出高一年级的学生信息即可
语句:
select s1.* from student s1,class s2,grade s3 where s1.id = s2.student_id and s2.grade_id = s3.id and s3.name = \’高一年级\’;
3)查询出“高一年级”下面的所有班级里面的男学生信息
分析:所用到的表有student,class,grade
方法:把这三个表进行联合,然后找出高一年级及性别为男的学生信息即可,即在上面的语句中再加入一个条件s1.sex = \’男\’
语句:
略
4)查询出小于等于90分的学生姓名、性别、科目名称、分数
分析:所用到的表有student–(姓名,性别),score–分数,course–科目名称
方法:把三个表进行联合后,找出小于等于90分的学生的相关信息即可,score.score<=90
语句:
略
5)查询高二年级下所有数学成绩小于90分的同学的学号和姓名以及分数
分析:所用到的表有student–学号和姓名,score–分数,grade–高二年级,course–数学,class–通过此表与grade表进行联合
方法:把5个表进行联合后,从grade表中找出高二年级(grade.name=\’高二年级\’),从course中找出数学课程(course.name=\’数学\’),从score表中找出分数小于90(score.score<90),然后显示出该同学的学号,姓名及分数即可
语句:略
6)查询成绩表没有成绩的学生学号,姓名
分析:所用的表有student,score
方法:首先找出有成绩的学生的学号,然后跟学生表中的学号进行比对,找出不再学生表中的学号即可
语句:
select id,name from student where id not in(select student_id from score);
7)按年级分组统计每个年级下有多少班级
分析:所用的表有class–统计班级数,grade–获取年级名称
方法:两表联合后,通过对class表中的grade_id进行分组,然后统计出每个年级的班级数就可以了
语句:
select s2.name,count(*) as \’班级个数\’ from class s1,grade s2 where s1.grade_id = s2.id group by s2.id;
8)按年级分组统计每个年级下有多少学生
分析:所用的表有student–统计学生数,class–通过此表按年级分组,grade–找出年级的名称
方法:把三表联合后,按年级分组(group by grade),统计出学生的数目即可(count(*))。
语句:
select s3.name,count(*) from student s1,class s2,grade s3 where s1.class_id = s2.id and s2.grade_id = s3.id group by s3.id;
3、表的结构如下:
图书(图书号,图书名,作者编号,出版社,出版日期);
作者(作者姓名,作者编号,年龄,性别);
要求:用SQL语句查询年龄小于平均年龄的作者姓名、图书名,出版社。
分析:所用的表有图书及作者两个表
方法:把两表联合后,找出作者表中的小于平均年龄avg(年龄)的相关信息
注意:这里的平均年龄因为是个动态的值,不能直接用年龄 <avg(年龄)进行比较,要先通过“select avg(年龄) from 作者”得到平均年龄后,才能进行比较
语句:
select s1.作者姓名,s2.图书名,s2.出版社
from 作者 s1,图书 s2
where s1.作者编号 = s2.作者编号
and 年龄 < (select avg(年龄) from 作者);