理论教育 SQL声明和关系数据库中的关键字段

SQL声明和关系数据库中的关键字段

时间:2023-08-18 理论教育 版权反馈
【摘要】:SQL声明被用来交互式查询来自一个关系数据库的信息和为报告聚集数据。一个关系数据库是包含进入预先定义的种类之内的一组表格。表格中的每一行在关系中称为一个元组,即表格中栏目名下的行。表1.2 学生基本情况表对于关系中的每个元组来说,主关键字必须具有一个唯一的值,记住这一点很重要,它意味着这个主关键字不能为空值。在关系数据库中,这种用来联系两个数据表的字段称为关键字段。

SQL声明和关系数据库中的关键字段

关系数据库(relational database)是一个被组织成一组正式描述的表格的数据项的收集,这些表格中的数据能以许多不同的方式被存取或重新召集而不需要重新组织数据库表格。1970年美国IBM公司San Jose研究室的E. F. Codd首次提出了数据库系统的关系模型,开创了数据库关系方法和关系数据理论的研究,为数据库技术奠定了理论基础。

标准用户和应用程序到一个关系数据库的接口是结构化查询语言(SQL)。SQL声明被用来交互式查询来自一个关系数据库的信息和为报告聚集数据。

除了相对地容易创建和存取之外,关系数据库具有容易扩充的重要优势。在最初的数据库创造之后,一个新的数据种类能被添加而不需要修改所有的现有应用软件。

一个关系数据库是包含进入预先定义的种类之内的一组表格。每个表格(有时被称为一个关系)包含用列表示的一个或更多的数据种类。每行包含一个唯一的数据实体,这些数据是被列定义的种类。举例来说,典型的商业订单条目数据库会包括一个用列表示的描述一个客户信息的表格: 名字、住址、电话号码,等等。另外的一个表格会描述一个订单: 产品、客户、日期、销售价格,等等。

1.2.1 关系的定义

关系是建立在数学集合代数概念基础上的。通常把一个没有重复行和重复列的二维表格看成一个关系。例如下面的学生基本情况表就是一个关系。每个表有一个名字,即表名。表格中的每一行在关系中称为一个元组(对应数据库中的记录),即表格中栏目名下的行。如姓名为“李川川”所在行的所有数据就是一个元组。

表格中的每一列在关系中称为一个属性,每个属性都要有一个属性名(对应数据库中的字段名),它对应表格中的栏目名。如“学号”、“姓名”等都是属性。属性的取值范围称为域。

记录中的一个字段的取值,称为字段值或分量。记录值随着每一行记录的不同而变化。

为了在关系中区分不同的元组,若表中的某单个或属性组的值能唯一地确定一个元组则称该属性组为候选关键字。并且,一个候选关键字必须包含使得它能够在整个关系中是唯一的所必需的最小属性数。若一个关系有多个候选关键字,则选定其中一个作为主关键字。如果一个关键字只能用一个单一的属性,则称为单一关键字; 如果是用两个或多个属性,则称为组合关键字。例如,在表1.2中,由于“学号”是唯一的,可以把它作为单一关键字,而“姓名”、“出生日期”由于存在重名情况,不可作为单关键字,则可把“姓名”和“出生日期”合起来作为组合关键字。包含在主关键字中的各属性称为主属性,不包含在主关键字中的属性称为非主属性。

表1.2 学生基本情况表

对于关系中的每个元组来说,主关键字必须具有一个唯一的值,记住这一点很重要,它意味着这个主关键字不能为空值。

现实世界中由于存在同名现象,如姓名、单位名等,为此人们普遍采用在原来关系中增加一个编号属性,如身份证号、学号,依次来确保唯一性。

关系与关系之间也存在着联系,这种联系采用关键字来联系。如表1.3、表1.4就与表1.2存在着联系。

在多个关系中,若某属性或属性组不是当前关系的关键字,但它是另一个关系的关键字,则称这个属性或者属性组是另一个关系的外部关键字。关系数据库中的各个关系模式,就是通过主关键字与外部关键字相互联系的。例如,在表1.4学生成绩关系中,学号是表1.2关系的外部关键字,课程编号是表1.3课程关系的外部关键字。

表1.3 课程表

表1.4 学生成绩表

表与表之间的关系实际就是按照某一关键字(主关键字和外部关键字),一个表中记录与另一个表中记录之间的关系。根据一个表中记录与另一个表中记录之间的对应数量关系,分为一对一关系、一对多(或多对一)关系、多对多关系。对我们有用的是一对多关系,一对一关系可以看成是一对多关系的特例,而多对多关系必须转换为一对多关系。

