学校学生选修课程,经简化得到的数据项列出如下:
学生号s CHAR(6),学生姓名xm CHAR(8),课程号c CHAR(3),课程名称cname CHAR (20),成绩 grade NUMBER。
并确定以学生(student)信息,课程(course)信息实体,它们通过“选课”(sc)联系起来。
数据库概念设计的只包含主键属性的简化E-R图如下:
要求;
(1)设计数据库的逻辑结构设计:给出相应的表名、表的属性名(数据类型可省)、主键。
(2)给出选修了课程号为'C02'的学生姓名的SQL查询语句。
(3)给出三种等价的关系代数表达式来完成上述查询。并从查询优化的角度说明哪一种关系代数表达式查询效率最高?并说明在此查询优化的基础上,对哪些字段建立索引可提高查询效率?
答案说明:本题目答案来自网络整理或转载,最终答案请以官网为准。
答 案:数据库的逻辑结构设计:student(s#xm)主键:s#course(c#cname)主键:c#sc(s#c#grade)主键;s#c#(2)SELECT student.xm FROM student sc WHERE student. s#=sc. s# AND sc. c#='CO2';(3)系统可以用三种等价的关系代数表达式来完成上述查询。第一种;πxm(σstudent. s#=sc. s# ∧sc. c#='C02'(student×sC))执行的步骤是:首先计算student和sc的广义笛卡尔积把student和sc的每个元组联接起来然后依次读人联接后的元组按照选择条件选取满足要求的记录最后在xm上做投影输出得到最终结果。第二种:πxm(σsc. c#='C02'(studentsC))执行的步骤是:首先计算student和sc的自然联接自然联接的结果比第一种情况少得多然后执行选择运算最后投影输出结果。第三种:πxm(σstudentσsc. c#='C02'(sC))执行的步骤是:首先对sc表做选择运算过滤掉不满足条件的记录然后再与student做联接读取和处理记录的次数要比第二种少最后投影输出结果。因此第三种关系代数表达式执行效率最高。若在sc表的c#字段上做索引则在第一步对sc表做选择时就不必读取所有的sc元组而只需读取c#='C02'的那些元组。若在student表的s#上也做索引则在第二步做联接时也不必读取所有的student的元组因此总的读取和处理时间将大大减少进而提高总的查询效率。
数据库的逻辑结构设计:student(s#,xm)主键:s#course(c#,cname)主键:c#sc(s#,c#,grade)主键;s#,c#(2)SELECT student.xm FROM student, sc WHERE student. s#=sc. s# AND sc. c#='CO2';(3)系统可以用三种等价的关系代数表达式来完成上述查询。第一种;πxm(σstudent. s#=sc. s# ∧sc. c#='C02'(student×sC))执行的步骤是:首先计算student和sc的广义笛卡尔积,把student和sc的每个元组联接起来,然后依次读人联接后的元组,按照选择条件选取满足要求的记录,最后在xm上做投影输出,得到最终结果。第二种:πxm(σsc. c#='C02'(studentsC))执行的步骤是:首先计算student和sc的自然联接,自然联接的结果比第一种情况少得多,然后执行选择运算,最后投影输出结果。第三种:πxm(σstudentσsc. c#='C02'(sC))执行的步骤是:首先对sc表做选择运算,过滤掉不满足条件的记录,然后再与student做联接,读取和处理记录的次数要比第二种少,最后投影输出结果。因此,第三种关系代数表达式执行效率最高。若在sc表的c#字段上做索引,则在第一步对sc表做选择时,就不必读取所有的sc元组而只需读取c#='C02'的那些元组。若在student表的s#上也做索引,则在第二步做联接时,也不必读取所有的student的元组,因此总的读取和处理时间将大大减少,进而提高总的查询效率。