数据库系统:关系代数

注:本文为 “数据库系统:关系代数” 相关文章合辑

如有内容异常,请查阅原文。

未整理去重。


关系代数运算 So Easy

HYunEr 于 2013-10-21 15:35:30 发布

关系代数是以关系为运算的一组高级运算的集合。由于定义为属性个数 相同的元组的集合,因此集合代数的操作就可以引入到关系代数中。关系代数也可以看做是一种抽象的查询语言,是对关系的运算来表达查询的。任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果。所以运算对象、运算符、运算结果是运算的三大要素。

关系代数的运算对象是关系,运算结果亦为关系。关系代数用到的运算符包括四类:集合运算符、专门的关系运算符、算术比较符和逻辑运算符。如下表:

img

关系代数可分为两类:传统的集合操作:并、差、交、笛卡尔积(乘)、笛卡尔积的逆运算(除法)和扩充的关系操作:对关系进行垂直分割(投影)、水平分割(选择)、关系的结合(连接、自然连接)。

img

一、五个基本操作:

1. 并 (Union):关系 R 和 S 具有相同的关系模式,R 和 S 的并是由属性 R 和 S 的元组构成的集合。 形式定义如下:

R∪S={t|t∈R∨ t∈S} , t 是元组变量,R 和 S 的元素相同

其结果由 R 和 S 的元素组成

2. 差 (Difference):关系 R 和 S 具有相同的关系模式,R 和 S 的差由属于 R 但不属于 S 的元组构成的集合。 形式定义如下:

R-S={t|t∈R ∧ t¢S) *t 是元组变量,R 和 S 的元素相同 *

其结果由属于 R 不属于 S 的所有元组构成

3. 笛卡尔积(Cartesian Product): 广义笛卡尔积是一个 (r+s) 列的元组的集合。形式定义如下:

img

4. 投影(Projection):对一个关系进行垂直分割,消去某些列,并重新安排列的顺序。记作:

ΠA ® = { t [A] | t∈R }

其中 A 为 R 中的属性列。

5. 选择(Selection):根据某些条件对关系做水平分割,即选取符合条件的元组。

σF ® = {t|t∈R ∧ F (t)=true}

σ 为选择元算符,F 表示选择条件,它是一个逻辑表达式,取逻辑值‘真’或‘假’。

举例说明:下面为关系 R 和关系 S 两张表:

img

(1) 并运算 (2)差运算 (3)笛卡尔积运算

img

img

img

(5)投影

img

(6)选择

img

二、四个组合操作

1. 交(Intersection):由属于 R 和 S 的元组构成的集合。记作:

R∩S={t|t∈R∧t∈S}

由于 R∩S=R (R-S),或 R∩S=S-S (S-R) 得到的,因此交操作不是一个独立的操作。

2. 连接(Join): 连接也称为 θ 连接,它是从两个关系的笛卡尔积中选取属性中满足一定条件的元组。记作:

img

其中 A 和 B 分别为 R 和 S 上度数相等且可比的属性组。θ 是比较运算符。连接运算从 R 和 S 的广义笛卡尔积 R×S 中选取 (R 关系) 在 A 属性组上的值与 (S 关系) 在 B 属性组上值满足比较关系 θ 的元组。

举例说明:下图为关系 R 和 S 两张表

img

下图表示关系 R 和 S 的连接操作

img

连接操作中比较重要且常用的连接是等值连接和自然连接。

  • 等值连接:θ 为 “=” 时的连接运算称为等值运算,它是从 R 和 S 中选取 R 中的 A 属性组上的元组等于 S 中 B 属性组上的元组。

  • 自然连接(Natural join):自然连接用 R 连接 R ⋈ S 表示,是一种特殊的等值连接,一般使用在 R 和 S 中有公共属性的情况中。例如,R 和 S 中有相同的属性 B 记作:

img

举例:有关系 R 和关系 S 两张表

img

下图表示关系 R 和 S 的自然连接:

img

3. 除法 (Division):设关系 R 和 S 的元数分别为 r 和 s (设 r>s>0), 那么 R÷S 是一个(r-s) 元的元组集合。

img

例如:有三张表,分别是 R、COURSE1 和 COURSE2

img

(1)R÷COURSE1 表示 至少选修 COURSE1 课程的学生名单

img

(2) R÷COURSE2 表示至少选修 COURSE2 课程的学生名单

img


【数据库】关系代数基本运算

琚建飞于 2016-11-01 22:35:35 发布

前言

关系代数是以关系为运算对象的一组高级运算的集合。由于关系定义为属性个数相同的元组的集合,因此集合代数的操作就可以引入到关系代数中。关系代数中的操作可以分为两类:传统的关系操作,并、差、交、笛卡尔积(乘)、笛卡尔积的逆运算(除);扩充的关系操作,对关系进行垂直分割(投影)、水平分割(选择)、关系的结合(连接、自然连接)等。

五个基本的关系代数操作

五个关系代数操作分别是:并、差、笛卡尔积、投影和选择。

它们组成了关系代数完备的操作集。例子,分析下面两个关系:

img

关系代数操作的结果

(a)R∪S 并 (b)R-S 差 (c)R×S 笛卡尔积 (d)πC,A ® 投影 (e)σB>’4’ ® 选择

img

说明:笛卡尔积,若 R 有 m 个元组,S 有 n 个元组,则 R×S 有 m×n 个元组。投影,C 和 A 为属性名,说明要选择的列。选择 B>‘4’,即选择语句的条件,对关系做水平分割,选择符合条件的元组。

连接

连接是从关系 R 和 S 的笛卡尔积中选取属性值满足某一个操作的元组。

下面的例子同 σ2=4 (R×S)。

img

自然连接

img

实例

在关系代数运算中,把由五个基本操作经过有限次复合的式子称为关系代数表达式。这种表达式的运算结果仍是一个关系。我们可以用关系代数表达式表示各种数据查询操作。

【例 4.5】对于下面的教学数据库中的四个关系,为方便起见,其名称简化为 T、C、S 和 SC:

img

下面用关系代数表达式表达每个查询语句

1)检索学习课程号为 C2 课程的学生学号和姓名

img

由于这个查询涉及到两个关系 S 与 SC,因此先要对这两个关系进行自然连接操作,然后再执行选择和投影操作。