在关系数据库中,这种用来联系两个数据表的字段称为关键字段。关键字段在两个表中的地位是不同的。在“一”表中,关键字段称为原始关键字段。这里所谓的“一”表,指的是在一对多(或多对一)关系中分离出来的对应“一”的那个表,例如表1.2、表1.3。相应的“多”表,则是指“一”表的原始关键字对应的多条记录的表,例如表1.4。关键字段在“多”表中称为外部关键字段。

原始关键字段的记录不允许重复,是唯一的。原始关键字段的值不能取空值,这就是关系模型的实体完整性。例如表1.2中的学号就不允许有两个学生相同,当然学号也不能取空值。原始关键字段的值也不允许随意改变,若改变了就会与“多”表中的记录联系不上,或者做出错误联系。若一定要改变,必须“一”和“多”中的记录同时改变,而且不能与已有的记录重复。

在“多”表中,外部关键字段的记录可以重复,但要求外部关键字段的值在“一”表中一定存在。不然这种记录就会在“一”中找不到对应记录,而变成一个无用的孤记录。即被参照的表中一定存在这样的记录,它的主关键字段的值等于参照表中的外部字段值,这就是参照完整性。

1.2.2 关系模式

对关系的描述称为关系模式。它包括关系名,组成该关系的各属性名,属性向域的映像,属性之间数据的依赖关系等。属性向域的映像常常直接说明为属性的类型、长度

某一时刻相应某个关系模式的内容称为相应模式的状态,它是元组的集合,称为关系。

关系模式是稳定的,而关系是随时间不断变化的,因为关系模式中的数据在不断更新。但是,现实世界的许多已有事实限定了关系模式所有可能的关系必须满足一定的完整约束条件。这些约束或者通过对属性取值范围的限定,例如职工年龄小于65岁(65岁之后必须退休),或者通过属性值间的相互关联(主要体现于值的相等与否)反映出来。关系模式应当刻画出这些完整性约束条件。

关系是关系模式在某一时刻的状态或内容。关系模式是静态的、稳定的,而关系是动态的、随时间不断变化的,因为关系操作在不断地更新着数据库中的数据。但在实际当中,人们常常把关系模式和关系都称为关系,这不难从上下文中加以区别。

1.2.3 关系操作

对关系实施的各种操作,包括选择、投影、连接、并、交、差、增、删、改等,这些关系操作可以用代数运算的方式表示,其特点是集合操作。

关系模型中常用的关系操作有两类: 一类是查询操作,是数据库应用的主要内容,是各种操作的基础,它包括选择(Select)、投影(Project)、连接(Join)、除(Divide)、并(Union)、交(Intersection)、差(Difference)和笛卡儿积(Cartesianproduct)等; 另一类是更新操作,是对数据库中的数据做增添新记录,删除和作废错误记录、修改变化了的记录等数据维护操作,简称为增、删、改操作。

表达(或描述)关系操作的关系数据语言可以分为以下三类。

(1)关系代数语言(简称关系代数)

关系代数是用对关系的运算来表达查询要求的方式,如ISBL(Information System Base Language)。

(2)关系演算语言(简称关系演算)

关系演算使用谓语动词来表达查询要求的方式。关系演算又可以按照谓词变元的基本对象是元组变量还是域变量分为元组关系演算和域关系演算。元组演算语言的典型代表是QUEL,域关系演算语言的典型代表是QBE(Query By Example)语言。关系代数、元组关系演算和域关系演算三种语言在表达能力上是完全等价的。

关系代数、元组关系演算和域关系演算均是抽象的查询语言,这些抽象的语言与具体的DBMS中实现的实际语言并不完全一样。但它们能用作评估实际系统中查询语言能力的标准或基础。

(3)具有关系代数和关系演算双重特点的语言

如SQL语言(Standard Query Language)。目前的计算机运营商提供给用户的关系数据库系统的关系数据语言是更加高级、更加方便的实际语言,除了提供上述语言的功能外,还提供了许多附加功能: 如SQL不仅具有丰富的查询功能,而且具有数据定义和数据控制功能,是集查询、数据定义(DDL)、数据操纵(DML)和数据控制(DCL)于一体的关系数据语言。SQL是关系数据库的标准语言。

1.2.4 关系代数

