关系数据库
关系数据结构及形式化定义
“关系结构与形式化定义”是数据库理论中的一个重要概念。它涉及如何组织和描述数据库中的数据以及定义数据之间的关系。以下是对这一概念的详细介绍:
关系结构
关系结构(Relational Structure)是指在关系数据库中,数据被组织成一系列的关系(通常称为表),每个关系由若干元组(tuple)组成,元组又由若干属性(attribute)构成。具体来说,关系结构包含以下几个基本要素:
- 关系(表):一个关系对应一个表,表的名字即为关系的名字。
- 元组(行):每一个元组对应表中的一行,表示一个数据记录。
- 属性(列):每个属性对应表中的一列,表示数据记录的一个字段或特征。
- 域(Domain):属性的取值范围,表示某一属性所有可能的值的集合。
例如,假设有一个名为“学生”的关系表,其结构可以定义为:
学号 | 姓名 | 年龄 | 专业 |
---|---|---|---|
1 | 张三 | 20 | 计算机 |
2 | 李四 | 22 | 数学 |
3 | 王五 | 21 | 物理 |
这里,“学生”表就是一个关系,学号、姓名、年龄、专业是属性,每一行是一个元组。
形式化定义
关系结构的形式化定义通常使用数学符号来表示,主要包括以下部分:
-
关系模式(Relational Schema):关系模式描述了关系的名字及其属性。形式化表示为:R(A1, A2, …, An),其中R是关系名,A1, A2, …, An是属性名。
例如,学生表的关系模式可以表示为:
学生(学号, 姓名, 年龄, 专业)
-
关系实例(Relational Instance):关系实例是特定时间点上关系中的数据集合,表示为一个元组的集合。关系实例是关系模式的一个具体化。
例如,学生表的关系实例可以表示为:
学生 = { (1, '张三', 20, '计算机'), (2, '李四', 22, '数学'), (3, '王五', 21, '物理') }
-
键(Key):键是能唯一标识关系中元组的属性或属性集合。最常见的是主键(Primary Key)。
例如,在学生表中,“学号”可以作为主键,因为每个学生的学号是唯一的。
-
完整性约束(Integrity Constraints):完整性约束是保证数据的正确性和一致性的一组规则,包括实体完整性、参照完整性等。
- 实体完整性:主键不能为空。
- 参照完整性:外键值必须为NULL或引用另一个关系中的一个有效元组。
通过形式化定义,可以更加严格和清晰地描述和管理数据库中的数据结构及其关系,确保数据库系统的可靠性和一致性。
PS:这部分GPT讲的比一般的教科书直观多了,中国教科书是这样的,啰啰嗦嗦讲不清楚还晦涩难懂。
关系操作
“关系操作”是关系数据库管理系统(RDBMS)中的核心概念,用于操作和查询关系(表)中的数据。这些操作基于关系代数和关系演算,提供了一套用于数据检索和操作的基本工具。以下是对主要关系操作的详细介绍:
关系代数操作
关系代数操作是一种基于集合理论的操作,用于从一个或多个关系中导出新的关系。主要的关系代数操作包括:
-
选择(Selection):选择操作从一个关系中选出满足特定条件的元组。用符号σ表示。
- 例如,σ年龄 > 20(学生)表示从学生表中选择所有年龄大于20的学生。
-
投影(Projection):投影操作从一个关系中选出特定的属性,去掉其他属性。用符号π表示。
- 例如,π姓名, 专业(学生)表示从学生表中选择姓名和专业两个属性。
-
并(Union):并操作将两个关系的元组合并在一起,去除重复的元组。用符号∪表示。
- 例如,R ∪ S表示关系R和关系S的并集。
-
差(Difference):差操作从一个关系中去除在另一个关系中也出现的元组。用符号−表示。
- 例如,R − S表示关系R中有但关系S中没有的元组。
-
笛卡尔积(Cartesian Product):笛卡尔积操作将两个关系的元组合并,产生所有可能的组合。用符号×表示。
- 例如,R × S表示关系R和关系S的笛卡尔积。
-
连接(Join):连接操作将两个关系的元组合并在一起,条件是满足特定的连接条件。连接操作有多种类型,包括内连接、外连接、自然连接等。
- 例如,R ⨝ S表示关系R和关系S的内连接。
-
自然连接(Natural Join):自然连接是一种特殊的连接,它通过自动匹配两个关系中同名的属性来合并元组。
- 例如,R ⨝ S表示关系R和关系S的自然连接。
-
交(Intersection):交操作返回两个关系中共有的元组。用符号∩表示。
- 例如,R ∩ S表示关系R和关系S的交集。
SQL中的关系操作
关系代数的操作在SQL(结构化查询语言)中得到了具体实现,SQL是关系数据库中使用的主要查询语言。以下是一些常用的SQL操作:
-
选择(SELECT):从表中选择特定的列和行。
- 例如,
SELECT * FROM 学生 WHERE 年龄 > 20;
表示从学生表中选择所有年龄大于20的学生。
- 例如,
-
投影(SELECT DISTINCT):选择特定的列,并去除重复的行。
- 例如,
SELECT DISTINCT 专业 FROM 学生;
表示选择学生表中的所有专业,并去除重复值。
- 例如,
-
并(UNION):合并两个查询的结果,去除重复行。
- 例如,
SELECT * FROM R UNION SELECT * FROM S;
表示关系R和关系S的并集。
- 例如,
-
差(EXCEPT):返回一个查询的结果中不包含在另一个查询结果中的行。
- 例如,
SELECT * FROM R EXCEPT SELECT * FROM S;
表示关系R中有但关系S中没有的元组。
- 例如,
-
交(INTERSECT):返回两个查询结果中共有的行。
- 例如,
SELECT * FROM R INTERSECT SELECT * FROM S;
表示关系R和关系S的交集。
- 例如,
-
连接(JOIN):连接两个表,根据指定条件合并行。
- 例如,
SELECT * FROM R INNER JOIN S ON R.id = S.id;
表示关系R和关系S的内连接。
- 例如,
-
笛卡尔积(无条件JOIN):在SQL中,通常使用
CROSS JOIN
来表示笛卡尔积。- 例如,
SELECT * FROM R CROSS JOIN S;
表示关系R和关系S的笛卡尔积。
- 例如,
通过关系操作,可以灵活地查询和操作数据库中的数据,构建复杂的数据分析和应用。理解这些操作及其在SQL中的实现,是使用关系数据库的基础。
关系的完整性
关系的完整性是关系数据库管理系统(RDBMS)中用于确保数据准确性和一致性的一组规则和约束条件。完整性约束可以防止不正确的数据进入数据库,维护数据库的有效性。主要的关系完整性包括实体完整性、参照完整性和域完整性。
实体完整性(Entity Integrity)
实体完整性确保每个关系(表)中的每个元组(行)都有一个唯一的标识符,这通常是主键(Primary Key)。主键的值必须唯一且不能为空。
- 主键约束(Primary Key Constraint):主键是一个或多个属性的组合,其值能够唯一标识关系中的每个元组。
- 例如,在“学生”表中,“学号”可以作为主键,因为每个学生的学号是唯一的。
CREATE TABLE 学生 (
学号 INT PRIMARY KEY,
姓名 VARCHAR(50),
年龄 INT,
专业 VARCHAR(50)
);
参照完整性(Referential Integrity)
参照完整性确保关系之间的引用是一致的。具体来说,当一个关系中的一个属性引用另一个关系中的主键时,参照完整性要求引用必须有效,即引用的值必须存在。
- 外键约束(Foreign Key Constraint):外键是一个属性或属性的组合,它引用另一个关系中的主键。
- 例如,“成绩”表中的“学号”是“学生”表中的外键,它引用“学生”表中的“学号”。
CREATE TABLE 学生 (
学号 INT PRIMARY KEY,
姓名 VARCHAR(50),
年龄 INT,
专业 VARCHAR(50)
);
CREATE TABLE 成绩 (
成绩ID INT PRIMARY KEY,
学号 INT,
课程 VARCHAR(50),
分数 INT,
FOREIGN KEY (学号) REFERENCES 学生(学号)
);
域完整性(Domain Integrity)
域完整性确保每个属性的数据值必须在其定义的域内,即属性的值必须符合其数据类型和约束条件。
- 检查约束(Check Constraint):检查约束用于限制属性的值必须满足特定条件。
- 例如,在“学生”表中,可以限制“年龄”必须在0到120之间。
CREATE TABLE 学生 (
学号 INT PRIMARY KEY,
姓名 VARCHAR(50),
年龄 INT CHECK (年龄 >= 0 AND 年龄 <= 120),
专业 VARCHAR(50)
);
其他约束
除了上述主要的完整性约束外,还有一些其他常用的约束条件:
- 唯一约束(Unique Constraint):唯一约束确保一个属性或属性组合的值在关系中是唯一的,但允许有空值。
- 例如,可以限制“学生”表中的“姓名”列中的每个名字在整个表中是唯一的。
CREATE TABLE 学生 (
学号 INT PRIMARY KEY,
姓名 VARCHAR(50) UNIQUE,
年龄 INT,
专业 VARCHAR(50)
);
- 非空约束(Not Null Constraint):非空约束确保属性的值不能为空。
- 例如,可以限制“学生”表中的“姓名”列不能为空。
CREATE TABLE 学生 (
学号 INT PRIMARY KEY,
姓名 VARCHAR(50) NOT NULL,
年龄 INT,
专业 VARCHAR(50)
);
通过这些完整性约束,可以有效地确保数据库中数据的一致性、准确性和可靠性,防止错误数据的插入和维护数据的完整性。
关系代数
关系代数(Relational Algebra)是关系数据库管理系统(RDBMS)中一种形式化的查询语言,用于操作和检索关系(表)中的数据。它基于集合论和逻辑运算,提供了一组操作,通过这些操作可以从一个或多个关系中导出新的关系。关系代数的操作可以分为基本操作和复合操作。
基本操作
-
选择(Selection):
- 选择操作从一个关系中选出满足特定条件的元组。用符号σ表示。
- 例如,σ年龄 > 20(学生)表示从学生表中选择所有年龄大于20的学生。
-
投影(Projection):
- 投影操作从一个关系中选出特定的属性,去掉其他属性。用符号π表示。
- 例如,π姓名, 专业(学生)表示从学生表中选择姓名和专业两个属性。
-
并(Union):
- 并操作将两个关系的元组合并在一起,去除重复的元组。用符号∪表示。
- 例如,R ∪ S表示关系R和关系S的并集。
-
差(Difference):
- 差操作从一个关系中去除在另一个关系中也出现的元组。用符号−表示。
- 例如,R − S表示关系R中有但关系S中没有的元组。
-
笛卡尔积(Cartesian Product):
- 笛卡尔积操作将两个关系的元组合并,产生所有可能的组合。用符号×表示。
- 例如,R × S表示关系R和关系S的笛卡尔积。
-
重命名(Rename):
- 重命名操作为关系中的属性或关系本身赋予新的名称。用符号ρ表示。
- 例如,ρ(新学生, 学生)表示将学生关系重命名为新学生。
复合操作
-
交(Intersection):
- 交操作返回两个关系中共有的元组。用符号∩表示。
- 例如,R ∩ S表示关系R和关系S的交集。
-
自然连接(Natural Join):
- 自然连接是一种特殊的连接,它通过自动匹配两个关系中同名的属性来合并元组。用符号⨝表示。
- 例如,R ⨝ S表示关系R和关系S的自然连接。
-
条件连接(Conditional Join):
- 条件连接根据指定的条件将两个关系中的元组合并。用符号⨝表示。
- 例如,R ⨝ (R.id = S.id) S表示关系R和关系S中满足条件R.id = S.id的元组的连接。
-
外连接(Outer Join):
- 外连接包括左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join),用于保留不匹配的元组。
- 例如,左外连接R ⟕ S表示关系R中的所有元组和匹配的S中的元组,以及R中不匹配的元组。
示例
假设有两个关系:学生(Student)和课程(Course),其模式如下:
学生(Student)
学号 | 姓名 | 年龄 |
---|---|---|
1 | 张三 | 20 |
2 | 李四 | 22 |
3 | 王五 | 21 |
课程(Course)
课程号 | 学号 | 成绩 |
---|---|---|
101 | 1 | 90 |
102 | 2 | 85 |
103 | 1 | 88 |
选择(Selection)
σ年龄 > 20(学生)
结果:
学号 | 姓名 | 年龄 |
---|---|---|
2 | 李四 | 22 |
3 | 王五 | 21 |
投影(Projection)
π姓名, 年龄(学生)
结果:
姓名 | 年龄 |
---|---|
张三 | 20 |
李四 | 22 |
王五 | 21 |
自然连接(Natural Join)
学生 ⨝ 课程
结果:
学号 | 姓名 | 年龄 | 课程号 | 成绩 |
---|---|---|---|---|
1 | 张三 | 20 | 101 | 90 |
1 | 张三 | 20 | 103 | 88 |
2 | 李四 | 22 | 102 | 85 |
关系代数为数据库查询提供了一个强大且灵活的工具集,通过组合这些基本操作,可以构建复杂的查询以满足各种数据检索需求。