数据库 - 关系代数(类型、完整性约束、基本运算、扩展运算)

zdplife 于 2015-08-28 21:41:10 发布

(1)基本概念

① 属性和域:

每个事物有很多属性,每个属性对应的取值范围叫做域,所有对域都是原子数据(第一范式)

② 相关名词

n 元关系:R (D1,D2,D3…Dn) 是 n 元关系,其中关系属性的个数称为 “元数”,元组的个数称为 “基 数”,也就是记录值。

候选码:若关系中某一个属性或者属性组的值可以唯一的标识一个元组,则称为候选码

主码:可以选择任意一个候选码作为主码

主属性:包含在任何候选码中的属性叫作主属性

全码:关系模型中所有属性都是这个关系模型的候选码,称为全码

外码:关系模式中的属性非该关系的码,则称为外码

③ 三种类型:

基本表:实际存在的表

查询表:查询结果对应的表

视图表:由基本表和其他视图表导出的表,不是实际存在数据库中

④ 完整性约束:

实体完整性:主属性 A 不能为空值

参照完整性:用实体之间的关系来描述,若 F 是关系 R 的外码,则 F 或者是空值,或者是某个元组的 主码值

用户定义完整性:根据具体关系数据的约束条件,比如数据范围等

(2)关系五种基本运算

① 并:

R,S 具有相同的关系模式(元素相同,结构相同),记为 R U S, 返回由 R 或者 S 元组构成的集合组成

② 差:

R,S 具有相同的关系模式(元素相同,结构相同),记为 R-S,右属于 R 但不属于 S 的元组组成

③ 广义笛卡尔积:

R×S 由 n 目和 m 目的关系 R,S 组成一个(n+m)列的元组集合,若 R 有 K1 个元组,S 有 K2 个元组,则 R×S 有 K1*K2 个元 组

④ 投影(π) :

从关系的垂直方向开始运算,选择关系中的若干列组成新的列。

⑤ 选择(σ):

选择从关系的水平方向进行元算,选择满足给定条件的元组组成新的关系。

(3)扩展的关系代数运算

① 交:

R∩S=R-(R-S),R,S 具有相同的关系模式

② 链接:

链接分为 θ 链接,等值链接和自然链接

θ 链接:从 R,S 的笛卡尔积中选择满足一定条件的元组

等值链接:当 θ 为 “=” 时为等值链接

自然链接:是一种特殊的等值链接,比较的分量必须是相同的属性组,并在结果集中去掉重复列,如果没有重复列,自然链接就转换为笛卡尔积

③ 除:

同时从水平方向和垂直方向进行运算,给定关系 R (X,Y) 和 S (Y,Z),X,Y,Z 为属性组,R÷S 应当满足在 X 上的分量值 x 的像集 Yx 包含关系 S 在属性组 Y 上的投影集合:

例如:

R 是:

ABCD
abcd
abef
abhk
bdef
bddl
ckcd
ckef

S 是:

CD
cd
ef

则 R÷S:

AB
ab
ck

④ 广义投影:

广义投影运算容许在投影列表中使用算法运算,实现对投影运算的扩充,投影出的列不一定是原来的列,可以是通过计算出来的列。

⑤ 外连接:

由于自然链接会丢失一些信息,而外链接可以处理由于链接运算而缺失的信息,外链接分为左外链接、右外链接、全外链接。

左外链接:取出左侧关系中所有与右侧关系中任一元素都不匹配的元组,用 null 来填充右侧的关系 属性。

右外链接:取出右侧关系中所有与右侧关系中任一元素都不匹配的元组,用 null 来填充左侧的关系属性。

全外链接:完成左外链接和右外链接的操作。


数据库 —— 关系数据库以及关系代数和关系运算

云卷云舒于 2018-04-28 23:00:19 发布

一、关系数据结构及形式化定义

1、关系

关系模型的数据结构非常简单,只包含单一的数据结构 —— 关系。在用户看来,关系模型中数据的逻辑结构是一张扁平的二维表。

1.1 域

域是一组具有相同数据类型值的集合。

1.2 笛卡儿积

一般来说,笛卡儿积是没有实际语义的,只有它的真子集才有实际含义。

(1) 关系的三种类型

基本关系(基本表):是实际存在的表,是实际存储的逻辑表示;

查询表:查询结果对应的表;

视图表:是由基本一或其他视图表导出的表,是虚表,不对应实际存储的数据。

(2) 关系的限定和扩充

① 无限关系在数据库系统中是无意义的,限定关系数据模型中的关系必须是有限集合;

② 通过为关系的每个列附加一个属性名的方法取消关系属性的有序性。

(3) 基本关系具备的性质

① 列是同质的,每一列中的分量是同一类型的数据,来自同一个域;

② 不同的列可出自同一个域,称其中的每一个列为一个属性,不同的属性要给予不同的属性名;

③ 列的次序可以任意交换;

④ 任意两个元组的候选码不能取相同的值;

⑤ 行的次序可以任意交换;

⑥ 分量必须取原子值,每一个分量都必须是不可再分的数据项。

关系模型要求关系必须是规范化的,即要求关系必须满足一定的规范条件。规范化的关系称为范式。

2、关系模式

定义:关系的描述称为关系模式,它可以表示为 R (U,D,DOM,F)。R 是关系名,U 为组成该关系的属性名集合,D 为 U 中属性所来自的域,DOM 为属性向域的映像集合(说明它们出自哪个域,常常直接说明为属性的类型和长度),F 为属性间数据的依赖关系集合。

关系是关系模式在某一时刻的状态或内容,关系模式是静态的、稳定的,而关系是动态的、随时间不断变化的,因为关系操作在不断的更新着数据库中的数据。

3、关系数据库

所有关系的集合构成一个关系数据库。

关系数据库也有型和值之分。关系数据库的型称为关系数据库模式,是对关系数据库的描述。关系数据库的值是这些关系模式在某些时刻对应的关系的集合,通常称作关系数据库。

4、关系模型的存储结构

表是关系数据的逻辑模型。

在关系数据库的物理组织中,有的一个表对应一个操作系统文件,将物理数据组织交给操作系统来完成;有的从操作系统那里申请若干个大的文件,自己划分文件空间,组织表、索引等存储结构,并进行存储管理。

二、关系操作

1、基本的关系操作

