cd266378558jp:请问SQL语言有书可查吗??

来源:百度文库 编辑:神马品牌网 时间:2024/04/28 09:56:05
请问SQL语言有书可查吗??

数据:计算机中用来描述事物的记录

数据模型:是一种对客观事物抽象化的表现形式。数据模型应该真实、易于理解、便于实现

建模:对客观事物加以抽象,提取主要特征,归纳成一个简单清晰的轮廓,使复杂问题变得易于处理

数据模型三要素:数据结构、数据操作、完整性约束
数据结构描述静态特征,按数据结构可以把数据模型分为层次模型、网状模型、关系模型
数据操作描述动态特征,数据操作主要分为更新(插入、删除、修改)、检索两大类,统称增、删、改、查
完整性约束确保数据的正确性、有效性、相容性

数据库:简称DB(database),是由数据库管理系统管理的数据的聚集

数据库管理系统:简称DBMS(DataBase Management System)是专门用于建立和管理数据库的一套软件,介于应用程序和操作系统之间。属于系统软件

数据库系统:简称DBS(DataBase System)。数据库、DBMS、应用程序和软件系统统称数据库系统

关系:关系就是一张二维表

关系模型:数据以关系的形式表示,就是以二维表的形式表示数据模型

属性:关系的标题栏中各列的名字

模式:关系的名称和关系的属性集

元组:二维表的所有行统称为元组,元组的各个分量对应于关系的各个属性。一个元组表示一个对象

域:关系的每个属性的取值范围

关系的实例:给定关系中元组的集合称为该关系的“实例”。一个给定的关系模式,可以有许多关系实例。

关系型数据库管理系统:简称RDBMS(Relationg DataBase Management System),采用关系数据模型的数据库管理系统。

数据库系统的体系结构的三层结构和两层映象:从数据库管理的角度出发,数据库系统的体系可分三层,外模式、模式、内模式。两层映象是,外模式/模式映象、模式/内模式映象

外模式:又称用户模式,相当于SQL中的视图(VIEW)模式,是数据库用户可以看见和使用的局部数据的逻辑结构和特征描述,是与某应用有关的数据的逻辑表示

模式:分为概念模式、逻辑模式,是所有数据库用户的公共数据视图,是数据库中全部数据的逻辑结构和特征的描述,一个数据库只有一个模式

外模式/模式映象:把局部逻辑结构描述与全局逻辑结构描述联系起来。一个模式可以与多个外模式对应联系。例如,SQL SERVER中一个关系模式上可以建立多个满足不同用户要求的视图VIEW。这种映象可以保证数据与应用程序之间的逻辑独立性,即改变模式,不影响外模式,则与外模式相关的应用程序无序修改

内模式:由称为存储模式,是数据库物理结构和存储方式的描述,是数据在数据库内部的表示方式。一个数据库只有一个内模式。内模式描述记录的存储方式、索引的组织方式、数据是否压缩、是否加密等,不涉及硬件设备。

模式/内模式映象:把全局逻辑结构描述与物理结构描述联系起来。一个模式只有一个内模式。这种映象保证了数据与程序之间的物理独立性,当内模式修改时,由于模式未变,所以无需修改程序。

DBMS的体系结构(组成):查询处理程序、存储管理程序、事务管理程序、客户/服务器程序体系结构

查询处理程序:负责查询处理,它的一个重要任务是“优化”查询。

事务管理程序:保证多个事务并发执行

存储管理程序:既管理磁盘上的数据文件又管理存放数据文件部分内容的内存数据缓冲区

客户/服务器程序体系结构:大多数DBMS程序采用这种程序体系结构,把整个DBMS程序系统划分为两部分,DBMS核心部分属于服务器程序,客户程序主要用于与用户相互配合并将查询或其他命令传送给服务器程序的查询接口。

数据库设计

数据库设计的步骤:需求分析、概念设计、逻辑设计、物理设计

需求分析和概念设计阶段的工作与具体数据库管理系统无关,这一阶段的工作独立于数据库管理系统

逻辑设计和物理设计阶段的共组与具体采用何种数据库管理系统相关。

