当前位置:网站首页>数据库系统原理与应用教程(011)—— 关系数据库

数据库系统原理与应用教程(011)—— 关系数据库

2022-07-07 10:09:00 睿思达DBA_WGX

数据库系统原理与应用教程(011)—— 关系数据库

关系数据库管理系统是目前应用最广泛的数据库管理系统。比如:Oracle、MySQL、DB2、SQL Server 等。

一、关系的数据结构

1、关系的数学定义

(1)域

域是一组具有相同数据类型的值集合。比如:{男,女}、{党员,团员,群众}、{管理学院,商学院,法学院,艺术学院}、所有学生的学号等。

(2)笛卡尔积

给定一组域 D1,D2,…,Dn,则域 D1,D2,…,Dn 的笛卡尔积为:

D1×D2×…×Dn={(d1,d2,…,dn) | di ∈ Di,i=1,2,…,n}

其中的每一个元素 (d1,d2,…,dn) 称为一个 n 元组,简称元组,元组中的每一个值 di 称为一个分量。

Di 所包含元素的个数称为 Di 的基数,如果 Di 的基数为 mi(i=1,2,…,n),则 D1×D2×…×Dn 的基数为:

在这里插入图片描述

笛卡尔积可以用二维表来表示。表中的一行对应一个元组,表中的一列对应一个域。例如有以下三个域:

D1 = 姓名 = {王平,李丽,张晓刚}

D2 = 性别 = {男,女}

D3 = 年龄 = {19,20}

则 D1、D2、D3 的笛卡尔积为:

D1×D2×D3 = {(王平,男,19),(王平,男,20),(王平,女,19),(王平,女,20),(李丽,男,19),(李丽,男,20),(李丽,女,19),(李丽,女,20),(张晓刚,男,19),(张晓刚,男,20),(张晓刚,女,19),(张晓刚,女,20)}

其中 (李丽,女,20)、(张晓刚,男,19)等是元组,【张晓刚】、【男】、【19】等是分量。D1、D2、D3 的笛卡尔积共有 12 个元组,即笛卡尔积的基数为 12。D1、D2、D3 的笛卡尔积用二维表表示如下:

表1 D1、D2、D3 的笛卡尔积

姓名性别年龄
王平19
王平20
王平19
王平20
李丽19
李丽20
李丽19
李丽20
张晓刚19
张晓刚20
张晓刚19
张晓刚20

(3)关系

域的笛卡尔积所包含的元组是多个域中的元素任意组合得到的,因此有很多元组没有实际意义。从域的笛卡尔积中挑选中有意义的元组构成的集合称为关系。关系表示为:

R(D1,D2,…,Dn

其中:R 为关系的名称。

关系是一张二维表,关系是笛卡尔积的子集。

例如:根据实际情况从 D1×D2×D3 中取出有意义的元组,构造出如下表所示的关系。

表2 学生关系

姓名性别年龄
王平20
李丽20
张晓刚19

2、关系中涉及到的概念

(1)元组

关系中的一行称为一个元组,组成元组的元素称为分量。实体与实体之间的联系均可使用元组表示。例如:表2 中有三个元组,分别对应三个学生实体。

【王平,男,20】是一个元组,它包含三个分量,分别是【王平】、【男】、【20】。

(2)属性

关系中的一列称为一个属性。属性具有型和值,属性的型指属性名和取值范围等,属性的值指属性具体的取值。属性表示实体的特征。表2 中有三个属性,分别为姓名、性别和年龄。

(3)候选码和主码

如果关系中的属性或属性组,其值能够唯一标识一个元组,则该属性或属性组称为候选码(Candidate Key)。当一个关系有多个候选码时,选定其中的一个作为主码(Primary Key),如果一个关系只有一个候选码,则该候选码就是主码。如果一个候选码只包含一个属性,称该候选码为单属性码,如果一个候选码包含多个属性,则称该候选码为多属性码。

如果在表2 的学生关系中添加学号,可以把学号作为主码,如果姓名没有重名的学生,则姓名可以作为候选码。

(4)主属性和非主属性

关系中,候选码所包含的属性称为主属性,不包含在候选码中的属性称为非主属性。例如:学生关系中,学号为主属性,性别和年龄为非主属性。

3、关系的类型

关系数据库中的表分为基本表、查询表和视图表三种类型。

(1)基本表

基本表是关系数据库中实际存在的表,是实际存储数据的逻辑表示。在 MySQL 中,使用 create table 命令创建基本表。

/* create table emp( s_id int primary key, s_name char(20), gender char(2), birth date, phone char(11) ); insert into emp values(1001,'张敏','女','1995-3-4','13782594488'); insert into emp values(1002,'王鹏程','男','1990-12-9','13736776666'); insert into emp values(1003,'刘伟伟','男','1992-10-25','13542857766'); insert into emp values(1004,'王鹏辉','女','1996-8-10','13623569877'); insert into emp values(1005,'刘刚','男','1989-9-14','13025669874'); insert into emp values(1006,'张静静','女','1985-9-20','13203569855'); */
mysql> create table emp(
    ->     s_id int primary key,
    ->     s_name char(20),
    ->     gender char(2),
    ->     birth date,
    ->     phone char(11)
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> insert into emp values(1001,'张敏','女','1995-3-4','13782594488');
Query OK, 1 row affected (0.03 sec)

mysql> insert into emp values(1002,'王鹏程','男','1990-12-9','13736776666');
Query OK, 1 row affected (0.01 sec)

mysql> insert into emp values(1003,'刘伟伟','男','1992-10-25','13542857766');
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values(1004,'王鹏辉','女','1996-8-10','13623569877');
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values(1005,'刘刚','男','1989-9-14','13025669874');
Query OK, 1 row affected (0.00 sec)

mysql> insert into emp values(1006,'张静静','女','1985-9-20','13203569855');
Query OK, 1 row affected (0.01 sec)

mysql> select * from emp;
+------+-----------+--------+------------+-------------+
| s_id | s_name    | gender | birth      | phone       |
+------+-----------+--------+------------+-------------+
| 1001 | 张敏      || 1995-03-04 | 13782594488 |
| 1002 | 王鹏程    || 1990-12-09 | 13736776666 |
| 1003 | 刘伟伟    || 1992-10-25 | 13542857766 |
| 1004 | 王鹏辉    || 1996-08-10 | 13623569877 |
| 1005 | 刘刚      || 1989-09-14 | 13025669874 |
| 1006 | 张静静    || 1985-09-20 | 13203569855 |
+------+-----------+--------+------------+-------------+
6 rows in set (0.00 sec)

(2)查询表

查询表是指查询结果或查询中生成的临时表。查询表中的数据来源于基本表。

/* select s_id, s_name, phone from emp where gender='女'; */

mysql> select s_id, s_name, phone 
    -> from emp 
    -> where gender='女';
+------+-----------+-------------+
| s_id | s_name    | phone       |
+------+-----------+-------------+
| 1001 | 张敏      | 13782594488 |
| 1004 | 王鹏辉    | 13623569877 |
| 1006 | 张静静    | 13203569855 |
+------+-----------+-------------+
3 rows in set (0.01 sec)

(3)视图表

视图表是由基本表或其他视图表导出的表。视图表是一个虚拟的表,视图定义在数据库中,通过视图看到的数据是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。

当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也自动地反映到视图中。

从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据。从数据库系统内部来看,一个视图是由SELECT语句组成的查询定义的虚拟表。从数据库系统内部来看,视图是由一张或多张表中的数据组成的,从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作都可以应用于视图,例如查询,插入,修改,删除操作等。

/* create view v_1 as select s_id, s_name, phone from emp where gender='女'; */
mysql> create view v_1
    -> as
    -> select s_id, s_name, phone 
    -> from emp 
    -> where gender='女';
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| emp            |
| v_1            |
+----------------+
2 rows in set (0.00 sec)

mysql> select * from v_1;
+------+-----------+-------------+
| s_id | s_name    | phone       |
+------+-----------+-------------+
| 1001 | 张敏      | 13782594488 |
| 1004 | 王鹏辉    | 13623569877 |
| 1006 | 张静静    | 13203569855 |
+------+-----------+-------------+
3 rows in set (0.00 sec)

4、基本关系的性质

关系是一张二维表,但二维表不一定是关系。一张二维表只有满足关系的基本性质,才是一个关系。关系的性质如下:

(1)同一个属性的数据具有同质性

所谓同质性是指一个属性数据类型相同、取值范围相同。

(2)关系中的属性名不能重复

在关系中,属性是通过属性名加以区分的,因此属性名不能重复。不同关系的属性可以相同,比如学生表中有姓名属性,教师表中也可以有姓名属性。

(3)关系中的元组不能重复

一个关系中不能重现两个完全相同的元组。这是因为在关系中通过元组来表示实体,如果出现重复的元组就意味着一个实体的信息被重复保存。因此,一个关系中不能出现重复的元组,保证实体的唯一性。

(4)关系中的元组具有顺序无关性

关系中元组的顺序可以任意交换,因此,为了方便查看数据,可以对数据进行任意的排序。

(5)关系中的属性具有顺序无关性

关系中列的次序可以任意交换,如果两个关系属性的数量和性质相同,只是属性的排列顺序不同,则这两个关系的结构是相同的。

(6)关系中每一个分量都必须是不可分的

关系的规范化要求关系模式必须满足一定的条件,其中最基本的一条就是关系的每一个分量必须是不可分的数据项。例如,员工关系的电话可分为家庭电话和办公电话就不满足关系规范化的基本要求。如表3 所示。

在这里插入图片描述

对于表3中的属性电话,可以直接分解为办公电话和家庭电话两个属性。如表4 所示。

在这里插入图片描述

5、关系模式

关系模式是对关系的描述。关系模式可以表示为:

R(U,D,Dom,F)

其中:

R:关系名
U:属性的集合
D:属性的域
Dom:属性到域的映像的集合
F:数据的依赖关系的集合

关系模式可以简化表示为:R(U)或 R(A1,A2,…,An

其中:R 为关系名,A1,A2,…,An 为属性名。

6、关系数据库

基于关系模型的数据库称为关系数据库。在关系数据库中,实体与实体之间的联系都是用关系来表示的。其中,一个关系对应一个实体集,关系中的一行对应一个实体,关系中的一列对应实体的一个属性。

二、关系操作

1、关系操作的基本内容

关系操作包括数据查询、数据维护和数据控制。数据查询包括数据检索、统计、排序、分组;数据维护包括数据的增加、删除和修改;数据控制是为保证数据的安全性和完整性而采取的数据存取控制及并发控制等功能。关系操作可以使用关系代数中的并、交、差、选择、投影、笛卡尔积、连接、除共八种操作来表示。其中并、差、选择、投影和笛卡尔积为关系的五种基本运算。

2、关系操作的特点

(1)关系操作语言一体化:关系操作语言常用的为 SQL(Structural Query Language)语言,具有数据定义、查询、更新和控制一体化的特点。关系操作语言既可以作为宿主语言嵌入到主语言中,又可以作为独立语言使用。关系操作语言的这些特点使得关系操作语言容易学习、使用方便。

(2)关系操作的方式是集合操作:关系操作的初始数据、中间数据和结果数据都是元组的集合。

(3)关系操作语言是高度非过程化的语言:用户使用关系操作语言时,只需要指出做什么,而不需要指出怎么做,数据存取路径的选择、数据操作方法的选择和优化都由 DBMS 自动完成。关系操作语言的这种高度非过程化的特点使得关系数据库管理系统的使用变得非常简单。

三、关系的完整性

关系模型的完整性是对关系中的数据进行限制和约束。关系模型支持三类完整性约束:实体完整性、参照完整性和用户自定义的完整性。其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,由 DBMS 自动支持。用户自定义完整性是指完整性规则由用户根据需要自行定义。

1、实体完整性

实体完整性规则:如果属性 A 是关系 R 的主属性,则属性 A 的值不能为空值。

(1)实体完整性保证了实体的唯一性。在关系中以码作为实体或联系的标识,主属性不能为空就能保证实体或联系的唯一性。

(2)实体完整性能够保证实体的可区分性。空值用 NULL 表示,如果主属性为空,则说明存在某个不可标识的实体。例如:学生表的学号是主属性,则学号不能为空值。

/* create table dept( dept_id int primary key, dept_name char(20), phone char(20) ); */
mysql> create table dept(
    ->     dept_id int primary key,  -- 定义 dept_id 为主码
    ->     dept_name char(20),
    ->     phone char(20)
    -> );
Query OK, 0 rows affected (0.01 sec)

-- 插入数据
-- 主码不为空,插入成功
mysql> insert into dept values(11,'管理系','3040255');
Query OK, 1 row affected (0.00 sec)

-- 主码为空,插入失败
mysql> insert into dept values(null,'经济系','3040266');
ERROR 1048 (23000): Column 'dept_id' cannot be null

-- 插入重复的主码值,插入失败
mysql> insert into dept values(11,'经济系','3040266');
ERROR 1062 (23000): Duplicate entry '11' for key 'PRIMARY'

2、参照完整性

(1)关系中联系的表示方法

在关系数据库中,实体集是用关系表示的。实体之间联系的表示方法如下:

(A)一对一联系:把其中一个关系的主码添加到另一个关系即可以表示两个关系的一对一联系。例如:学院和院长两个关系具有一对一联系,可以把【学院】表的主码【学院编号】添加到【院长】表,也可以把【院长】表的主码【院长编号】添加到【学院】表,如下表所示。

在这里插入图片描述

(B)一对多联系:首先确定哪个关系是【一】、哪个关系是【多】,例如:班级和学生两个关系具有一对多联系,则班级表为一对多联系的【一】方,又称为【父表】,学生表为一对多连接的【多】方,又称为【子表】。要表示一对多联系,需要把父表的主码添加到子表中,即把父表【班级】表的【班级编号】添加子表【学生】中,学生表中的【班级编号】称为学生表的【外码】。如下表所示。

在这里插入图片描述

(C)多对多联系:关系数据库不能直接表示多对多联系。要表示多对多联系,需要增加一张新表,把具有多对多联系的表中的主码都加入到新表中。例如:学生表和课程表具有多对多联系,则新建一个选修表,把学生的学号和课程的课程编号都加入到选修表中。则选修中包含两个外码:学号,课程编号。如下表所示。

在这里插入图片描述

(2)参照完整性规则

把具有一对多联系的父表的主码添加子表,称为外码。一对一联系可以看作是一对多联系的特殊情况,而多对多联系最终转换为了多个一对多联系。因此,我们可以重点研究一对多联系。对于两个具有一对多联系的关系而言,外码在子表中,父表称为被参照关系,子表称为参照关系。

参照完整性规则:参照完整性规则用于限制子表中外码的取值,对于子表中外码的取值可以为空值或者等于父表中的某个主码的值。例如学生表中的班级属性的取值,要么为空,要么从班级表中的班级编号中选择。

/* create table class( class_id char(5) primary key, class_name char(20) ); create table stu( stu_id char(11) primary key, stu_name char(20), gender char(2), phone char(11), class_id char(5), foreign key(class_id) references class(class_id) ); */

mysql> create table class(
    ->     class_id char(5) primary key,
    ->     class_name char(20)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> create table stu(
    ->     stu_id char(11) primary key,
    ->     stu_name char(20),
    ->     gender char(2),
    ->     phone char(11),
    ->     class_id char(5),
    ->     foreign key(class_id) references class(class_id)  --定义外码
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> insert into class values('C0001','物流201班'),('C0002','物流202班'),('C0003','物流203班');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from class;
+----------+--------------+
| class_id | class_name   |
+----------+--------------+
| C0001    | 物流201|
| C0002    | 物流202|
| C0003    | 物流203|
+----------+--------------+
3 rows in set (0.00 sec)

-- 在 stu 表中插入数据
-- class_id 为空值,插入成功
mysql> insert into stu values('20200224101','张涛','男','15937321588',null);
Query OK, 1 row affected (0.01 sec)

-- class_id 从 class 表中选择,插入成功
mysql> insert into stu values('20200224102','张静','女','13637321588','C0001');
Query OK, 1 row affected (0.01 sec)

-- class_id 插入一个 class 表中不存在的值,插入失败
mysql> insert into stu values('20200224103','李华','女','13688332525','C0004');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`mydb`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`cl ass_id`))

3、用户自定义完整性

用户自定义的完整性就是针对某一具体应用所定义的约束条件。实体完整性和参照完整性是由 DBMS 自动保证的。用户自定义完整性的数据约束规则是根据实际需求由用户定义。例如根据成绩管理的要求,学生的成绩在 0 到 100 之间。

原网站

版权声明
本文为[睿思达DBA_WGX]所创,转载请带上原文链接,感谢
https://wanggx.blog.csdn.net/article/details/125639385