关系模型中常用的关系操作包括查询 (query) 操作和插入 (insert)、删除 (delete)、修改 (update) 操作两大部分。

查询操作又可以分为选择 (select)、投影 (project)、连接 (join)、除 (divide)、并 (union)、差 (except)、交 (intersection)、笛卡儿积等。其中选择、投影、并、差、笛卡儿积是 5 种基本操作,其他操作可以用基本操作来定义和导出。

2、关系数据语言的分类

关系数据语言可以分为三类:关系代数语言(如 ISBL),关系演算语言,具有关系代数和关系演算双重特点的语言(如 SQL)。

2.1 关系代数语言

关系代数用对关系的运算来表达查询要求。

2.2 关系演算语言

关系演算用谓词来表达查询要求。它可按谓词变元的基本对象是元组变量还是域变量分为元组关系演算和域关系演算。

一个关系数据语言能够表示关系代数可以表示的查询,称为具有完备的表达能力,简称关系完备性。已经证明关系代数、元组关系演算和域关系演算三种语言在表达能力上是等价的,都具有完备的表达能力。

2.3 结构化查询语言

它是一种具有关系代数和关系演算双重特点的语言,是集查询、数据定义语言、数据操纵语言和数据控制语言于一体的关系数据语言。

三、关系的完整性

关系模型中有三类完整性约束:实体完整性、参照完整性和用户定义的完整性,其中实体完整性和参照完整性是关系数据模型必须满足的完整性约束条件,被称作是关系的两个不变性,应该由关系系统自动支持。

1、实体完整性

1.1 实体完整性规则

若属性(一个或一组属性)A 是基本关系 R 的主属性,则 A 不能取空值。

1.2 实体完整性规则说明

(1) 一个基本表通常对应现实世界的一个实体集;

(2) 实体在现实世界中是可区分的,它们具有某种唯一性的标识,关系模型中以主码作为唯一性标识;

(3) 主码中的属性即主属性不能取空值。

2、参照完整性

2.1 参照完整性规则

若属性(一个或一组属性)F 是基本关系 R 的外码,它与基本关系 S 的主码相对应(R 和 S 有可能是相同的关系),则对于 R 中每个元组在 F 上的值必须:或者取空值,或者等于 S 中某个元组的主码值。

参照完整性规则就是定义外码和主码之间的引用规则。

2.2 参照完整性规则说明

(1) 不仅两个或两个以上的关系间存在引用关系,同一关系内部属性间也可能存在引用关系(如学生(学员,…,班长));

(2) 如果 F 是关系 R 的一个或一组属性,但不是关系 R 的主码,K 是基本关系 S 的主码。如果 F 与 K 相对应,则称 F 是 R 的外码,并称基本关系 R 为参照关系,基本关系 S 为被参照关系。关系 R 和 S 有可能是相同的关系。

(3) 外码并不一定发与相对应的主码同名,但实际应用中为了方便识别,一般使用同名;

⑷ 当参照完整性约束和实体完整性约束无法同时满足时,优先满足实体完整性约束,如成绩关系中学号和课程号分别参照学生关系和课程关系中的主码,此时由于学号和课程号是成绩关系中的主属性,则它们不能取空值,只能取被参照关系中已经存在的主码值。

3、用户定义的完整性

用户定义的完整性约束就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求,如某个属性必须取唯一值、某个非主属性不能取空值。

四、关系代数

关系代数是一门抽象的查询语言,它用对关系的运算来表达查询。

运算对象、运算符、运算结果是运算的三大要素。关系代数的运算对象是关系,运算结果也是关系,运算符包括:集合运算符和关系运算符。

img

1、传统的集合运算

传统的集合运算是二目运算,包括并、交、差、笛卡儿积四种运算。以下以 oracle 为例:

1.1 并(union)

R∪S

其结果仍为 n 目关系,由属于 R 或属于 S 的元组组成。

-- 结果:2 条记录

select * from emp where empno=7369
union
select * from emp where empno=7788

-- 结果:11 条记录

select * from emp where sal < 2000 -- 只有 2 个 20 号部门的人,一共 8 条记录
union
select * from emp where deptno = 20 --20 号部门共有 5 个人,一共 5 条记录

1.2 差(except)

R-S

其结果关系仍为 n 目关系,由属于 R 而不属于 S 的所有元组组成。

-- 结果:1 条记录

select * from emp where deptno=30 --30 号部门共有 6 个人,一共 6 条记录
minus
select * from emp where deptno=30 and mgr=7698 -- 部门经理为 7698 的员工有 5 个,一共 5 条记录

1.3 交(intersection)

R∩S

其结果仍为 n 目关系,由既属性 R 又属于 S 的元组组成。交可以用差来表示,即 R∩S=R-(R-S)。

-- 结果:5 个

select * from emp where deptno=30 --6 个
intersect
select * from emp where deptno=30 and mgr=7698 --5 个

1.4 笛卡儿积

关系 R 和 S 的笛卡儿积是一个(n+m)列的元组的集合,元组的前 n 列是关系 R 的一个元组,后 m 列是关系 S 的一个元组。若 R 有 x 个元组,S 有 y 个元组,则关系 R 和 S 的笛卡儿积有 x*y 个元组。

-- 笛卡儿积(若关系 R 有 n 列 x 行,关系 S 有 m 列 y 行,则 R 和 S 的笛卡儿积为列 n+m,行 x*y)

select a.*,b.* from emp a,dept b -- 第一种
select * from emp cross join dept -- 第二种

2、专门的关系运算

专门的关系运算包括选择、投影、连接、除运算等。以下以 oracle 为例:

2.1 选择(selection)

选择的逻辑表达式的基本形式为:XθY。其中 θ 代表比较运算符,它可以是比较运算符。X、Y 是属性名或常量或简单函数。它是从行的角度进行的运算。

select * from emp where sal > 3000

2.2 投影(projection)

关系 R 上的投影是从关系 R 中选出若干属性列组成新的关系。它是从列的角度进行的运算。由于投影取消了某些列之后可能出现重复的行,应取消这些完全相同的行。

select distinct deptno from emp

加粗样式2.3 连接(join)

也称 θ 连接,它是从两个关系的笛卡儿积中选取属性间满足一定条件的元组。

-- 向 dept 中添加列(平均工资)设置 10、20、30 号部门的平均工资并提交