需求分析阶段:应用领域的调查、定义信息与应用、定义操作任务、定义数据项、预测未来改变,结果产生相关文档

概念设计阶段:也称为建模

任务:数据库概念模式(模式)设计、事务设计

概念模式设计的工具:E/R图。对于面向对象的数据库则可采用面向对象定义语言ODL

E/R图:称为实体-联系模型

E/R图的组成:实体集(矩形)、属性(椭圆)、联系(菱形)

联系的类型:一对一、一对多、多对多。用线条和箭头表示不同的联系。箭头指向的一方代表“一”

键码属性的表示:下划线

联系中的角色:即一个实体集内部实体之间的联系

多向联系:多个实体集之间发生的一个联系

多向联系转化为双向联系的方法:将多向联系转换成实体集,然后在原来与之联系的实体集和新的实体集之间建立新的双向联系

E/R图中的子类的表示方法和继承:如果实体集B是实体集A的子类,则它们之间用一个标有isa的三角形和两根线条建立特殊的联系。三角形的尖端指向超类(父类),子类实体集上只需标出子类特有的属性,继承父类的所有属性。

ODL对象定义语言:是用面向对象的术语来说明数据库结构的一种推荐的标准语言,主要用途是书写面向对象数据库的设计

对象:是某种可研究,可观察的实体,例如:一个人、一门课程、一本书等等

类:具有相似特性的对象可以归为一类

ODL描述的三种特性:属性(Attribute)、联系(Relationship)、方法(Method)

ODL书写规则:

interface 类名1{

attribute 数据类型1 属性名1;
attribute 数据类型2 属性名2;
.
.
.
relationship [Set]<类名2> 联系名1
inverse 类名2::联系名2;
.
.
}

说明:
关键字interface、attribute、relationship、<set>、inverse
常用数据类型有string(字符串)、integer(整型)、float(浮点型)、enum(枚举型)
[]中的set为任选项,当类1与类2的联系是一对一时,不需要使用set,当类1与类2的联系是一对多时必须使用set
inverse表示在类2中联系名2所表示的联系与类1中联系名1所表示的联系是多对一的对应联系
ODL例一:用ODL描述制片公司与电影,假如制片公司部名称不重复。因为,一个制片公司可以制作多部影片,而一部影片只能由一个公司制作发行,所以制片公司与影片的关系是一对多的关系。

interface studio{
attribute string studioname;
attribute string address;
attribute string phone;

relationship set<movie> make
inverse movie::madeby;
}

interface movie{
attribute string movietitle;
attribute integer length;
attribute enum incolor {color,blackwhite};
attribute integer year;

relationship set studio madeby
inverse studio::make;
}

ODL例二:用ODL描述学生与课程,一名学生可以选择多门课程来学习,一门课程可以被多名学生选修。

interface student{
attribute string sname;
attribute string address;
attribute enum gender {male,female};
attribute integer age;

relationship set<course> choice
inverse course::choisedby;
}

interface course{
attribute string ctitle;
attribute integer credit;

relationship set<student> choisedby
inverse student::choice;
}

ODL例三:用ODL描述校长与学校的关系,一名校长只能管理一所学校,一所学校只能设一名校长。

interface chairman{
attribute string chname;
attribute enum gender {male,female};
attribute integer age;
attribute string phone;

relationship set university manage
inverse university::leadby;
}

interface university{
attribute string unnmae;
attribute string addr;

relationship set chairman leadby
inverse chairman::manage;
}

ODL子类描述方法:自类继承父类的所有属性和联系。子类可以有自己的特殊属性和联系。子类中属性和联系的描述方法与上述例子相同。

interface 子类名:基类名{...}

ODL子类描述例:硕士研究生类是学生的一个子类。每名硕士研究生有若干名导师,一名导师可以带多名硕士研究生。

interface student{
attribute string sname;
attribute string address;
attribute enum gender {male,female};
attribute integer age;
}

interface master:student{
attribute string special;

relationship set<advisor> direct
inverse advisor::directedby;
}

interface advisor{
attribute string name;
attribute string address;
}

