数据库|第2章|关系数据库
1.一些基本概念
- 域
- 笛卡尔积
- 关系:关系的名字、关系的目或度、元组、单元(一元)关系/二元关系、主属性、非主属性(非码属性)
候选码:某一属性的值能唯一的标识一个元组,而其子集不能
主码:若一个关系中有多个候选码,则选定其中一个为主码
全码:关系模式的所有属性是这个关系的候选码
2.关系可以有三种类型 - 基本关系(基本表或基表),实际存在的表,实际存储数据的逻辑表示
- 查询表,查询结果对应的表
- 视图表
3.基本关系的6条性质
- 每一列中的分量是同一种类型的数据
- 不同的列可出自一个域,不同的属性要给予不同的属性名
- 列的次序可以随意交换
- 任意两个元组的候选码不能取相同的值
- 分量必须取原子值
4.关系代数
(1)关系代数是一种抽象的查询语言。它用对关系的运算来表达查询
(2)分类:传统的集合运算和专门的关系运算
-
传统的集合运算:并、差、交、笛卡尔积
-
专门的关系运算:选择、投影、连接、除运算
连接:从两个关系的笛卡儿积中选取属性间满足一定条件的元组
等值连接:连接条件为“=”的连接运算
自然连接:一种特殊的等值连接,它要求两个关系中进行比较的分量必须是同名的属性组,并在结果中把重复的属性列去掉
悬浮元组:自然连接时,两个关系中有被抛弃的元组,这些被舍弃的元组被叫做悬浮元组
外连接:如果把悬浮元组也保存在结果关系中,而在其他属性上填空值,那么这种连接叫做外连接
左外连接:只保留左边关系R中的悬浮元组
右外连接:只保留右边关系S中的悬浮元组
除运算:设关系R除以关系S的结果为关系T,则T包含所有在R但不在 -
举例说明
设教学数据库中有3个关系:
学生关系S(SNO,SNAME,AGE,SEX)
学习关系SC(SNO,CNO,GRADE)
课程关系C(CNO,CNAME,TEACHER)
a.检索学习课程号为C2的学生学号与成绩
SELECT SNO,GRADE
FROM SC
WHERE CNO='C2'
π SNO,GRADE(σCNO='C2'(SC))
b. 检索学习课程号为C2的学生学号与姓名
SELECT SC.SNO,S.SNAME
FROM SC,S
WHERE SC.SNO=S.SNO
AND SC.CNO='C2'
π SNO,SNAME(σCNO='C2'(ScrossSC))
此查询涉及S和SC,先进行自然连接,然后再执行选择投影操作。
π SNO,SNAME(S)cross(πSNO(σCNO='C2'(SC)))
自然连接的右分量为"学了C2课的学生学号的集合"。
此表达式比前一个表达式优化,执行起来要省时间、省空间。
c.检索选修课程名为MATHS的学生学号与姓名
SELECT SC.SNO,S.SNAME
FROM SC,S,C
WHERE SC.SNO=S.SNO
AND SC.CNO=C.CNO
AND C.CNAME='MATHS'
π SNO,SANME(σCNAME='MATHS'(ScrossSCcrossC))
d.检索选修课程号为C2或C4的学生学号
SELECT SNO
FROM SC
WHERE CNO='C2'
OR CNO='C4'
π SNO(σ CNO='C2'∨CNO='C4'(SC))
e.检索至少选修课程号为C2或C4的学生学号
SELECT SA.SNO
FROM SC AS SA,SC AS SB
WHERE SA.SNO=SB.SNO
AND SA.CNO='C2'
AND SB.CNO='C4'
π 1(σ1=4∧2='C2'∧5='C4'(SC×SC))
f.检索不学C2课的学生姓名与年龄
SELECT SNAME,AGE
FROM S
MINUS
SELECT S.SNAME,S.AGE
FROM SC,S
WHERE SC.SNO=S.SNO
AND SC.CNO='C2'
(Oracle)
π SNAME,AGE(S)-πSNAME,AGE(σCNO='C2'(ScrossSC))
g.检索学习全部课程的学生姓名
这个定义用SQL表示比较麻烦,略过
π SNO,CNO(SC)÷πCNO(C)
先用除法取出选取所有课程的SNO集(除法可以理解为一个Filter)
π SNAME(S cross (πSNO,CNO(SC)÷πCNO(C)))
再关联S表取出SNAME
h.检索所学课程包含S3所学课程的学生学号
这个定义用SQL表示比较麻烦,略过
π SNO,CNO(SC)÷ πCNO(σSNO='S3'(SC))
同样运用了除法的特性
i.将新课程元组('C10','PHYSICS','YU')插入到关系C中
INSERT INTO C VALUES('C10','PHYSICS','YU')
(C∪('C10','PHYSICS','YU'))
记住该符号的用法
j.将学号S4选修课程号为C4的成绩改为85分
UPDATE SC SET GRADE=85
WHERE SNO='S4'
AND CNO='C4'
(SC-('S4','C4',?)∪('S4','C4',85))
先用'-'实现DELETE功能,再用'∪'实现INSERT功能
注意使用?来表示检索时忽略该字段值
5.象集
象集的本质是一次选择运算和一次投影运算。
例如关系模式R(X, Y),X和Y表示互为补集的两个属性集,对于遵循模式R的某个关系A,
当t[X]=x时,x在A中的象集(Images Set)为:
Zx={ t[Z] | t ∈ A,t[X]=x }
它表示:A中X分量等于x的元组集合在属性集Z上的投影
6.关系的完整性
- 实体完整性
主属性不能取空值 - 参照完整性
外码:参照关系和被参照关系
参照完整性规则:外码取空值或其对应关系的某个主码值
外码可以取主属性或者不为空值的属性
难题
- sc表中选择出同时选修1号课程和2号课程的学生
错误:SELECT SNO FROM SC WHERE CNO='1' AND CNO='2'
正确:SELECT SNO FROM SC WHERE CNO='1'
INTERSECT //求交集
SELECT SNO FROM SC WHERE CNO='2'
2.设有一个SPJ数据库,包括S,P,J,SPJ四个关系模式:
S(SNO,SNAME,STATUS,CITY);
P(PNO,PNAME,COLOR,WEIGHT);
J(JNO,JNANE,CITY);
SPJ(SNO,PNO,JNO,QTY)。
其中:供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成;零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成;工程项目表J 由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成;供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量组成(QTY)组成,表示某供应商供应某种零件给某工程项目的数量为QTY。
试分别用关系代数和sql语句写出如下查询:
1)求供应工程J1 零件的供应商号码SNO。
2)求供应工程J1 零件P1的供应商号码SNO。
3)求供应工程J1 零件为红色的供应商号码SNO。
4)求没有使用天津供应商生产的红色零件的工程号。
5)求至少用了供应商S1所供应的全部零件的工程号。
答案:1)求供应工程J1零件的供应商号码SNO:
πSNO(σJNO=‘J1’(SPJ))
2)求供应工程J1零件P1的供应商号码SNO:
πSNO(σJNO=‘J1’∧PNO=‘P1‘(SPJ))
3)求供应工程J1零件为红色的供应商号码SNO:
πSNO(σCOLOR=’红‘ (P)∞σJNO=‘J1‘(SPJ))
πSNO(πSNO,PNO(σJNO=‘J1‘(SPJ))∞πPNO(σCOLOR=’红‘ (P)))
4)求没有使用天津供应商生产的红色零件的工程号JNO:
πJNO(J)- πJNO(σCITY=‘天津’∧COLOR=‘红‘ (S∞SPJ∞P))
πJNO(J)- πJNO(πSNO(σCITY=‘天津’(S))∞πSNO,PNO,JNO(SPJ)∞πPNO(σCOLOR='红'(p))
5)求至少用了供应商S1所供应的全部零件的工程号JNO:
πSNO,JNO,PNO(SPJ)÷ πSNO,PNO(σSNO=‘S1‘ (SPJ))

浙公网安备 33010602011771号