alter table dept add (avgsal number (10))
update dept set avgsal=3000 where deptno = 10;
update dept set avgsal=2000 where deptno = 20;
update dept set avgsal=1500 where deptno = 30;
commit;

-- 向 emp 中添加一条没有部门的员工信息记录并提交

insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (8888,'ZHANG','ENGINEER',7788,sysdate,3000,2000,null);
commit;

(1) 非等值连接

θ 不为 “=” 的连接称为非等值连接

select * from emp e join dept d on e.sal > d.avgsal

(2) 等值连接

θ 为 “=” 的连接称为等值连接,它是从关系 R 和 S 的笛卡儿积中选取 A、B 属性值相等的那些元组。等值连接的属性名可以相同也可以不相同。

select * from emp e join dept d on e.sal = d.avgsal
select * from emp e join dept d on e.deptno = d.deptno

(3) 自然连接

自然连接是一种特殊的等值连接,它要求两个关系进行比较的分量必须是同名的属性组,并且在结果中把重复的属性列去掉。一般的连接是从行的角度进行操作,自然连接需要取消重复列,所以它是从行和列的角度进行操作。

select * from emp natural join dept

⑷ 外连接

两个关系 R 和 S 在做自然连接时,选择两个关系在公共属性上值相等的元组构成新的关系。此时,关系 R 和 S 可能有在公共属性上不相等的元组,从而造成 R 或 S 中元组的舍弃,这些舍弃的元组被称为悬浮元组。如果把悬浮元组也保存在结果关系中,而在其他属性上填空值,那么这种连接就叫做外连接。

① 左外连接

如果只保留左边关系 R 中的悬浮元组就叫做左外连接。

select * from emp e left join dept d on e.deptno = d.deptno -- 员工 8888 没有部门,只保留左表的悬浮元组,其他属性为 null

② 右外连接

如果只保留右边关系 S 中的悬浮元组就叫做右外连接。

select * from emp e right join dept d on e.deptno = d.deptno --40 号部门没有人,只保留右表的悬浮元组,其他属性为 null

③ 全外连接

如果保留两边关系 R 和 S 中的所有悬浮无级就叫做全外连接。

select * from emp e full join dept d on e.deptno = d.deptno -- 保留两边的悬浮元组,左表和右表各有一条悬浮元组记录,一共 16 行

⑸ 自连接

select * from emp e1 join emp e2 on e1.empno = e2.mgr

2.4 除运算(division)

设关系 R 除以关系 S 的结果为关系 T,则关系 T 包含所有在 R 但不在 S 中的属性及其值,且 T 的元组与 S 的元组的所有组合都在 R 中。

(1) 象集

给定一个关系 R(X,Z),X 和 Z 为属性组。它表示 R 中属性组 X 上值为 x 的若干元组在 Z 上分量的集合。

例:关系 R

x1y1
x1y2
x1y3
x2y3
x2y1

x1 在 R 中的象集 Z1={y1,y2,y3}

x2 在 R 中的象集 Z2={y3,y1}

(2) 用象集来定义除法

① 给定关系 R(X,Y)和 S(Y,Z),其中 X、Y、Z 为属性组,R 中的 Y 与 S 中的 Y 可以有不同的属性名,但必须出自相同的域集;

② 元组在 X 上的分量值 x 的象集 K 要包含 S 在 Y 上投影的集合,满足前面条件的元组在 X 属性上的投影就是 R 除以 S 的结果关系;

③ 除操作是同时从行和列角度进行的操作。

例:

关系 R

XY
x1y1
x1y2
x1y3
x2y3
x2y5

关系 S

YZ
y1z1
y3z2

R÷S=P,P 如下:

X
x1

分析

① S 在(Y)上的投影的集合是:{(y1),(y3)};

② 元组在 X 上的分量值 x 的象集有两组;

x1 的象集 K1={(y1),(y2),(y3)}

x2 的象集 K2={(y3),(y5)}

③ 从①②得知只有象集 K1 包含了 S 在(Y)上的投影;

④ 满足以上条件的象集 K1 在 X 属性上的投影为 {(x1)}。

小结:

在关系代数运算中,并、差、笛卡儿积、选择和投影这 5 种运算为基本的运算,其他三种运算交、连接、除,均可使用这 5 种基本运算来表达。它些运算经过有限次复合后形成的表达式称为关系代数表达式。

五、关系数据库的规范化理论

1、关系模式中可能存在的冗余和异常问题

① 数据冗余

数据冗余是指同一数据反复被存取的情况。

② 更新异常

数据冗余将导致存储空间的浪费和潜在数据不一致性以及修改麻烦等问题。

③ 插入异常

数据的插入操作异常是指应该插入到数据库中的数据不能执行插入操作的情形。

④ 删除异常

数据的删除操作异常是指不应该被删除的数据被删去的情形。

小结:

关系模式产生上述问题的原因,以及消除这些问题的方法,都与数据依赖的概念密切相关。数据依赖是可以作为关系模式的取值的任何一种关系所必须满足的一种约束条件,是通过一个关系中各个元组的某些属性之间的相等与否体现出来的相互关系。这是现实世界属性间相互联系的抽象,是数据内在的性质,是语义的体现。

数据依赖,其中最重要的是函数依赖和多值依赖。

2、函数依赖与关键字

函数依赖是指关系中属性间的对应关系。

定义一

设 R 为任一给定关系,如果对于 R 中属性 X 的每一个值,R 中的属性 Y 只有唯一值与之对应,则称 X 函数决定 Y 或称 Y 函数依赖于 X,记作 X → Y,其中 X 称为决定因素。反之,对于关系 R 中的属性 X 和 Y,若 X 不能函数决定 Y,则其符号记作 X →× Y。

例:SNO → SNAME SNAME →× SNO(人名可能有同名同姓的,不能决定学号)

注意:函数依赖是针对关系的所有元组,即某个关系中只要有一个元组的有关属性值不满足函数依赖的定义,则相对应的函数依赖就不成立。

函数依赖根据其不同性质可分为完全函数依赖、部分函数依赖和传递函数依赖。

① 完全函数依赖

定义二

设 R 为任一给定关系,X、Y 为其属性集,若 X → Y,且任何 X 中的真子集 X1 都有 X1 →× Y,则称 Y 完全函数依赖于 X。