逻辑设计阶段:把概念设计阶段产生的数据库概念模式变换为数据库逻辑模式。数据库逻辑模式依赖于逻辑数据模型和数据库管理系统。目前做流行的数据库管理系统都是关系型逻辑数据模型。所以,本教程知讨论如何把概念模式转变为关系模型

逻辑设计阶段的步骤:

1.概念模式转变为关系模型
2.对关系模型进行规范化和优化
3.适应DBMS限制条件的修改
4.对性能、存储空间等的优化

1.概念模式转变为关系模型

E/R图转变为关系模型的方法:

1.一个实体集转变为一个关系模式,这个关系模式包含实体集所有的简单属性和复合属性的简单子属性。实体集的名称可以用作为关系模式的名称,用下划线来表示关系的键码
2.一个联系转变为一个关系模式,一般情况下用联系名作为关系名,用联系的实体集的键码和联系本身的属性作为此关系模式的属性集。

E/R图转变为关系模型实例:

实例一:一个班级只能有一个班长,而且必须有一个班长,E/R图如下:

学生与班级的联系是一对一的联系(1:1)。学生实体集的键码是学号。班级实体集的键码是班号。这个E/R图可以转变为如下的关系模型

学生(学号,姓名,性别,出生日期)
班级(班号,名称,地点)
班长(学号,班号,注册)

联系反映的是具有某学号的学生担任具有某班号班级的班长。这种转变方法是常用的方法。
如果想减少查询时使用连接操作的次数,提高查询效率,以上E/R图也可以转变为如下关系模型

学生(学号,姓名,性别,出生日期,班号)
班级(班号,名称,地点)

学生关系模式中的“班号”是外键码。这种关系模式中,由于学生关系中记录了所有学生的学号,但不是每个学生都担任班长(按教科书上的术语叫做不是全参与),因此不是每个元组的班号属性都有数据,即应该允许班号为空。否则,学生实体集必须是全参与,即每个学生都是班长。

实例二:一个影片公司可以制作多部影片,但是一部影片只能归一个制片公司所有。假如公司不重名,影片也不重名,则公司名称是制片公司实体集的键码,影片名是影片实体集的键码。

影片公司与影片的联系是1对多的联系(1:N)。这个E/R图可以转变为以下关系模型

影片公司(公司名称,地点)
影片(影片名,片长)
制作(公司名称,影片名)

同样,假如影片公司是全参与,即每个影片公司至少制作了一部电影,则可以转变为以下关系模型

影片公司(公司名称,地点,影片名)
影片(影片名,片长)

其中,影片公司关系中的影片名是外键码

实例三:学生与课程之间的联系是“选修”。一个学生可以选多门课程,一门课程可以被多名学生选修,所以它们之间的“选修”联系是多对多(N:M)

上述E/R图可以转变为以下关系模型

学生(学号,姓名)
课程(课程号,课程名)
选修(学号,课程号,成绩)

选修关系中的学号和课程号是外键码

2.对关系模型进行规范化和优化

为什麽要把关系模型规范化:为了有效地消除关系中存在的数据冗余和更新异常等现象

基本概念

函数依赖:如果关系R的两个元组在属性A1,A2,...An上一致,则它们的另一个属性B上也一致,那末,我们就说在关系R中属性B函数地依赖于属性A1,A2,...An或者说属性A1,A2,...An函数决定属性B。

关系的键码:

如果一个或多个属性的集合{A1,A2,...An}满足如下条件,则称该集合为关系R的键码(key):
1.这些属性函数决定该关系的所有其它属性。
2.{A1,A2,...An}的任何真子集都不能函数决定R的所有其它属性。

关系的超键码:包含键码的属性集称为超键码,是“键码的超集”的简称

函数依赖规则:分解/合并规则、传递规则、平凡依赖规则

平凡依赖:对于函数依赖A1,A2,...An->B,如果B是A中的某一个,我们称这种依赖是平凡依赖
非平凡依赖:对于函数依赖A1,A2,...An->B,如后B中至少有一个不在A中,我们称这种依赖是非平凡依赖
完全非平凡依赖:对于函数依赖A1,A2,...An->B,B中没有一个在A中,我们称这种依赖是完全非平凡依赖

