1. 对于学生选课关系,其关系模式为:
学生(学号,姓名,年龄,所在系);
课程(课程名,课程号,先行课);
选课(学号,课程号,成绩)。
课堂练习:
1、查询学生95001的姓名和所在系。
2、查询至少选修了两门课程的学生学号。
3、查询选修了1号课程的学生姓名。
4、查询没有选修数据库课程的学生姓名。
5、查询至少选修了1号课程和3号课程的学生学号。用关系代数完成如下查询。
1)求学过数据库课程的学生的姓名和学号。
2)求学过数据库和数据结构的学生姓名和学号。
3)求没学过数据库课程的学生学号。
4)求学过数据库的先行课的学生学号。
5)求数据库最高、最低成绩学生的姓名。
6)有相同成绩学生的学号。
2. 设有一个SPJ数据库,包括Suppliers,Parts,Projects,SPJ四个关系模式: Suppliers(SNO,SNAME,STATUS,SCITY);
Parts(PNO,PNAME,COLOR,WEIGHT);
Projects(JNO,JNANE,JCITY);
SPJ(SNO,PNO,JNO,QTY)。
其中:供应商表Suppliers由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(SCITY)组成;零件表Parts由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成;工程项目表Projects由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成;供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量组成(QTY)组成,表示某供应商供应某种零件给某工程项目的数量为QTY。
试用关系代数完成如下查询:
1)求供应工程J1 零件的供应商号码SNO。
2)求供应工程J1 零件P1的供应商号码SNO。
3)求供应工程J1 零件为红色的供应商号码SNO。
4)求没有使用天津供应商生产的红色零件的工程号。
5)求至少用了供应商S1所供应的全部零件的工程号。
课堂练习:
(1)求上海的所有供应商的信息。
(2)求位于郑州的所有工程的信息
(3)求数量在100-150之间的供应
(4)求工程J1提供零件的供应商号。
(5)求供应工程J1红色零件的供应商号
(6)求不供应零件P2的供应商名称
(7)求没有使用天津供应商生产的红色零件的工程号
(8)求使用了本地供应商提供的零件的工程号和工程名称
(9)求未使用本地供应商提供的零件的工程号和工程名称
(10)求至少用了供应商号为02所供应的全部零件的工程号
1、已知关系R(A,B,C,D)的函数依赖为A→B,B→C和D→B,回答如下问题:
(1)求出R的码; A D
(2)R是BCNF范式吗?为什么?如果不是,把它分解成BCNF范式。
R1(A,B)R2(B,C) R3(D,B) R4(A,D)
2、已知关系R(A,B,C,D)的函数依赖为A→B,B→C,A→D和D→C,回答如下问题:
(1) 求出R的码.A
(2) R是第三范式吗?为什么?如果不是,把它分解成第三范式
R1(A,B,D) R2( B,C) R3(D,C)
3.设有关系框架R(A,B,C,D,E,P)及其上的函数相关性集合F={A→B,C→P,E→A,CE→D}:
(1)求出R的所有候选关键字。(2)将R无损连接分解到BCNF。
课堂练习:
现有如下关系模式:
R(A#,B#,C,D,E)
其中:A#B#组合为码
R上存在的函数依赖有A#B#→E,B#→C,C→D
(1)该关系模式满足2NF吗?为什么?
(2)如果将关系模式R分解为:
指出关系模式R2的码,并说明该关系模式最高满足第几范式?(在1NF~BCNF之内)。
(3)将关系模式R分解到BCNF。
课后作业:
1.设教学数据库中有3个关系:
学生关系S(SNO,SNAME,AGE,SEX)
学习关系SC(SNO,CNO,GRADE)
课程关系C(CNO,CNAME,TEACHER)
下面用关系代数表达式表达每个查询语句。
(1) 检索学习课程号为C2的学生学号与成绩。
(2) 检索学习课程号为C2的学生学号与姓名
(3) 检索选修课程名为MATHS的学生学号与姓名。
(4) 检索选修课程号为C2或C4的学生学号。
(5) 检索至少选修课程号为C2和C4的学生学号。
(6) 检索不学C2课的学生姓名与年龄。
(7) 检索学习全部课程的学生姓名。
(6)检索至少选修两门课程的学生学号。
πS#(σ1=4∧2≠5(SC×SC))
用关系代数表示数据查询的典型例子
[例]设教学数据库中有3个关系:
学生关系S(SNO,SNAME,AGE,SEX)
学习关系SC(SNO,CNO,GRADE)
课程关系C(CNO,CNAME,TEACHER)
下面用关系代数表达式表达每个查询语句。
(1) 检索学习课程号为C2的学生学号与成绩。
πSNO,GRADE(σ CNO='C2'(SC))
(2) 检索学习课程号为C2的学生学号与姓名
(σ CNO='C2'(S SC))
π
由于这个查询涉及到两个关系S和SC,因此先对这两个关系进行自然连接,同一位学生的有关的信息,然后再执行选择投影操作。
此查询亦可等价地写成:
πSNO,SNAME(S)(πSNO(σ CNO='C2'(SC)))
这个表达式中自然连接的右分量为"学了C2课的学生学号的集合"。这个表达式比前一
个表达式优化,执行起来要省时间,省空间。
(3)检索选修课程名为MATHS的学生学号与姓名。
(σ CNAME='MATHS'(S SC C))
π
(4)检索选修课程号为C2或C4的学生学号。
πSNO(σ CNO='C2'∨CNO='C4'(SC))
(5)检索至少选修课程号为C2或C4的学生学号。
π1(σ1=4∧2='C2'∧5='C4'(SC×SC))
这里(SC×SC)表示关系SC自身相乘的乘积操作,其中数字1,2,4,5都为它的结
果关系中的属性序号。
比较这一题与上一题的差别。
(6)检索不学C2课的学生姓名与年龄。
πSNAME,AGE(S)-πSNAME,AGE(σ CNO='C2'(S SC))
这个表达式用了差运算,差运算的左分量为"全体学生的姓名和年龄",右分量为"学了
C2课的学生姓名与年龄"。
(7)检索学习全部课程的学生姓名。
编写这个查询语句的关系代数过程如下:
(a) 学生选课情况可用πSNO,CNO(SC)表示;
(b) 全部课程可用πCNO(C)表示;
(c) 学了全部课程的学生学号可用除法操作表示。
操作结果为学号SNO的集合,该集合中每个学生(对应SNO)与C中任一门课程号CNO配在一起都在πSCO,CNO(SC)中出现(即SC中出现),所以结果中每个学生都学了全部的课程(这是"除法"操作的含义):
πSNO,CNO(SC)÷πCNO(C)
(d) 从SNO求学生姓名SNAME,可以用自然连结和投影操作组合而成:
(S (πSNO,CNO(SC)÷πCNO(C)))
π
这就是最后得到的关系代数表达式。
(8)检索所学课程包含S3所学课程的学生学号。
注意:学生S3可能学多门课程,所以要用到除法操作来表达此查询语句。
学生选课情况可用操作πSNO,CNO(SC)表示;
所学课程包含学生S3所学课程的学生学号,可以用除法操作求得:
πSNO,CNO(SC)÷ πCNO(σ SNO='S3'(SC))
(9)将新课程元组('C10','PHYSICS','YU')插入到关系C中
(C∪('C10','PHYSICS','YU'))
(10)将学号S4选修课程号为C4的成绩改为85分。
(SC-('S4','C4',?)∪('S4','C4',85))
修改操作用代数表示分两步实现:先删去原元组,再插入新元组。题目中未给出原先的成绩,所以用"?"代替,检索时可忽略。
要求:
(4)是否达到BCNF及原因。
3.考虑如下所定义的学生-教师-课程信息数据库(其中加下划线的是主码),试完成下列各小题:
Student(Sno,Sname,Sage,Ssex,Class)(学生信息表)
Teacher(Tno,Tname,Tsex,Tage,Tprof,Tdept)(教师信息表)
Course(Cno,Cname,Tno)(课程信息表)
SC(Sno,Cno,Grade)(选课表)
试用关系代数表示下列查询语句:
(1)查询年龄不大于22岁的女学生的姓名和学号;
(2)查询选修了“李军”老师所授的课程名为“数据库”的学生学号和姓名;
(3)查询至少选修了教师编号(Tno)为826的老师所授全部课程的学生学号。
(4)是否达到BCNF及原因。