SQL Server实例教程(2008版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 关系数据库

关系数据库是当前信息管理系统中最常用的数据库,关系数据库采用关系模式,应用关系代数的方法来处理数据库中的数据。本节主要介绍关系模型、关系数据理论与关系数据库标准语言。

1.2.1 关系模型

关系模型由三部分组成:数据结构、关系操作、关系的完整性。在介绍三个组成部分之前,先来了解关系模型的基本术语。

1.关系模型的基本术语

(1)关系模型:用二维表格结构来表示实体及实体间联系的模型称为“关系模型”(Relational Model)。

(2)属性和值域:在二维表中的列(字段、数据项)称为属性(Attribute),列值称为属性值,属性值的取值范围称为值域(Domain)。

(3)关系模式:在二维表格中,行定义(记录的型)称为关系模式(Relation Schema)。

(4)元组与关系:在二维表中的行(记录的值),称为元组(Tuple),元组的集合称为关系,关系模式通常也称为关系。

(5)关键字或码:在关系的属性中,能够用来唯一标识元组的属性(或属性组合)称为关键字或码(Key)。关系中的元组由关键字的值来唯一确定,并且关键字不能为空。例如,学生表中的学号就是关键字。

(6)候选关键字或候选码:如果一个关系中,存在着多个属性(或属性的组合)都能用来唯一标识该关系的元组,这些属性或属性的组合都称为该关系的候选关键字或候选码(Candidate Key)。

(7)主关键字或主码:在一个关系中的若干候选码中指定为关键字的属性(或属性组合)称为该关系的主关键码(Primary Key)或主码。

(8)非主属性或非码属性:关系中不组成码的属性均为非主属性或非码属性(Non Primary Attribute)。

(9)外部关键字或外键:当关系中的某个属性或属性组合虽不是该关系的关键字或只是关键字的一部分,但却是另一个关系的关键字时,称该属性或属性组合为这个关系的外部关键字或外键(Foreign Key)。

(10)从表与主表:是指以外键相关联的两个表,以外键为主键的表称为主表(主键表),外键所在的表称为从表(外键表)。例如,学生(学号,姓名,出生日期,入学时间,系)与选课(学号,课程号,成绩)两个表,对于“选课”表,学号是外键,对于“学生”表,学号是主键。“学生”表为主表,“选课”表为从表。

2.关系模型的数据结构

关系模型的数据结构是一种二维表格结构,在关系模型中现实世界的实体与实体之间的联系均用二维表格来表示。如表1.1所示。

表1.1 关系模型数据结构

3.关系操作

关系模型中给出了关系操作的能力与特点。关系操作的特点是集合操作,即操作的对象和结果都是集合,这种操作称为一次一个集合的方式。关系操作的能力有选择操作(Select)、投影(Project)、连接(Join)、除(Divide)、并(Union)、交(Intersection)、差(Difference)等查询(Query)操作和插入(Insert)、删除(Delete)、修改(Update)操作。

(1)数据查询。数据查询是将数据从关系数据库中取出并放入指定内存,放入指定内存的数据可以来自于一个关系,也可以来自于多个关系。

(2)数据插入。数据插入是数据添加到指定关系中,形成关系中的元组。

(3)数据删除。数据删除的基本单位是一个关系中的元组,是将指定关系中的指定元组删除。

(4)数据修改。数据修改是在一个关系中修改指定的元组的指定属性。数据修改包含删除需要修改的元组和插入修改后的元组两部分操作。

关系操作的能力可以用关系代数来表示。关系代数是一种抽象的查询语言,这些抽象的语言与具体的DBMS中实现语言并不完全一致。

4.关系模型的数据完整性

数据完整性是指关系模型中数据的正确性与一致性。关系模型允许定义的完整性约束有:实体完整性、域完整性、参照完整性和用户自定义的完整性约束。关系型数据库系统提供了对实体完整性、域完整性和参照完整性约束的自动支持,也就是在插入、修改、删除操作时,数据库系统自动保证数据的正确性与一致性。

(1)实体完整性规则(Entity Integrity Rule)

这条规则要求关系中的元组在组成主键的属性上不能为空。例如,学生表中的学号属性不能为空。

(2)域完整性规则(Domain Integrity Rule)

这条规则要求表中列的数据必须具有正确的数据类型、格式以及有效的数据范围。例如,选课表中的成绩列的数值不能小于0,也不能大于100。

(3)参照完整性规则(Reference Integrity Rule)

这条规则要求不能引用不存在的元组。例如,在学生选课表中的学号列不能引用学生表中没有的学号。

(4)用户定义的完整性规则

用户自定义的完整性规则是应用领域需要遵守的约束条件,体现了具体应用领域的语义约束。

1.2.2 关系数据库中的基本运算

1.SQL语言简介

SQL(Structured Query Language)语言是关系数据库的标准语言,它提供了数据查询、数据定义和数据控制功能。

(1)SQL的数据定义功能。SQL的数据定义功能包括三部分,SQL的数据定义功能可以用于定义和修改模式(如基本表)、定义外模式(如视图)和内模式(如索引)。

① SQL定义基本表的语句有:

CREATE TABLE 创建表

DROP TABLE 删除表

ALTER TABLE 修改表

② SQL定义视图的语句有:

CREATE VIEW 创建视图

DROP VIEW 删除视图

③ SQL定义索引的语句有:

CREATE INDEX 创建索引

DROP INDEX 删除索引

(2)SQL的数据查询功能。SQL的数据查询功能非常强大,它主要是通过SELECT语句来实现的。SQL可以实现简单查询、连接查询、嵌套查询和视图查询等。

(3)SQL的数据更新功能。SQL的数据更新功能主要包括:INSERT,DELETE,UPDATE三条语句。

(4)SQL的访问控制功能。SQL的数据控制功能是指控制用户对数据的操作权力。某个用户对数据库的操作权力是由数据库管理员来决定和分配的,数据库访问控制功能保证这些安全政策的正确执行。SQL通过授权语句GRANT和回收语句REVOKE来实现数据控制功能。

(5)SQL嵌入式使用方式。SQL具有两种使用方式,既可以作为独立的语言在终端交互方式下使用,又可以将SQL语句嵌入在某种高级语言(如C,C++,Java等)之中使用。嵌入SQL的高级语言称为主语言或宿主语言。

2.关系数据库中的基本运算

在关系中访问所需的数据时,需要对关系进行一定的关系运算。关系数据库主要支持选择、投影和连接关系运算,它们源于关系代数中并、交、差、选择、投影和连接等运算。

(1)选择。从一个表中找出满足指定条件的记录行形成一个新表的操作称为选择。选择是从行的角度进行运算得到新的表,新表的关系模式不变,其记录是原表的一个子集。

【例1.1】从“学生”表中查询2006年入学学生的信息。即从表1.1所示的表中筛选出入学时间为“2006-9-18”的记录,SQL语句如下:

        SELECT *
        FROM  学生
        WHERE入学时间='2006-9-18'

其结果如表1.2所示。

表1.22006年入学学生信息表

(2)投影。从一个表中找出若干字段形成一个新表的操作称为投影。投影是从列的角度进行的运算,通过对表中的字段进行选择或重组,得到新的表。新表的关系模式所包含的字段个数一般比原表少,或者字段的排列顺序与原表不同,其内容是原表的一个子集。

【例1.2】从“学生”表中查询出学生的学号、姓名和所在系部信息。即从表1.1所示的表中选出学生的“学号”、“姓名”和“系部名称”信息,SQL语句如下:

        SELECT学号,姓名,系部名称
        FROM  学生

其结果如表1.3所示。

表1.3 学生学号、姓名、系部名称表

(3)连接。选择和投影都是对单表进行的运算。在通常情况下,需要从两个表中选择满足条件的记录。连接就是这样的运算方式,它是将两个表中的记录按一定的条件横向结合,形成一个新的表。

连接分为多种类型,自然连接是常用的连接,理解自然连接的基础是交叉连接。

① 交叉连接。交叉连接是将两个表不加约束的连接在一起,连接产生的结果集的记录为两个表中记录的交叉乘积,结果集的列为两个表列的和。

表1.4 系部表

【例1.3】设有“系部”表,如表1.4所示。交叉连接“学生”表和“系部”表。SQL语句如下:

        SELECT *
        FROM  学生CROSS JOIN  系部

其结果如表1.5所示。

表1.5 【例1.3】运算结果

从结果集可以看出,交叉连接产生的结果集没有实际应用的意义。一般用它来帮助理解其他连接查询。

② 自然连接。当两个表中有相同的字段时,可以使用自然连接将字段值相等的记录连接起来,并且去掉重复字段形成新表中的记录。

【例1.4】自然连接“学生”表和“系部”表。SQL语句如下:

        SELECT学号,姓名,性别,出生日期,入学时间,系部.系部名称,系主任
        FROM  学生JOIN  系部
        ON学生.系部名称= 系部.系部名称

其结果如表1.6所示。

表1.6 【例1.4】运算结果

1.2.3 关系数据理论

前面讨论了数据库系统的一些基本概念、关系模型的三个部分以及关系数据库的标准语言。那么,针对一个具体数据库应用问题,应该构造几个关系模式,每个关系由那些属性组成,即如何构造适合于它的数据模式,这是关系数据库逻辑设计的问题。为了使数据库设计的方法走向规范,1971年E.F.Codd提出了规范化理论,目前规范化理论的研究已经取得了很多的成果。关系数据理论就是指导产生一个具有确定的、好的数据库模式的理论体系。

1.问题的提出

首先来看不规范设计的关系模式所存在的问题。

例如,给出一组如下关系实例:

学生关系:学生(学号,姓名,性别,出生日期,入学时间,系)

课程关系:课程(课程号,课程名,学时数)

选课关系:选课(学号,课程号,成绩)

可能有以下两种数据模式:

① 只有一个关系模式:

学生—选课—课程(学号,姓名,性别,出生日期,入学时间,系,课程号,课程名,学时数,成绩)

② 用三个关系模式:学生,课程,选课。

比较这两种设计方案。

第一种设计可能有下述问题。

• 数据冗余:如果学生选多门课程时,则每选一门课程就必须存储一次学生信息的细节,当一门课程被多个同学选学时,也必须多次存储课程的细节,这样就有很多的数据冗余。

• 修改异常:由于数据冗余,当修改某些数据项(例如“姓名”)时,可能有一部分有关元组被修改,而另一部分元组却没有被修改。

• 插入异常:当需要增加一门新课程,而这门课程还没有被学生选学时,则该课程不能进入数据库中。因为在学生—选课—课程关系模式中,(学号,课程号)是主键,此时学号为空,数据库系统会根据实体完整性约束规则拒绝该元组的插入。

• 删除异常:如果某个学生的选课记录都被删除了,那么,此学生的细节信息也一起被删除了,这样就无法找到这个学生的信息了。

第二种设计方案不存在上述问题。

数据冗余消除了,插入、删除、修改异常消除了。即使学生没选任何课程,学生的细节信息也仍然保存在学生关系中;即使课程没有被任何学生选学,课程的细节信息也仍然保存在课程关系中。解决了冗余及操作异常问题,又出来了另外一些问题,如果要查找选修语文课程的学生姓名,则需要进行三个关系的连接操作,这样代价很高。相比之下,学生—选课—课程关系直接投影、选择就可以完成,代价较低。

如何找到一个好的数据库模式?如何判断是否消除了上述四种问题?这就是关系数据理论研究的问题。关系数据理论主要包括三个方面的内容:数据依赖,范式,模式设计方法,其中数据依赖起核心作用。

2.数据依赖

现实世界随着时间在不断地变化,因而从现实世界经过抽象而得到的关系模式的关系也会有所变化。但是,现实世界的许多已有事实限定了关系模式所有可能的关系必须满足一定的完整性约束条件。这些约束条件通过对属性取值范围的限定反映出来,称之为依赖于值域元素语义的限制,例如,学生出生日期为1986而入学时间也为1986,这显然是不合理的;这些约束条件通过对属性值之间的相互关联(主要体现在值的相等与否)反映出来,这类限制统称为数据依赖,而其中最重要的是函数依赖和多值依赖,它是数据模式设计的关键。关系模式应当刻画出这些完整性约束条件。

(1)函数依赖。函数依赖普遍存在于现实生活中,比如描述一个学生的关系,学生(学号,姓名,系名),由于一个学号只对应一个学生,一个学生只在一个系学习,因而,当学号值确定之后,姓名和该学生所在的系名的值也就唯一地确定了,这样就称“学号”函数决定“姓名”和“系名”,或者说“姓名”和“系名”函数依赖于“学号”,记为:学号→姓名,学号→系名。

函数依赖的定义:设R(U)是属性集U上的关系模式,X与Y是U的子集,若对于R(U)的任意一个当前值r,如果对r中的任意两个元组t和s,都有t[X]≡s[X],就必有t[Y]≡s[Y](即若它们在X上的属性值相等,在Y上的属性值也一定相等),则称“X函数决定Y”或“Y函数依赖与X”,记做:X→Y,并称X为决定因素。

函数依赖和其他数据依赖一样,是语义范畴的概念,只能根据语义来确定一个函数依赖,而不能试图用数学来证明。

(2)函数依赖的分类。关系数据库中函数依赖主要有如下几种:

① 平凡函数依赖和非平凡函数依赖。

设有关系模式R(U),X→Y是R的一个函数依赖。若对任何X、Y∈U,此函数依赖对R的任何一个当前值都成立,则称X→Y是一个平凡函数依赖。

若X→Y,但Y∉X,则称X→Y是非平凡函数依赖,若不特别声明,都是讨论非平凡函数依赖。

② 完全函数依赖和部分函数依赖。

设有关系模式R(U),X→Y是R的一个函数依赖,且对于任何X′∈X,X′→Y都不成立,则称X→Y是一个完全函数依赖。

反之,如果X′→Y成立,则称X→Y是一个部分函数依赖。

③ 传递函数依赖。

设有关系模式R(U),X,Y,Z∈U,如果X→Y,Y→Z,且Y∉X,Y不函数决定X,有X→Z,则Z传递函数依赖于X。

(3)多值依赖。多值依赖普遍存在于现实生活中,比如学校中的某一门课程由多个教师讲授,他们使用同一套参考书,每个教师可以讲授多门课程,每种参考书可以供多门课程使用。关系模式“授课”如表1.7所示。

表1.7 授课表

在关系模型“授课”中,当物理课程增加一名讲课教师{马红}时,必须插入多个元组:{物理,马红,普通物理};{物理,马红,物理习题集}。同样,某一门课程是{数学}要去掉一本参考书{微分方程}时,则必须删除多个元组:{数学,杨靖康,微分方程};{数学,王丽,微分方程}。此表中对数据的修改很不方便,数据的冗余也很明显。仔细考察这个关系模式,发现他们存在着多值依赖,也就是对于一个{物理,普通物理}有一组(教师)值{杨靖康,王丽},这组值仅仅决定于(课程)上的值,而与(参考书)的值没有关系。下面是称为多值依赖的数据依赖的定义:

设R(U)是属性集U上的一个关系模式。X,Y,Z是U的一个子集,并且Z=U−X−Y。当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z的值无关,则关系模式R(U)中多值依赖X→→Y成立。

3.关系模式的规范化

在介绍了关系数据理论的一些基本概念之后,下面讨论如何根据属性间依赖情况来判定关系是否具有某些不合适的性质,按属性间的依赖情况来区分关系规范化的程度为第一范式、第二范式、第三范式和第四范式等,以及如何将具有不合适性质的关系转换为更合适的形式。

关系数据库中的关系要满足一定的要求,满足不同程度要求的为不同范式,满足最低要求的叫第一范式,简称1NF,在第一范式中进一步满足一些要求的为第二范式,其余范式依此类推。

不是1NF的关系都是非规范化关系,满足1NF的关系称为规范化的关系。数据库理论研究的关系都是规范化的关系。1NF是关系数据库的关系模式应满足的最起码的条件。

(1)第一范式。如果关系模式R的每一个属性都是不可分解的,则R为第一范式的模式,记为:R∈1NF模式。

例如有关系:学生1(学号,姓名,性别,出生日期,系名,入学时间,家庭成员)。关系“学生1”不满足第一范式,因为属性(家庭成员)可以再分解为(父亲)、(母亲)等属性。

解决的方法是将“学生1”关系分解为:学生(学号,姓名,性别,出生日期,系名,入学时间);家庭(学号,家庭成员姓名,亲属关系)两个关系。

(2)第二范式。如果关系模式R是第一范式,且每个非码属性都完全函数依赖于码属性,则称R为满足第二范式的模式,记为:R∈2NF模式。

例如有关系:选课1(学号,课程号,系名,出生日期,成绩)。关系“选课1”不满足第二范式,因为属性“成绩”完全依赖于主码(学号,课程号),而属性(系名),(出生日期)只依赖于部分主码(学号),所以,不是每一个非码属性都完全函数依赖于码属性,如图1.5所示。

图1.5 不符合第二范式的函数依赖示例

解决的方法是将“选课1”关系投影分解为:选课(学号,课程号,成绩),学生(学号,姓名,性别,出生日期,系名,入学时间)两个关系模式。

(3)第三范式。如果关系模式R是第二范式,且没有一个非码属性是传递函数依赖于候选码属性,则称R为满足第三范式的模式,记为:R∈3NF模式。

例如有关系:学生2(学号,姓名,性别,出生日期,系名,入学时间,系宿舍楼)。关系“学生2”不满足第三范式,因为属性(系宿舍楼)依赖于主码(学号),但也可以从非码属性(系名)导出,即(系宿舍楼)传递依赖(学号),如图1.6所示。

图1.6 学生2中的函数依赖

解决的方法同样是将关系“学生2”分解为:学生(学号,姓名,性别,出生日期,系名,入学时间);宿舍楼(系名,宿舍楼)两个关系模式。

(4)扩充第三范式。如果关系模式R是第三范式,且每一个决定因素都包含有码,则称R为满足扩充第三范式的模式,记为:R∈BCNF模式。

例如有关系:教学(学生,教师,课程)。每位教师只教一门课。每门课有若干个教师教,学生选定某门课程,就对应一个固定的教师。由语义可得到如图1.7所示的函数依赖。

图1.7 教学中的函数依赖

“教学”关系不属于BCNF模式,因为(教师)是一个决定因素,而(教师)不包含码。

解决的方法是将关系“教学”分解为:学生选教师(学生,教师);教师任课(教师,课程)两个关系模式。

(5)第四范式。如果关系模式R是第一范式,且每个非平凡多值依赖X→→Y(Y∉X),X都含有码,则称R为满足第四范式的模式,记为:R∈4NF模式。

例如有关系:授课(课程,教师,参考书)。每位教师可以上多门课,每门课可以由若干教师讲授,一门课程有多种参考书。在“授课”关系中,课程→→教师,课程→→参考书,它们都是非平凡的多值依赖。而(课程)不是码,关系模式“授课”的码是(课程,教师,参考书),因此关系模式“授课”不属于第四范式。

解决的方法是将“授课”关系分解为:任课(课程,教师);教参(课程,参考书)两个关系。

4.关系规范化小结

关系模式规范化的过程是通过对关系模式的分解,把低一级的关系模式分解为若干个高一级的关系模式,逐步消除数据依赖中的不合理部分,使模式达到某种程度的分离,即“一个关系表示一事或一物”。所以规范化的过程又称为“单一化”。关系规范化的过程如图1.8所示。

图1.8 各种范式及规范化过程