主属性:键码所在的属性

非主属性:键码以外的属性

封闭集(闭包)对于给定的函数依赖集S,属性集A函数决定的属性集合就是属性集A在依赖集S下的封闭集

范式就是符合某一种级别的关系模式的集合。

规范化通过分解把属于低级范式的关系模式转换为几个属于高级范式的关系模式的集合,这一过程称为规范化

1范式(1NF),如果一个关系模式R的所有属性都是不可分割的基本数据项,则这个关系属于1NF

2范式(2NF),若关系模式R属于1NF,且每个非主属性都完全依赖于键码,则R属于2NF

3范式(3NF),若关系模式R属于1NF,且每个非主属性都不传递依赖于键码,则R属于3NF

BC范式(BCNF),若关系模式属于1NF,且R的每个非平凡依赖的决定因素都包含键码,则R属于BCNF

规范化分解原则:无损连接、保持依赖

无损连接:当对关系模式R进行分解时,R的元组将分别在相应属性集进行投影而产生新的关系,如果对新的关系进行自然连接得到的元组的集合与原关系完全一致,则称为无损连接

保持依赖:如果分解后的总的函数依赖集与原函数依赖集保持一致,则称为保持依赖。

模式分解的两个规则:公共属性共享、相关属性合一

公共属性共享:保留公共属性,进行自然连接是分解后的模式实现无损连接的必要条件

相关属性合一:把以函数依赖的形式联系在一起的相关属性放在一个模式中,从而使原有的函数依赖得以保持,这是分解后的模式实现保持依赖的充分条件

模式分解的三种方法

一、部分依赖归子集;完全依赖随键码——用于建立2NF

例:关系R(A,B,C,D,E,F,G)上存在函数依赖,A->BCD,E->F,AE->G,AE->BCD,AE->F

分析以上依赖可以看出,AE是键码(AE->BCD)。因为AE是键码,A是主属性,A->BCD,所以BCD是部分依赖于AE

根据部分依赖归子集的方法,因为A是AE的真子集,所以A与BCD归在一起构成一个关系模式。R1(A,B,C,D)

同理对于AE->F,有E->F所以AE->F是部分依赖,非主属性F所依赖的真子集是E,所以E和F可以归在一个关系模式中R2(E,F)

AE->G是完全函数依赖,完全依赖随键码,所以AEG归在一个关系模式中R3(A,E,G)

因此R(A,B,C,D,E,F,G)可以分解为符合2NF的关系模式如下:

R1(A,B,C,D)
R2(E,F)
R3(A,E,G)

二、基本依赖为基础,中间属性做桥梁——用于建立3NF

例:关系R(A,B,C,D,E)上存在函数依赖,AB->C,C->D,D->E

显然中间桥梁是C->D,他构成了传递依赖链,因此,R可以分解为R1(A,B,C),R2(C,D)。分解后在R1,R2中都不存在传递依赖。

三、找违例自成一体,舍其右全集归一;若发现仍有违例,再回首如法炮制——用于建立BCNF

BCNF违例:违背BC范式的函数依赖称为BC范式违例

例:关系R(A,B,C,D,E)的键码是AB,有函数依赖AB->CDE,ABC->E,C->D

分析上述三个函数依赖可以看出,C->D是BCNF违例。因为它的决定因素不包含键码。我们作如下分解

违例自成一体,即CD构成一个关系模式R1(C,D)

舍其右全集归一,即从R的属性中取掉C->D的右边的属性D,其左边的属性C与其他所有属性构成一个新的关系R2(A,B,C,E)

新的关系模式如下:

R1(C,D)
R2(A,B,C,E)

注意:以BCNF违例为基础进行模式分解,最终得到的属于BCNF的关系模式都能实现无损连接,但未必能保持函数依赖

逻辑设计例一:假如有关系模式R(A,B,C,D)和函数依赖集S={B->C,B->D}。
(1)找出所有BCNF违例。
(2)如果该关系模式不是BCNF,则将它分解为BCNF
(3)找出所有的违背3NF的依赖
(4)如果该关系不是3NF,则将它分解为3NF