关系代数是一种抽象的查询语言,用对关系的运算来表达查询。关系代数又是一种代数的符号,其中的查询是通过向关系附加特定的操作符来表示的。作为研究关系数据语言的数学工具,关系代数的运算对象是关系,运算结果也为关系。关系代数用到的运算符包括四类: 集合运算符、专门的关系运算符、算术比较符和逻辑运算符,比较运算符和逻辑运算符是用来辅助专门的关系运算符进行操作的,关系代数的运算主要分为传统的集合运算和专门的关系运算两类。

1. 传统的集合运算

传统的集合运算是二目运算,包括并、交、差和广义笛卡儿积四种运算。设关系R和关系S具有相同的目n(即两个关系都有n个属性),并且相应的属性取自同一个域。

(1)并

关系R与关系S的并(Union)由属于W或属于Y的所有元组组成。记作:

其结果关系仍为n目关系。

(2)差

关系R与关系S的差(Difference)由属于R而不属于S的所有元组组成。记作:

其结果关系仍为n目关系。

(3)交

关系R与关系S的交(Intersection)由既属于R又属于S的所有元组组成。记作:

其结果关系仍为n目关系。

(4)广义笛卡儿积

两个分别为n目和m目的关系R和S的广义笛卡儿积是一个(n+m)列的元组的集合。元组的前n列是关系R的一个元组,后m列是关系S的一个元组。若R有k1个元组,S有k2个元组,则关系R和关系S的广义笛卡儿积有k1×k2个元组。记作:

R×S={(r1,…,rn,s1,…,sm) (r1,…,rn)∈R∧(s1,…,sm)∈S}

例: 假定现有两个关系R和S是关系学生的实例,R和S的当前关系实例如表1.5和表1.6所示。

表1.5 关系R学生表

表1.6 关系S学生表

并集R∪S如表1.7所示。

表1.7 R∪S学生表

交集R∩S如表1.8所示。

表1.8 R∩S学生表

由于R和S只有一个相同的元组,所以R∩S只含有2009020301“李川川”这一个学生信息的元组。

进行差值计算时,由于学号为2009020301的元组既出现在R中又出现在S中,而学号为2009020523、2009020312和2009021108这三个元组只出现在R中,不出现在S中,所以差集R—S中只包含这三个元组,如表1.9所示。

表1.9 R—S学生表

下面用简单的例子和图表来说明广义笛卡儿积的含义,假设关系R有两个属性,分别是A和B; 关系S有三个属性,分别是B、C和D。R的当前实例有两个元组,S的当前实例有三个元组,如表1.10和表1.11所示。

表1.10 笛卡儿积关系R

表1.11 笛卡儿积关系S

那么在关系R×S中,关系模式应该有5个属性: A、R·B、S·B、C和D,R×S有6个元组,如表1.12所示。

表1.12 笛卡儿积关系R×S

2. 专门的关系运算

专门的关系运算包括选择、投影、连接、除等。

(1)选择

选择运算(Selection)是在关系中选择满足某种条件的元组。其中的条件是以逻辑表达式给出的,使得逻辑表达式的值为真的元组将被选取。这是从行的角度进行的运算,即水平方向抽取元组。经过选择运算得到的结果元组可以形成新的关系,其关系模式不变,但其中元组的数目小于等于原来的关系中元组的个数,它是原关系的一个子集。

设关系R为n元关系,则R关系的选择操作记作:

σF(R) ={tt∈R∧F(t)='真'}

其中F表示选择条件,它是一个逻辑表达式,取逻辑值“真”或者“假”。

逻辑表达式F的基本形式为:

X1θY1[φX2θY2…]

其中θ表示比较运算符,它可以是>,≥,<,≤,=或≠; X1,Y1等是属性名、常量或简单函数,属性名也可以用它的序号(1,2…)来代替; Ф表示逻辑运算符,它可以是﹁,∧或∨; [ ]表示任选项,即[ ]中的部分可以要也可以不要; …表示上述格式可以重复下去。因此,选择运算实际上是从关系R中选取使逻辑表达式F为真的元组。这是从行的角度进行的运算。

举例说明该运算,如表1.2学生基本情况表,设该表为S,试找出满足条件性别=“女”的元组集。选择条件为: 性别=“女”,用关系代数表示为

σ性别='女'(S)(www.daowen.com)

结果如表1.13所示。

表1.13 选择后的学生信息表

(2)投影

