数据库|第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.关系的完整性

  • 实体完整性
    主属性不能取空值
  • 参照完整性
    外码:参照关系和被参照关系
    参照完整性规则:外码取空值或其对应关系的某个主码值
    外码可以取主属性或者不为空值的属性

难题

  1. 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))
posted @ 2020-09-23 09:47  zzzmmm37  阅读(1220)  评论(0)    收藏  举报