步骤一:找出R在S上的所有非平凡依赖,首先计算封闭集

单属性封闭集:A+=A,B+=BCD,C+=C,D+=D
双属性封闭集:AB+=ABCD,AC+=AC,AD+=AD,BC+=BCD,BD+=BCD,CD+=CD
三属性封闭集:ABC+=ABCD,ABD+=ABCD,BCD+=BCD,ACD+=ACD
四属性封闭集:ABCD+=ABCD

步骤二:根据计算所得的封闭集,找出键码和超键码

键码:AB

超键码:ABC,ABD,ABCD

步骤三:找出所有的非平凡函数依赖

B->C,B->D,AB->C,AB->D,BC->D,BD->C,ABC->D,ABD->C
其中,AB->C,AB->D,ABC->D,ABD->C不是BCNF违例,因为前两个依赖的决定因素本身就是键码,而后两个依赖的决定因素包含键码。所以,B->C,B->D,BC->D,BD->C是BCNF违例,因为它们的决定因素都不包含键码。实际上可以看出R不是2NF,因为存在部分函数依赖:ABC->D,ABD->C,AB->C,AB->D,B->C,B->D

步骤四:进行BCNF规范。BCNF违例自成一体。从以上BCNF违例中选择B->C自成一体

R1(B,C)

舍其右全集归一,即舍去B->C的右边属性C,所以得到

R2(A,B,D)

但是在R2中还存在BCNF违例B->D,因此B->D自成一体,得到R21(B,D),舍其右全集归一得到R22(A,B)

最后得到的关系模式是:R1(B,C),R21(B,D),R22(A,B)

通过关系模式分解,把一个非2NF的关系模式归范成一个BCNF。代价是,在实际操作中增加了连接操作。

(3)B->C,B->D,B不是键码也不是超键码,而C,D都是键码以外的属性,即是非主属性。所以R不是3NF。

逻辑设计例二:有关系R(A,B,C,D)和函数依赖集S={A->B,B->C,C->D,D->A}
(1)找出所有BCNF违例。
(2)如果该关系模式不是BCNF,则将它分解为BCNF
(3)找出所有的违背3NF的依赖
(4)如果该关系不是3NF,则将它分解为3NF

步骤一:找出R在S上的所有非平凡依赖,首先计算封闭集

单属性封闭集:A+=ABCD,B+=ABCD,C+=ABCD,D+=ABCD
双属性封闭集:AB+=ABCD,AC+=ABCD,AD+=ABCD,BC+=ABCD,BD+=ABCD,CD+=ABCD
三属性封闭集:ABC+=ABCD,ABD+=ABCD,BCD+=ABCD,ACD+=ABCD
四属性封闭集:ABCD+=ABCD

步骤二:找出所有非平凡函数依赖

A->B,A->C,A->D,B->A,B->C,B->D,C->A,C->B,C->D,D->A,D->B,D->C
AB->C,AB->D,AC->B,AC->D,AD->B,AD->C,BC->A,BC->D,BD->A,BD->C,CD->A,CD->B
ABC->D,ABD->C,BCD->A,ACD->B

步骤三:找出键码和超键码

键码:A,B,C,D

超键码:AB,AC,AD,BC,BD,CD,ABC,ABD,BCD,ACD,ABCD

根据以上结果分析,R是3NF也是BCNF

3NF要求不存在每个非主属性对于键码的部分依赖或传递依赖

练习:对于
1.R(A,B,C,D)和函数依赖集S={AB->C,BC->D,CD->A,AD->B}
2.R(A,B,C,D,E)和函数依赖集S={AB->C,DE->C,B->D}
3.R(A,B,C,D,E)和函数依赖集S={AB->C,C->D,D->B,D->E}
(1)找出所有BCNF违例。
(2)如果该关系模式不是BCNF,则将它分解为BCNF

物理设计阶段:任务是在数据库逻辑设计的基础上,为每个关系模式选择合适的存储结构和存取路径

物理设计阶段步骤:

(1)分析影响数据库物理设计的因素;
(2)为关系模?