投影运算(Projection)是从关系中挑选出若干属性组成新的关系。这是从列的角度进行的运算,相当于对关系进行垂直分解。经过投影运算可以得到一个新关系,其关系模式所包含的属性个数在大多数情况下比原关系少,或者属性的排列顺序不同。因此,投影运算提供了垂直调整关系的手段。如果新关系中包含重复元组,则要删除重复元组。

设关系R为n元关系,则R关系的投影操作记作:

其中A为R的属性列。

依然以表1.2为例,如果要列出所有学生的学号、姓名和性别,关系代数表示为:

结果如表1.14所示。

表1.14 投影运算学生信息表

(3)自然连接

连接(Join)是从两个关系的笛卡儿积中选取属性间满足一定条件的元组。两个关系R和S的自然连接(Naturaljoin),记作,得到一个新的关系,其关系模式是R和S模式的并集。所拥有的元组是这样产生的: 假设A1,A2,…,An是R和S模式中的公共属性,那么如果R的元组r和S的元组s在这些属性上取值都相同,r和s连接而成的元组就归入中。

对于表1.10和表1.11中的两个关系R和S,其自然连接应该如表1.15所示。

表1.15 关系R与S的自然连接

R和S只有一个公共属性: B。关系R的第1个元组与关系S的第2个元组在属性B上的取值均为l,因此将它们组合得到的新元组(a,l,x,y)归入中; 关系R的第2个元组和关系S的第3个元组在属性B上的取值均为n,因此也将它们组合而成的新元组(b,n,p,x)归入中。

注意: 只有两个关系的元组在所有公共属性上取值都相同,才可以将它们的组合放入两个关系的自然连接中。

例: 两个关系U和V,有两个共同属性B和C,如表1.16和表1.17所示。

表1.16 关系U

表1.17 关系V

那么,U和V的自然连接应该如表1.18所示。

表1.18 关系U和V的自然连接

关系U的第1个元组和关系V的第1个元组只在属性B上取值相同,在属性C上取值不同,因此不能将二者组合放入自然连接的结果关系。同理,逐一分析可得,U和V的自然连接只含有一个元组,即U的第1个元组和V的第2个元组组合而成的元组。

(4)θ连接

两个关系R和S基于条件C的θ连接用下式表示:

它是这样得到的: 先作R和S的笛卡儿积,然后从R×S的元组中选取满足条件C的元组集合。显然,R与S的θ连接其关系模式应该与R×S相同,即为R和S模式的并集。

以表1.10和表1.11中的关系R和S,如下表达式:

其结果应该如表1.19所示。

表1.19 关系R与S的θ连接

和选择运算的条件C类似,θ连接中的条件C也可以是用“AND”、“OR”等运算将子条件连接而成的复杂条件。

(5)除

给定关系R(X,Y)和S(Y,Z),其中X,Y,Z为属性组。R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域集。R与S的除运算(Division)得到一个新的关系P(X),P是R中满足下列条件的元组在X属性列上的投影,元组在X上分量值x的像集Yx包含S在Y上的投影的集合,记作:

其中Yx为x在R中的像集,x=tr[X]。

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

设R与S分别为表1.20和表1.21所表达的关系,R÷S的结果如表1.22所示。

表1.20 除运算关系R

表1.21 除运算关系S

在关系R中,A可以取4个值{a1,a2,a3,a4}。其中:

a1的像集为{(b1,c2),(b2,c3),(b2,c1)}

a2的像集为{(b3,c5),(b2,c3)}

a3的像集为{(b4,c6)}

a4的像集为{(b6,c6)}

S在(B,C)上的投影为{(b1,c2),(b2,c1),(b2,c3)}

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

表1.22 R÷S结果

本节介绍了8种关系代数运算,其中并、差、笛卡儿积、投影和选择5种运算为基本的运算。其他3种运算,即交、连接(包括自然连接和θ连接)以及除,均可以用这5种基本运算来表达。引进它们并不增加语言的能力,但可以简化表达。

1.2.5 关系演算

关系演算是以数理逻辑中的谓词演算为基础的。以谓词演算为基础的查询语言称为关系演算语言。用谓词演算作为数据库查询语言的思想最早见于Kuhns的论文。关系演算按谓词就元的不同分为元组关系演算和域关系演算。

1. 元组关系演算语言ALPHA

元组关系演算以元组变量作为谓词变元的基本对象。典型的元组关系演算语言是E.F.Codd提出的ALPHA语言,但这一语言并没有实际实现。现在关系库管理系统INGRES所用的QUEL语言是参照ALPHA语言研制的,与ALPHA十分相似。