例:(SNO,CNO)→ GRADE(学号和课程编号决定成绩)

② 部分函数依赖

定义三

设 R 为任一给定关系,X、Y 为其属性集,若 X → Y,且 X 中存在一个真子集 X1 满足 X1 → Y,则称 Y 部分函数依赖于 X。

例:(SNO,SNAME)→ SSEX,但其中 SNO → SSEX(学号和姓名可以决定性别,但其中学号可以直接决定性别)

③ 传递函数依赖

定义四

设 R 为任一给定关系,X、Y、Z 为其不同的属性子集,若 X → Y,Y →× X,Y → Z ,则有 X → Z,称为 Z 传递函数依赖于 X。(加入条件 Y →× X,是因为若 Y → X,即有 X ←→ Y,这实际上是 X 直接函数决定 Z,而不是 X 传递函数决定 Z)

例:BNO → PNAME (书号决定出版社)和 PNAME → PADDRESS(出版社决定出版社地址),但 PNAME →× BNO(一个出版社可能出版多种书),因此有 PADDRESS 对 BNO 的传递函数依赖。

定义五

设 R 为任一给定关系,U 为其所含的全部属性集合,X 为 U 的子集,若有完全函数依赖 X → U,则 X 为 R 的一个候选关键字。作为候选关键字的属性集 X 唯一标识 R 中的元组,但该属性集的任何真子集不能唯一标识 R 中的元组。显然,一个关系 R 中可能存在多个候选关键字,通常选择其中之一作为主键,候选关键字中所含的属性称为主属性。

例:属性集(SNO,CNO)为候选关键字,SNO 和 CNO 为主属性

3、范式与关系规范化的过程

关系数据库中的关系需要满足一定的要求,不同程度的要求称为不同的范式。满足最低要求的称为第一范式,简称 1NF,这是最基本的范式;在第一范式的基础上进一步满足一些新的要求称为第二范式(2NF);以此类推,再进一步的范式是第三范式(3NF)及其改进形式 BCNF。

一个低一级范式的关系模式通过模式分解,可以转换为若干个高一级范式的关系模式的集合,这种过程叫做规范化。

(1) 第一范式

定义:设 R 为任一给定关系,如果 R 中每个列与行的交点处的取值都是不可再分的基本元素,则 R 为第一范式。

由此可见,第一范式是一个不含重复组的关系,其中不存在嵌套结构,不满足第一范式的关系为非规范关系。下面是一个非规范关系,因为在学号为 80154 的学生数据中出现了重复组。

SNOCNOCTITLEINAMEIPLACEGRADE
80152C01操作系统五忠东 0170
80153C02数据库高国东 0285
80154C01操作系统五忠东 0186
C03人工智能杨凡东 0372
80155C04C 语言高国东 0292

非规范关系转化为 1NF 比较容易,可以通过重写关系中属性值相同部分的数据来实现,转化后如下:

SNOCNOCTITLEINAMEIPLACEGRADE
80152C01操作系统五忠东 0170
80153C02数据库高国东 0285
80154C01操作系统五忠东 0186
80154C03人工智能杨凡东 0372
80155C04C 语言高国东 0292

然而,上面表中所示的关系存在着冗余高、插入和删除操作异常等问题。比如,若操作系统这门课程被 1000 个同学选修,那么该授课老师的办公地址就要被存储 1000 次,这就带来了大量的数据 “冗余”;如果学校开设了一门新课程,但尚未有学生选修,则这个课程的信息就无法存储到关系中,此时就出现了 “插入异常” 的现象;如果删除上面关系中的最后一条记录,则同时也会删除和 C 语言相关的授课老师的信息,此时会面临 “删除异常的问题”。所以,在满足 1NF 的基础,需要对其进一步进行规范化。

经分析,SC 关系出现冗余高、插入异常、删除异常的问题原因在于:非主属性 GRADE 完全函数依赖于(SNO,CNO),其他非主属性(CTITLE,INAME,IPLACE)都是函数依赖于 CNO,即它们与(SNO,CNO)为部分函数依赖关系。那么,解决 1NF 关系存在问题的方法是:将满足部分函数依赖关系和满足完全函数依赖关系的属性分解并组成两个关系,从而消除非主属性对候选关键字的部分函数依赖,由此获得更高一级的范式。按照此方法关系 SC 可分解为关系 SG 和关系 CI,如下所示:

SNOCNOGRADE
80152C0170
80153C0285
80154C0186
80154C0372
80155C0492
CNOCTITLEINAME
-----------------
C01操作系统五忠
C02数据库高国
C03人工智能杨凡
C04C 语言高国

(2) 第二范式

定义:设 R 为任一给定关系,若 R 为 1NF,且所有非主属性都完全函数依赖于候选关键字,则 R 为第二范式。

然而,2NF 并不能解决所有问题,在关系 CI 中,如果有一位新老师报到,需将其有关数据插入到 CI 中去,但该老师暂时还未承担任何教学工作,则因缺失关键字 CNO 的值而不能进行插入操作。

经分析,产生上述现象的原因在于:关系 CI 中存在非主属性对主属性的传递函数依赖,即 CNO → INAME、INAME →× CNO、INAME → IPLACE。因此,需要将 2NF 的关系 CI 进行一步进行规范化,消除非主属性对候选关键字的传递函数依赖。

CNOCTITLEINAME
C01操作系统五忠
C02数据库高国
C03人工智能杨凡
C04C 语言高国
INAMEIPLACE
:----:-----
五忠东 01
高国东 02
杨凡东 03

(3) 第三范式

定义:设 R 为任一给定关系,若 R 为 2NF,且其每一个非主属性都不传递函数依赖于候选关键字,则 R 为第三范式。

通常,第三范式的关系大多数都能解决插入和删除操作异常的问题,数据冗余也能得到有效的控制,但也存在一些例外。例如如下关系中,若每一个学生可选修多门课程,每一门课程可有多个指导老师,但每个老师只能指导一门课程,则其候选关键字为(SNO,CTITLE)和(SNO,TNAME),故不存在非主属性,也就不存在非主属性对主属性的传递函数依赖。所以,该关系是一个 3NF,但其中仍存在插入和删除操作异常问题。例如,一个新课程和指导老师的数据要插入到数据库中,必须至少有一个学生选修该课程且该指导老师已被分配给他时才能进行。

