数据库设计实战:E-R模型到关系模式转换与SQL查询

需积分: 20 0 下载量 150 浏览量 更新于2024-08-15 收藏 734KB PPT 举报
"数据库设计的相关习题解析" 本资料是关于数据库设计的习题课,旨在帮助学习者巩固《数据库原理与应用》课程中的知识。题目涵盖了E-R模型设计以及SQL查询的实践应用。通过解决这些习题,学习者可以深化对数据库概念的理解,提升实际操作技能。 首先,题目要求设计一个E-R模型,描述了一个工厂的生产环境,其中产品和零件之间存在多对多的关系。每个产品有产品号和产品名,每个零件有零件号和零件名。设计时,我们需要考虑如何体现产品与零件之间的关联,并确定关系模式的主键。在E-R模型中,可以创建一个"产品零件"实体来连接产品和零件,它的属性可能包括产品号和零件号。转换成关系模式后,主键可能是产品号和零件号的组合,表示为`ProductPart(Product#, Part#)`。 接下来是几个SQL查询的示例: 1. 查询"程军"老师所授课程的课程号(C#)和课程名(CName)。这可以通过简单的SELECT语句实现,如:`SELECT C#, CName FROM C WHERE Teacher = '程军'`。 2. 查询年龄大于21岁的男学生学号(S#)和姓名(SName)。对应的SQL语句为:`SELECT S#, SName FROM S WHERE Age > 21 AND Sex = '男'`。 3. 查询"李四"同学不学的课程号(C#)。这个查询需要用到NOT EXISTS子句,SQL实现如下:`SELECT C# FROM C WHERE NOT EXISTS (SELECT * FROM S, SC WHERE S.Sname = '李四' AND S.S# = SC.S# AND SC.S# = C.C#)`。 4. 查询所有学生都选修的课程的课程号(C#)和课程名(CName)。这个查询比较复杂,可能需要使用除法操作,或者先找出所有学生的学号,然后找出被所有学生选修的课程:`SELECT C#, CName FROM C WHERE C# IN (SELECT C# FROM C GROUP BY C# HAVING COUNT(DISTINCT SC.S#) = (SELECT COUNT(DISTINCT S.S#) FROM S))`。 5. 查询选修了包含"程军"老师所授课程之一的学生学号(S#)。这个查询可以通过JOIN操作实现:`SELECT DISTINCT S.S# FROM S JOIN SC ON S.S# = SC.S# JOIN C ON SC.C# = C.C# WHERE C.Teacher = '程军'`。 6. 查询个人平均成绩大于60分的学生信息。这个查询涉及到计算平均成绩,可能需要自定义函数或子查询:`SELECT S#, SName FROM S JOIN (SELECT S#, AVG(Grade) AS AvgGrade FROM SC GROUP BY S#) AS AvgGrades ON S.S# = AvgGrades.S# WHERE AvgGrades.AvgGrade > 60`。 7. 将选修了操作系统课程的考试成绩加5。这是一个更新操作,可以使用UPDATE语句完成:`UPDATE SC SET Grade = Grade + 5 WHERE C# IN (SELECT C# FROM C WHERE CName = '操作系统')`。 这些SQL查询展示了如何从基本的表选择、条件过滤到更复杂的联接、子查询和聚合函数的应用,对于理解和掌握数据库查询语言至关重要。通过解答这些习题,学习者可以提升自己的数据库查询能力,为实际工作中的数据库管理和分析打下坚实基础。