SQL查询与二战舰船数据库分析

需积分: 0 0 下载量 152 浏览量 更新于2024-08-05 收藏 543KB PDF 举报
本资源包含了两个数据库实例,一个是学生管理数据库,包含学生信息表S、课程表C和选课表SC;另一个是二战中的大型舰船数据库,包括Classes、Ships、Battles和Outcomes四个关系。在学生管理数据库中,SQL查询涉及到学生选课、教师信息以及成绩统计。在舰船数据库中,描述了舰船类、舰船、战役和参战结果等信息。 首先,我们详细分析学生管理数据库中的SQL查询问题: 1) 检索学号为003号同学所学课程的课程名和教师名: 这个查询需要通过选课表SC找到学号为003的同学选的课程,然后通过课程表C获取课程名和教师名。SQL语句可以写为: ```sql SELECT C.CNAME, C.TEACHER FROM SC INNER JOIN C ON SC.C# = C.C# WHERE SC.S# = '003'; ``` 2) 检索选择程军老师所授课程的男同学姓名: 这里需要找到选了程军老师课程且性别为男的学生,需要联接三个表。SQL语句如下: ```sql SELECT S.SNAME FROM S INNER JOIN SC ON S.S# = SC.S# INNER JOIN C ON SC.C# = C.C# WHERE C.TEACHER = '程军' AND S.SEX = '男'; ``` 3) 检索刘丽同学不学的课程的课程名: 这个问题需要找出所有课程中,刘丽没有选的课程。SQL语句可以这样写: ```sql SELECT C.CNAME FROM C WHERE C.C# NOT IN ( SELECT SC.C# FROM SC WHERE SC.S# = '刘丽' ); ``` 4) 检索平均成绩在60分以下的学生的学号和姓名: 这个查询需要计算每个学生的平均成绩,然后筛选出平均成绩低于60分的学生。SQL语句如下: ```sql SELECT S.S#, S.SNAME FROM S WHERE S.S# IN ( SELECT SC.S# FROM SC GROUP BY SC.S# HAVING AVG(SC.GRADE) < 60 ); ``` 5) 检索至少选修3门课程的学生的学号,按照从小到大排列: 此查询需要找出选修课程数大于等于3的学生,并按学号排序。SQL语句如下: ```sql SELECT S.S# FROM S INNER JOIN SC ON S.S# = SC.S# GROUP BY S.S# HAVING COUNT(SC.C#) >= 3 ORDER BY S.S#; ``` 接下来,我们转向二战中的大型舰船数据库: - Classes表记录舰船类别,包含主键class,以及type(型号)、country(生产国)、numGuns(火炮数量)、bore(火炮口径)和displacement(排水量)等字段。 - Ships表存储舰船信息,包含主键name,外键class(舰船类别)和launched(开始服役日期)。 - Battles表记载战役信息,包括name(战役名称)和date(战役日期)。 - Outcomes表记录参战结果,包括ship(舰船名称)、battle(战役名称)和result(战斗结果)。 例如,如果我们想找出所有德国制造的主力舰(type=bb),可以使用以下SQL语句: ```sql SELECT S.name FROM Ships S INNER JOIN Classes C ON S.class = C.class WHERE C.country = 'Germany' AND C.type = 'bb'; ``` 以上是对两个数据库实例的详细解析,涵盖了SQL查询技巧和数据库设计的基本概念。