SNOCTITLETNAME
S01英语王华
S01数学沈飞
S02物理高俊
S03英语袁晓
S04英语王华

经分析,上述问题的原因在于:主属性之间存在函数依赖 TNAME → CTITLE,这里需要对其进一步进行规范化,其结果如下:

SNOTNAME
S01王华
S01沈飞
S02高俊
S03袁晓
S04王华
TNAMECTITLE
:----:-----
王华英语
沈飞数学
高俊物理
袁晓英语

⑷ BCNF

定义:设 R 为任一给定关系,X、Y 为其属性集,F 为其函数依赖集,若 R 为 3NF,且其 F 中所有函数依赖 X → Y(Y 不属于 X)中的 X 必包含候选关键字,则 R 为 BCNF

简而言之,若 R 中每一个函数依赖的决定因素都包含一个候选关键字,则 R 为 BCNF,其中,决定因素可以是单一属性或组合属性。

根据 BCNF 的定义可知,在关系 SCT 中,有函数依赖 TNAME → CTITLE,但 TNAME 不是候选关键字。


数据库系统概论 —— 关系代数详解

心无旁骛~已于 2023-02-03 13:05:39 修改

1、关系代数概述

关系代数是一种 抽象 的查询语言,是关系数据操纵语言的一种 传统表达方式,它是利用对关系的运算来表达查询的。

任何运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果。

关系代数的运算对象是关系,运算结果亦为关系。

在关系代数运算中,有 5 种基本运算,它们是并(U)、差(—)、投影、选择、笛卡尔积(X),其它运算即交、连接和除,均可通过 5 种基本的运算来表达 。

运算符

  • 集合运算符

  • 将关系看成 元组 的集合

  • 从关系的 “水平” 方向即行的角度来进行运算

  • 专门的关系运算符

  • 不仅涉及 而且涉及

  • 算术比较符

  • 辅助专门的关系运算符进行操作

  • 逻辑运算符

  • 辅助专门的关系运算符进行操作

常见的关系运算符如下:

在这里插入图片描述

1.1 传统的集合运算

设关系 R R R 和关系 S S S 是相容的, t t t 代表元组变量,现将各种运算分别介绍如下:

(1)并(Union)

  • 关系 R R R 与关系 S S S 的并记作: R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R∪S=\{t|t∈R∨t∈S \} RS={ttRtS}

  • 结果关系是由属于 R R R 或属于 S S S 的元组组成,且结果仍为 n n n 目关系,但结果关系要消除重复元组。

举例

R R R S S S

  • 具有相同的目 n n n(即两个关系都有 n 个属性)

  • 相应的属性取自同一个域 R ∪ S R∪S RS 仍为 n n n 目关系,由属于 R R R 或属于 S S S 的元组组成

  • R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R∪S=\{t|t∈R∨t∈S \} RS={ttRtS}

具体如下图所示:

在这里插入图片描述

(2)交( Intersection)

  • 关系 R R R与关系 S S S的交记作: R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R∩S=\{t|t∈R∧t∈S \} RS={ttRtS}

  • 结果关系由既属于 R R R 又属于 S S S 的元组组成,且仍为 n n n 目关系。

举例

R R R S S S

  • 具有相同的目 n n n

  • 相应的属性取自同一个域

R ∩ S R∩S RS

  • 仍为 n n n 目关系,由既属于 R R R 又属于 S S S 的元组组成

  • R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R∩S=\{t|t∈R∧t∈S \} RS={ttRtS}

具体如下图所示:

在这里插入图片描述

(3)差(Difference)

  • 关系 R 与关系 S 的差记作: R − S = { t ∣ t ∈ R ∧ t ∉ S } R-S=\{t|t∈R ∧t \notin S\} RS={ttRt/S}

- R R R S S S的差,结果关系由属于 R R R而不属于 S S S的所有元组组成,且仍为 n n n目关系,即在关系 R R R中减去 R R R S S S的相同元组。

举例

R R R S S S

  • 具有相同的目 n n n

  • 相应的属性取自同一个域

R − S R - S RS

  • 仍为 n n n 目关系,由属于 R R R 而不属于 S S S 的所有元组组成

  • R − S = { t ∣ t ∈ R ∧ t ∉ S } R-S=\{t|t∈R ∧t \notin S\} RS={ttRt/S}

在这里插入图片描述

(4)广义笛卡尔积(Extended Cartesian Product)

  • 两个分别为 n n n目和 m m m目的关系, R R R S S S的广义笛卡尔积是一个 ( n + m ) (n+m) (n+m)列的元组的集合。

  • 元组的前 n n n列是关系 R R R的一个元组,后 m m m列是关系 S S S的一个元组。若 R R R k 1 k_1 k1个元组, S S S k 2 k_2 k2个元组,则关系 R R R和关系 S S S的广义笛卡尔积有 k 1 × k 2 k_1×k_2 k1×k2个元组。

  • 记作: R × S = { ( a 1 , a 2 , … a m , b 1 , b 2 , … b n ) ∣ ( a 1 , a 2 , … a m ) ∈ R ∧ ( b 1 , b 2 , … b n ) ∈ S } 。 R×S=\{(a_1,a_2,…a_m,b_1,b_2,…b_n)| (a_1,a_2,…a_m) ∈R ∧ (b_1,b_2,…b_n) ∈ S\}。 R×S={(a1,a2,am,b1,b2,bn)(a1,a2,am)R(b1,b2,bn)S}

严格地讲应该是广义的笛卡尔积

- R R R: n n n 目关系, k 1 k_1 k1 个元组

- S S S: m m m 目关系, k 2 k_2 k2 个元组

R × S R×S R×S

  • 列: m + n m+n m+n 列元组的集合

  • 元组的前 n n n 列是关系 R R R 的一个元组

  • m m m 列是关系 S S S 的一个元组

  • 行: k 1 × k 2 k_1×k_2 k1×k2 个元组

在这里插入图片描述

具体如下图所示:

在这里插入图片描述

1.2 专门的关系运算

在讲解之前,我们先引入几个记号,这样有助于下面的理解,确实关系代数后半部分有点难理解。

(1)* R , t ∈ R , t [ A i ] R,t\in R,t [A_i] R,tR,t[Ai]*