ALPHA语言语句的基本格式是:

操作语句工作空间名(表达式): 操作条件

基本格式中,操作语句主要有GET、PUT、HOLD、UPDATE、DELETE和DROP六条语句,其中分为检索查询操作和更新操作,更新操作包含修改操作、插入操作和删除操作。工作空间是用户与系统的通信区,它可以用一个字母表示,通常用W表示; 表达式用于指定语句的操作对象,它可以是关系名和属性名,一条语句可以同时操作多个关系或多个属性; 操作条件是一个逻辑表达式,它用于将操作结果限定在满足条件的元组中,操作条件可以为空; 除此之外,还可以在基本格式的基础上加上排序要求,定额要求等。

2. 域关系演算语言QBE

域关系演算是另一种形式的关系演算。域关系演算以元组变量的分量(即域变量)作为谓词变元的基本对象。QBE是一个很有特色的域关系演算语言,由M.M.Zloof于1975年提出,于1978年在IBM370上得以实现。QBE是Query By Example(即通过例子进行查询)的简称,它是一种关系语言,同时也指使用此语言的关系数据库时的系统,QBE具有以下特点:

(1)QBE是交互式语言

操作方式非常特别。它是一种高度非过程化的基于屏幕表格的查询语言,用户通过终端屏幕编辑程序以填写表格的方式构造查询要求,而查询结果也是以表格形式显示,因此具有直观和可对话的特点。

(2)QBE是表格语言

QBE是在显示屏幕的表格上进行查询,所以具有“二维语法”的特点,而其他语言的语法则是线性的。

(3)QBE是基于例子的查询语言

QBE的意思就是通过例子查询,它的操作方法对用户来讲容易掌握,特别为缺乏计算机和数学知识的非计算机专业人员所接受,QBE中用示例元素来表示查询结果可能的例子,示例元素实质上就是域变量。

1.2.6 关系的完整性

关系模型的完整性是指实体完整性、参照完整性和用户定义的完整性。

实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性,应该由关系系统自动支持。

1. 实体完整性

如果某个属性是由一个基本关系的主关键字组成(主属性),则该属性不能取空值。

关系数据库中有各种关系,如基本关系(常称基本表)、查询表、视图表等。基本表是实际存在的表,它是实际存储数据的逻辑表示。查询表是查询的结果所对应的表。视图表是由基本表或视图导出的表,是虚表,不对应实际存储的数据。实体完整性是针对基本关系的。

空值是“不知道”或者“无意义”的值。

对于实体完整性说明如下:

①一个基本关系通常对应现实世界的一个实体集,例如学生关系对应学生的集合。

②现实世界中实体是可区分的,即它们具有唯一性标识。

③关系模式中由主码作为唯一性标识。

④主码不能取空值。因为主码去控制说明存在某个不可标识的实体,而这和第②条矛盾,即不存在这样的实体。

2. 参照完整性

参照完整性是定义建立关系之间联系的主关键字与外部关键字引用的约束条件。

关系数据库中通常都包含多个存在相互联系的关系,关系与关系之间的联系是通过公共属性来实现的。所谓公共属性,它是一个关系R(称为被参照关系或目标关系)的主关键字,同时又是另一关系K(称为参照关系)的外部关键字。如果参照关系K中外部关键字的取值,要么与被参照关系R中某元组主关键字的值相同,要么取空值,那么在这两个关系间建立关联的主关键字和外部关键字引用,符合参照完整性规则要求。如果参照关系K的外部关键字也是其主关键字,根据实体完整性要求,主关键字不得取空值,因此,参照关系K外部关键字的取值实际上只能取相应被参照关系R中已经存在的主关键字值。

在学生管理数据库中,如果将选课表作为参照关系,学生表作为被参照关系,以“学号”作为两个关系进行关联的属性,则“学号”是学生关系的主关键字,是选课关系的外部关键字。选课关系通过外部关键字“学号”参照学生关系。

3. 用户定义的完整性

实体完整性和参照完整性用于任何关系数据库系统。用户定义的完整性则是针对某一具体数据库的约束条件,由应用环境决定,它反映某一具体应用所涉及的数据必须满足的语义要求。关系模型系统应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们而不需要由应用程序承担这一功能。例如某个属性必须取唯一值、某些属性值之间应满足一定的函数关系、某个属性的取值范围在0~100之间等。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