第二章
关系数据库
一、SQL
关系代数+关系演算
二、关系
1.域:变量有效范围
2.笛卡尔乘积:域0X域1X域2X...X域N-1
3.关系:D1XD2XD3..Dn的子集,R(D1,D2,...,Dn)
4.键:由一个或几个属性组成
a 超键:唯一标示元组的属性集
b 候选键:无多余属性的超键
c 主键:用户选作元组表示的一个候选键
d 外键:非本关系的主键
5.关系性质
a 不同的列可以出自一个同一个域,每一个列为一个属性
b 列的顺序可以任意交换
c 任意两个元组不能完全相同
d 行顺序可以任意交换
e 分量原子性:事务的执行要么成功执行,要么全身而退,什么都不执行。
三、关系模式
模式名、属性名、值域名、模式主键
四、关系代数运算符
并U、广义笛卡尔积X、连接∞、大于等于≥等于=;
差-、选择σ、除÷、小于<不等于≠;
交∩、投影Π、大于﹥、小于等于≤;
非┐、与Λ、或V
五、广义笛卡尔乘积
R:k1元组,S:k2元组;RXS有k1Xk2元组。
六、
选择:σ_F(R)={t|t属于R且F(t)=true}
投影:Π_{i1,i2,...,im}={t|t=<t_{i1,i2,...,im}>且<t_{i1},t_{i2},...,t_N>属于R}
连接:R∞S={t|<t^r,t^s>且t^r属于R,t^s属于S,且t^r[A]与t^s[B]满足规定关系}
自然连接,在连接中把重复属性去掉
除法:(R÷S):R中所有有S属性的元组的剩余属性集。
假设有两个关系,R(a,b,c)和T(b,c),R中有所有T中(b,c)元组对应的a。
使用投影、笛卡尔积和集合的差,表示R÷T
R÷T = πa(R) - πa[ πa(R) × T – R ]
SQL:
select a from R
minus(
select a from(
select * from (select a from R), T
minus
select * from R
)
)
七、举例
数据库三个关系:
学生(学号、姓名、性别、年龄、专业)
课程(课程号、课程名、学分、先行课程号)
成绩(学号、课程号、成绩)
1、所有年龄小于20的学生
σ_{性别='男生'且年龄<20}(学生)
2、查询所有女学生的姓名和年龄
Π_{姓名,年龄}(σ_{性别=女}(学生))
3、选修课为C2或C4的学生学号
Π_{学号}(σ_{课程号=C2或课程号=C4}(成绩))
4、不作为其他课程先行课程的课程号
Π_{课程号}(课程)-Π_{先行课程号}(课程)
5、查询计算机专业和机械专业学生的情况
(σ_{专业=计算机}(学生))U(σ_{专业=机械}(学生))
6、包括学生学号、课程名称、学分和成绩的学生成绩单
Π_{学号、课程名、学分、成绩}(课程∞成绩)
7、查询选修课程为C2的学生学号与姓名
Π_{学号、姓名}(σ_{课程号=C2}(学生∞成绩))
8、查询不选课为C2的学生姓名与年龄
Π_{姓名、年龄}(学生)-Π_{姓名、年龄}(σ_{课程号=C2}(学生∞成绩))
一、SQL
关系代数+关系演算
二、关系
1.域:变量有效范围
2.笛卡尔乘积:域0X域1X域2X...X域N-1
3.关系:D1XD2XD3..Dn的子集,R(D1,D2,...,Dn)
4.键:由一个或几个属性组成
a 超键:唯一标示元组的属性集
b 候选键:无多余属性的超键
c 主键:用户选作元组表示的一个候选键
d 外键:非本关系的主键
5.关系性质
a 不同的列可以出自一个同一个域,每一个列为一个属性
b 列的顺序可以任意交换
c 任意两个元组不能完全相同
d 行顺序可以任意交换
e 分量原子性:事务的执行要么成功执行,要么全身而退,什么都不执行。
三、关系模式
模式名、属性名、值域名、模式主键
四、关系代数运算符
并U、广义笛卡尔积X、连接∞、大于等于≥等于=;
差-、选择σ、除÷、小于<不等于≠;
交∩、投影Π、大于﹥、小于等于≤;
非┐、与Λ、或V
五、广义笛卡尔乘积
R:k1元组,S:k2元组;RXS有k1Xk2元组。
六、
选择:σ_F(R)={t|t属于R且F(t)=true}
投影:Π_{i1,i2,...,im}={t|t=<t_{i1,i2,...,im}>且<t_{i1},t_{i2},...,t_N>属于R}
连接:R∞S={t|<t^r,t^s>且t^r属于R,t^s属于S,且t^r[A]与t^s[B]满足规定关系}
自然连接,在连接中把重复属性去掉
除法:(R÷S):R中所有有S属性的元组的剩余属性集。
假设有两个关系,R(a,b,c)和T(b,c),R中有所有T中(b,c)元组对应的a。
使用投影、笛卡尔积和集合的差,表示R÷T
R÷T = πa(R) - πa[ πa(R) × T – R ]
SQL:
select a from R
minus(
select a from(
select * from (select a from R), T
minus
select * from R
)
)
七、举例
数据库三个关系:
学生(学号、姓名、性别、年龄、专业)
课程(课程号、课程名、学分、先行课程号)
成绩(学号、课程号、成绩)
1、所有年龄小于20的学生
σ_{性别='男生'且年龄<20}(学生)
2、查询所有女学生的姓名和年龄
Π_{姓名,年龄}(σ_{性别=女}(学生))
3、选修课为C2或C4的学生学号
Π_{学号}(σ_{课程号=C2或课程号=C4}(成绩))
4、不作为其他课程先行课程的课程号
Π_{课程号}(课程)-Π_{先行课程号}(课程)
5、查询计算机专业和机械专业学生的情况
(σ_{专业=计算机}(学生))U(σ_{专业=机械}(学生))
6、包括学生学号、课程名称、学分和成绩的学生成绩单
Π_{学号、课程名、学分、成绩}(课程∞成绩)
7、查询选修课程为C2的学生学号与姓名
Π_{学号、姓名}(σ_{课程号=C2}(学生∞成绩))
8、查询不选课为C2的学生姓名与年龄
Π_{姓名、年龄}(学生)-Π_{姓名、年龄}(σ_{课程号=C2}(学生∞成绩))
9、查询课程名为数据库的学生及学号
Π_{学号}(Π_{课程号}(σ_{课程=数据库}(课程))∞成绩)∞Π_{学号,姓名}(学生)
10、查询选修全部课程的学生名单
Π_{姓名}(Π_{学号、课程号}(成绩)÷Π_{课程号}(课程))∞Π_{学号,姓名}(学生)
11、查询先行课程包括了操作系统课程先行课程的课程号
Π_{课程号、先行课程号}÷Π_{先行课程号}(σ_{课程名=操作系统}(课程))
12、查询所有学科均包含学生S3所学课程的学生学号及姓名
Π_{学号、姓名}(学生)∞Π_{学号、课程}(成绩)÷Π_{课程号}(σ_{学号=S3}(成绩))