设关系模式为 R ( A 1 , A 2 , … , A n ) R (A_1,A_2,…,A_n) R(A1A2An),它的一个关系设为 R R R t ∈ R t\in R tR表示 t t t R R R的一个元组, t [ A i ] t [A_i] t[Ai]则表示元组 t 中相应于属性 A i A_i Ai的一个分量。

(2) t r t s ⏞ \overbrace {t_rt_s} trts R R R n n n目关系, S S S m m m目关系。

t r ∈ R , t s ∈ S , t r t s ⏞ t_r\in R,t_s\in S, \overbrace {t_r t_s} trRtsStrts 称为元组的连接。 t r t s ⏞ \overbrace {t_r t_s} trts 是一个 n + m n + m n+m列的元组,前 n n n个分量为 R R R中的一个 n n n元组,后 m m m个分量为 S S S中的一个 m m m元组。

(3)象集 Z x Z_x Zx

给定一个关系 R ( X , Z ) R(X,Z) RX,Z X X X Z Z Z为属性组。当 t [ X ] = x t [X]=x t[X]=x时, x x x R R R中的象集(Images Set)为:

Z x = t [ Z ] ∣ t ∈ R , t [ X ] = x Z_x={t [Z]|t \in R,t [X]=x} Zx=t[Z]tRt[X]=x

它表示 R R R中属性组 X X X上值为 x x x的诸元组在 Z Z Z上分量的集合。

举例如下:

在这里插入图片描述

上面抽象的例子可能并不是特别容易理解,那么我们就拿生活中的实际例子进行解释:

学生 - 课程 - 选修关系

学生关系 Student、课程关系 Course 和选修关系 SC

在这里插入图片描述

在上面的关系表中,我们可以把 SC 表看作一个关系 R,它的属性组为学号,课程号以及成绩,即 R ( S n o , C n o , G r a d e ) R (Sno, Cno, Grade) R(Sno,Cno,Grade)。这时我们将 SC 表与上面那个例子对比可以看出,Sno 为 200215121 的学号在关系 R(SC 表)中的象集为 S n o 200215121 = { 1 , 2 , 3 } Sno_{200215121}=\{1,2,3\} Sno200215121={123},以此类推,这样就比较容易理解一点。

1.2.1 选择运算
  • 选择又称为限制

  • 选择运算符的含义

  • 关系 R 上的选择操作是根据某些条件对关系 R 做水平分割,即从行的角度选择符合条件的元组。

  • 在关系 R 中选择满足给定条件的诸元组

  • 记作: σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) = ‘真’ } σF(R)=\{t|t∈R∧F (t)=‘真’\} σFR={ttRF(t)=}

  • F:选择条件,是一个逻辑表达式,取逻辑值 “真” 或 “假”。

  • 选择运算是从关系 R 中选取使逻辑表达式 F 为真的元组,是从行的角度进行的运算

在这里插入图片描述

F:选择条件,是一个逻辑表达式

  • 基本形式为: X 1 θ Y 1 X_1θY_1 X1θY1

  • θ θ θ:比较运算符 (>, ≥ ,<, ≤ ,=或 < > ) (>,≥,<,≤,=或 <>) (>,,<,,=或<>

  • X 1 , Y 1 X_1,Y_1 X1Y1:属性名、常量、简单函数.

  • 属性名也可以用它的序号来代替;

以最上面的学生 - 课程 - 选修关系表举例说明更好理解

[例 1] 查询信息系(IS 系)全体学生

σ S d e p t = ′ I S ′ ( S t u d e n t ) 或 σ 5 = ′ I S ′ ( S t u d e n t ) σ_{Sdept} = 'IS' (Student) 或 σ_5 ='IS'(Student) σSdept=IS(Student)σ5=IS(Student)

结果:

在这里插入图片描述

[例 2] 查询年龄小于 20 岁的学生

σ S a g e < 20 ( S t u d e n t ) 或 σ 4 < 20 ( S t u d e n t ) σ_{Sage< 20}(Student) 或 σ_{4 < 20}(Student) σSage<20(Student)σ4<20(Student)

结果:

在这里插入图片描述

1.2.2 投影(Projection)

投影运算符的含义:

  • 从 R 中选择出若干属性列组成新的关系

  • π A ( R ) = t [ A ] ∣ t ∈ R π_A (R) = { t [A] | t \in R } πA(R)=t[A]tR

  • A:R 中的属性列

投影操作主要是从列的角度进行运算:

在这里插入图片描述

但投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)

举例说明一下

[例 3] 查询学生的姓名和所在系

即求 Student 关系上学生姓名和所在系两个属性上的投影

π S n a m e , S d e p t ( S t u d e n t ) 或 π 2 , 5 ( S t u d e n t ) π_{Sname,Sdept}(Student) 或 π_{2,5}(Student) πSnameSdept(Student)π25(Student)

结果:

在这里插入图片描述

[例 4] 查询学生关系 Student 中都有哪些系

π S d e p t ( S t u d e n t ) π_{Sdept}(Student) πSdept(Student)

结果:

在这里插入图片描述

由此可见,使用投影操作可以将关系表中的列单独拿出来组成新的关系表,这样方便我们可以更加清楚的查看自己想要的信息。

1.2.3 连接(Join)

连接也称为 θ θ θ连接

连接运算的含义

从两个关系的笛卡尔积中选取属性间满足一定条件的元组

在这里插入图片描述

连接运算从 R 和 S R 和 S RS的广义笛卡尔积 R × S R×S R×S中选取( R R R关系)在 A A A属性组上的值与( S S S关系)在 B B B属性组上值满足比较关系 θ θ θ的元组

举例说明一下

[例 5] 关系 R 和关系 S 如下所示:

在这里插入图片描述

在这里插入图片描述

1.2.4 两类常用连接运算

(1)等值连接(equijoin)

  • 什么是等值连接?

  • θ 为 “=” 的连接运算称为等值连接

  • 等值连接的含义

  • 从关系 R 与 S 的广义笛卡尔积中选取 A、B 属性值相等的

那些元组,即等值连接为:

在这里插入图片描述

举例说明

在这里插入图片描述

在这里插入图片描述

(2)自然连接(Natural join)

  • 自然连接是一种特殊的等值连接

  • 两个关系中进行比较的分量必须是相同的属性组

  • 在结果中把重复的属性列去掉

  • 自然连接的含义

  • R 和 S 具有相同的属性组 B

在这里插入图片描述

举例:

在这里插入图片描述

在这里插入图片描述

一般的连接操作是从行的角度进行运算。

在这里插入图片描述

自然连接还需要取消重复列,所以是同时从行和列的角度进行运算。

1.2.5 除(Division)

给定关系 R ( X , Y ) R (X,Y) R(XY) S ( Y , Z ) S (Y,Z) S(YZ),其中 X , Y , Z X,Y,Z XYZ为属性组。 R R R 中的 Y Y Y S S S 中的 Y Y Y 可以有不同的属性名,但必须出自相同的域集。 R R R S S S 的除运算得到一个新的关系 P ( X ) P (X) P(X) P P P R R R 中满足下列条件的元组在 X X X 属性列上的投影:

元组在 X X X 上分量值 x x x 的象集 Y x Y_x Yx 包含 S S S Y Y Y 上投影的集合,记作:

在这里插入图片描述

关于象集的概念我们在前面已经提到了,在此直接举例子说明除

[例 6] 设关系 R 、 S R、S RS 分别为下图的 (a) 和 (b), R ÷ S R÷S R÷S 的结果为图 ©

在这里插入图片描述

通过上面的结果我们可以发现,关系 R R R 中的 B 、 C B、C BC 属性组,和关系 S S S中的 B 、 C B、C BC 属性组的域都是相同的, R R R S S S 的除运算得到了一个新的关系,我们将它当做 P ( A ) P (A) P(A) P P P R R R 中满足上述条件的元组在 A A A 属性列中的投影。

分析

设关系 R , S R,S RS, 分别为例 6 中的 (a) 和 (b), R ÷ S R÷S R÷S 的结果为图 ©, 关系 R R R A A A 可以取四个值 { a 1 , a 2 , a 3 , a 4 } , \{ a_1,a_2,a_3,a_4\}, {a1a2a3a4}, 其中:

- a 1 a_1 a1的象集为 { ( b 1 , c 2 ) , ( b 2 , c 1 ),( b 2 , c 3 ) } \{(b_1,c_2),(b_2,c_1),(b_2,c_3)\} {b1c2,b2c1),(b2c3}

- a 2 a_2 a2的象集为 { ( b 3 , c 7 ) , ( b 2 , C 3 ) } \{(b_3,c_7),(b_2,C_3)\} {b3c7,b2C3}

- a 3 a_3 a3的象集为 { ( b 4 , c 6 ) } \{ (b_4,c_6) \} {(b4c6)}

- a 4 a_4 a4的象集为 { ( b 6 , c 6 ) } \{(b_6,c_6)\} {b6c6}

S S S ( B , C ) (B,C) BC上的投影为 { ( b 1 , c 2 ),( b 2 , c 1 ) , ( b 2 , c 3 ) } \{(b_1,c_2),(b_2,c_1),(b_2,c_3)\} {b1c2),(b2c1,b2c3}

显然只有 a 1 a_1 a1的象集包含了 S S S ( B , C ) (B,C) (B,C)属性组上的投影,所以 R ÷ S = { a 1 } R÷S=\{a1\} R÷S={a1}

除操作是同时从行和列角度进行运算

在这里插入图片描述


数据库解释关系代数中的象集

象集 定义

象集本质是一次选择运算和一次投影运算。

象集本质上是一次选择行的运算和一次选择列的运算。

对于关系模式 R ( X , Z ) R(X, Z) R(X,Z) X X X Z Z Z 为互补属性集)下的关系 A A A,当 t [ X ] = x t[X]=x t[X]=x 时 , x x x R R R 中的象集 Z x Z_x Zx R R R X X X 分量等于 x x x 的元组集合在属性集 Z Z Z 上的投影,即:

Z x = { t [ Z ]   ∣   t ∈ R , t [ X ] = x } Z_x = \{ t[Z] \ | \ t \in R,t[X]=x \} Zx={t[Z]  tRt[X]=x}

通过实例关系 R R R 展示, X X X 取不同值时对应不同象集。

在关系型数据库中,象集用于从特定关系中筛选和提取数据。以关系模式 R ( X , Z ) R(X, Z) R(X,Z) 来说,先进行选择运算,找出所有 X X X 属性值等于给定值 x x x 的元组;再进行投影运算,只保留这些元组在 Z Z Z 属性集上的值,组成象集。

XYZ
a1b1c2
a2b3c7
a3b4c6
a1b2c3
a4b6c6
a2b2c3
a1b2c1

在示例中,关系 R R R X X X { a 1 , a 2 , a 3 , a 4 } \{a_1,a_2,a_3,a_4\} {a1,a2,a3,a4} 这 4 个取值,以 a 1 a_1 a1 为例, R R R X X X 值为 a 1 a_1 a1 的元组有 3 个,对这 3 个元组在 { Y , Z } \{Y,Z\} {Y,Z} 属性集上投影,得到 a 1 a_1 a1 的象集 { ( b 1 , c 2 ) , ( b 2 , c 3 ) , ( b 2 , c 1 ) } \{(b_1,c_2),(b_2,c_3),(b_2,c_1)\} {(b1,c2),(b2,c3),(b2,c1)},直观体现了象集的运算过程和结果。

象集除运算

操作步骤

x 1 x_1 x1 在表 A 中的象集:

  • 先选出所有 x x x 属性中 x = x 1 x = x_1 x=x1 的那些行。
  • 然后选择出不包含 x 1 x_1 x1 的那些列。

示例

  • 喵喵在表 A 中的象集为 {1, 2}:

    喵喵象集

  • 汪汪在表 A 中的象集为 {1, 3}:

    汪汪象集

  • 萌萌在表 A 中的象集为 {2, 3}:

    萌萌象集

除法

定义

例如,对于表 A 和表 B,求 A ÷ B A \div B A÷B

示例

表 A

操作步骤

  1. 找出表 B 中与 A 属性相同的那些列,此时可以看出书号一列是相同的,所以把这一列抽出来:
    表 B 属性相同的列

  2. 求表 A 中各个不同 x x x 对应的象集(可以得到如下对应关系):
    不同 x 的象集

  3. x x x 的所有值,这个 x x x 要满足: x x x 的象集是表 B 的子集,这就是 A ÷ B A \div B A÷B 的结果:
    除法结果


via:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值