数据库学习

第一章 基本知识

数据和信息

信息:关于现实世界事物存在方式和运动状态的反映。

数据:通常指用符号记录下来的、可以识别的信息。

数据处理和数据管理

数据处理是指从某些已知的数据出发,推导加工出一些新的信息。

数据管理是指数据的收集、整理、存储、维护、检索、传送等操作。这部分操作是数据处理业务的基本环节,而且是任何数据处理业务中必不可少的共有部分。


数据库基本术语

数据库(DB):长期存储在计算机内、有组织的、统一管理的相关数据的集合。

数据库管理系统(DBMS):位于用户和操作系统之间的一层数据管理软件。

数据库系统(DBS):实现有组织地、动态地存储大量关联数据、方便多用户访问的计算机硬件、软件和数据资源组成的系统。

数据库技术:与数据库的结构、存储、设计、管理和使用的相关技术。


数据存储方法的演化历史:磁盘、卡片和纸带发展到磁盘,同时磁盘容量出现飞速增长。

数据库技术的发展经历了三个阶段:手工管理阶段、文件系统阶段和数据库阶段。

手工管理阶段:在20世纪50年代以前,外存只有磁带、卡片和纸带,还没有直接存取设备,没有操作系统,没有管理数据的软件,也没有文件的概念。数据量少,由用户自己管理,且数据没有组织结构,是面向应用的,依赖于应用程序,不能独立存在。

文件系统阶段:50年代后期到60年代中期,出现了磁鼓、磁盘等存储设备,于是数据被组织成独立的数据文件,这样数据以“文件”形式长期保存在外部存储器的磁盘上,系统通过文件名访问,对文件里的记录进行存取,并可对文件中的记录进行增删改。文件系统实现了记录的结构化,即给出了记录间各种数据的关系,使得数据的逻辑结构与物理结构有了区别。文件组织也已经多样化。数据不再属于某个特定的程序,可以重复使用。

但文件从整体上看仍是无结构的,数据共享性、独立性差,数据之间联系弱,数据不一致,且有大量冗余,所以管理和维护的代价很大。

数据库阶段:60年代后期,出现了数据库这样的数据管理技术。1968年IBM推出层次模型的IMS系统。1969年CODASYL组织发布了DBTG报告,总结了当时各种数据库,提出网状模型。可以说,层次数据库是数据库系统的先驱,而网状数据库则是数据库概念、方法、技术的奠基者。1970年IBM的E.F.Codd连续发表论文,提出关系模型,奠定了关系数据库的理论基础。

数据库的特点有:采用数据模型表示复杂的数据结构;有较高的数据独立性;数据库系统为用户提供了方便的用户接口;数据库系统提供了数据库的并发控制、数据库的恢复、数据的完整性、数据安全性这四方面的数据控制功能。

除了关系数据库,如今还有一些高级数据库,比如分布式数据库系统对象数据库系统网络数据库系统

分布式数据库通常使用位于不同的地点的较小的计算机系统,通过网络连接构成完整的、全局的大型数据库。每台计算机有DBMS的一份完整拷贝,且具有自己局部的数据库。

对象数据库是用以对象形式表示信息的数据库。对象数据库的管理系统称为ODBMS或OODBMS。

网络数据库由数据和资源共享这两种方式结合在一起而成,也称Web数据库。它以后台(远程)数据库为基础,加上一定的前台(本地计算机)程序,通过浏览器完成数据的存储、查询等操作。


数据库系统的体系结构

数据库系统的结构常采用三级模式结构:外模式、概念模式、内模式。

概念模式简称为模式,它表示了对数据的全局逻辑级的抽象级别,是数据库中全部数据的整体逻辑结构的描述。它由若干个概念记录类型组成,还包含记录间联系、数据的完整性、安全性等要求。在实现中,它可以对应于所有的表格。

内模式也称存储模式,表示了对数据的物理级的抽象级别。它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式和物理结构,对应着实际存储在外存储介质上的数据库。它包括记录类型、索引、文件的组织等,用内模式描述语言来描述、定义。

外模式也称子模式,表示了对数据的局部逻辑级的抽象级别。它对应于用户级,是用户与数据库系统的接口,是用户用到的那部分数据的描述。在实现中可以对应于视图。

三级模式间存在二级映象:

外模式/概念模式映象:局部逻辑级和全局逻辑级的一级映象,提供了逻辑独立性。这样在修改表格时,只需要相应修改映象,而用户程序不会受到影响。

概念模式/内模式映象:全局逻辑级和物理级的一级映象,提供了物理独立性。这样在进行数据库迁移时,比如从mysql到sqlserver,表格并不需要发生变化。


DBMS用于管理数据库。应用程序向DBMS发送请求,DBMS则向DB发出底层指令。DB向DBMS返回数据(查询结果),DBMS对数据进行处理并返回给应用程序数据(处理结果)。

DBMS的主要功能有:数据库的定义功能数据库的操纵功能数据库的保护功能(数据库的恢复、数据库的并发控制、数据完整性控制和数据安全性控制)、数据库的维护功能数据字典(存放数据库的信息,其用途为描述数据,比如一个表的创建者信息,创建时间信息,所属表空间信息,用户访问权限信息等)。


数据库系统的组成数据库硬件软件(DBMS、OS、开发工具等)和数据库管理员

数据库系统的用户角色有:

DBA(Database Administrator):是控制数据库整体结构的一组人员,负责DBS的正常运行,承担创建、监控和维护数据库的责任。它的职责有:定义模式定义内模式与用户的联络(包括定义外模式、应用程序的设计、提供技术培训等专业服务)、定义安全性规则和对用户访问的数据库进行授权定义完整性规则及监督数据库的运行数据的转储和恢复工作

专业用户:使用专用的数据库查询语言操作数据的计算机工作者。

应用程序员:使用主语言和DML语言(Data Manipulation Language,SQL的分类之一,包括:INSERT、UPDATE、DELETE。)编写应用程序的计算机工作者。

终端用户:使用应用程序的非计算机人士。


第二章 数据模型

数据模型的概念

能表示实体类型及实体间联系的模型称为“数据模型”。

数据模型分为两类:概念数据模型辑数据模型物理数据模型


概念数据模型(Conceptual Data Model)贴近于现实世界,它独立于计算机系统,完全不涉及信息在计算机中的表示,只是用来描述某个特定组织所关心的信息结构。

最常用的概念数据模型是E-R(Entity-Relationship)模型,即实体-联系模型。它的数据描述有:

实体:客观存在,可以互相区别的事物。

实体集:性质相同的同类实体的集合。

属性:实体的特性。

实体标识符

联系:实体之间的相互联系。

ER模型可以用ER图来表示,它看起来如下:

ER图有三个基本成分:矩形框,用于表示实体类型(考虑问题的对象);菱形框,用于表示联系类型;椭圆形框,用于表示实体和联系类型的属性,实体的主键属性里文字下方应该有下划线。从上图可以看到实体和联系都可以有属性。一般说来,ER图里实体都是名词,而联系都是动词。

ER图的优点有:简单、容易理解,真实反映用户的需求;与计算机无关,用户容易接受。

与一个联系有关的实体集个数被称为元数。一个联系可以是一元联系、二元联系或多元联系。上图展示的联系就是二元联系。根据实体参与的数量,二元联系又可分为一对一(1:1,乘客和座位)、一对多(1:N,车间和工人)和多对多(M:N,学生和课程)。上表中的联系上m和n表示多对多的关系。一元联系的一个例子是零件的组合关系,一个零件可以用若干子零件组成。

属性的分类

根据属性的可分性,属性有基本属性复合属性。比如地址可以包含邮编、街道、门牌号,它是一个复合属性。

根据属性的值的数量,属性有单值属性多值属性。比如一个人的姓名是一个单值属性,而他的网名是多值属性。多值属性在ER图里用双线椭圆表示。

此外,还有导出属性派生属性),它通过具有相互信赖的属性推导出来,比如一个学生的平均成绩。导出属性在ER图里用虚线椭圆表示。

注意属性的值可以是空值

存在依赖(Existence Dependency):如果实体x的存在依赖于实体y的存在,则称x存在依赖于y。y称作支配实体,而x称作从属实体(弱实体)。弱实体主键的一部分或全部从被依赖实体获得。如果y被删除,那么x也要被删除。从属实体的集合便称为弱实体集。弱实体在ER图里用双线矩形表示。比如某单位的职工子女信息,如果职工不在该单位了,其子女信息也没有意义了,所以职工子女信息是一个弱实体。


逻辑数据模型(Logical Data Model)贴近于计算机上的实现,是用户从数据库看到的模型,是具体DBMS所支持的数据模型。此模型既要面向用户,又要面向系统,主要用于DBMS的实现。逻辑模型有层次模型、网状模型和关系模型。

层次模型:用树形结构表示实体类型及实体间联系的数据模型,盛行于20世纪70年代。缺点是只能表示1:N的关系,且查询和操作很复杂。

网状模型:用有向图表示实体类型及实体间联系的数据模型,盛行于70年代至80年代中期。它的特点是记录之间联系通过指针实现,M:N也容易实现,查询效率较高。缺点是数据结构复杂,编程复杂。

关系模型:用二维表格表示实体集;用关键码而不是用指针导航数据。SQL语言是具有代表性的语言。


物理数据模型Physical Data Model面向于计算机物理表示,描述了数据在存储介质上的组织结构,不仅和具体的DBMS有关,还与操作系统和硬件有关。每一种逻辑数据模型在实现时都有起对应的物理数据模型。DBMS为了保证其独立性与可移植性,大部分物理数据模型的实现工作由系统自动完成,而设计者只设计索引、聚集等特殊结构。


ER模式的设计的过程为:设计局部ER模式设计全局模式全局ER模式的优化

局部ER模式设计基于需求分析的结果,1、确定局部结构范围;2、实体定义;3、联系定义;4、属性分配;5、查看是否还有待分析的局部结构,若有则跳到第2步,否则进入全局ER模式设计阶段。

全局ER模式设计基于局部ER模式,1、确定公共实体类型;2、合并两个局部的ER模式;3、检查并消除冲突;4、重复第3步直到不再有冲突;5、检查是否还有未合并的局部ER模式,若有则跳到第2步,否则便完成了ER模式设计。

全局ER模式的优化有:实体类型的合并(一般的可以把1:1联系的两个实体类型合并);冗余属性的消除;冗余联系的消除(通常利用规范化理论中的函数依赖的概念消除冗余联系)。

在ER模式的设计过程中,常常要对ER模型进行种种变换。变换包括:分裂合并增加删除

实体的分裂有水平分裂垂直分裂。水平分裂根据应用对象的不同,分成两个具有相同属性的实体,比如书店的书可以水平分裂成“有库存”和“无库存”两个实体,这样方便对两种实体进行不同的操作。垂直分裂根据属性的使用频率,分成两个属性不同的实体,比如图书有作者、版次、价格等属性,分成包含常用的作者、版次属性的图书和包含不常用的价格属性的图书。垂直分裂的好处是可以减少每次存取的数据量。

联系的分裂可以细化联系,比如程序员和项目的联系“参与”,可以分裂成“开发”和“维护”。

合并是分裂的逆过程。注意合并的联系类型只能是定义在相同的实体类型上的。


ER模型向关系模型的转换规则

实例类型的转换:将每个实体类型转换成一个关系模型,实体的属性即为关系模型的属性,实体的标识符即为关系模型的键。

二元联系类型的转换

1:1联系:在由实体转换成的两个关系模式之间选任一个加上一个属性来表示另一个关系模式的键和联系。也就是结果只有两张表,其中一张表里会有外键表示联系。

1:N联系:在N端实体转换成的关系模式里加上1端实体类型的键和联系类型和属性。最终的结果也是两个表,N端的表有外键。

M:N联系:将联系类型转换成关系模式,其属性为两端实体类型的键加上联系类型的属性,而键为两端实体键的组合。最终的结果有三张表,其中一张表专门表示联系,包含另两个表的外键。


第三章 关系数据库理论

关系模型是用二维表格表示实体,用键码进行数据导航的数据模型。数据导航是指从已知数据查找未知数据的方法。在关系模型中,记录称为元组,为行(Row);字段称为属性,为列(Column)。

超键(Super Key)是可以唯一标识元组的属性集。候选键(Candicate Key)是不含多余属性的超键。主键(Primary Key)是用户选做元组标识的候选键。外键(Foreign Key)是当模式R中的属性K是其它模式的主键,那么K在R中称为键。

举个例子,屏幕上的点的信息表

x坐标 y坐标 颜色 大小
假定每个位置上的点是唯一的,但颜色和大小不唯一,那么首先属性集(x坐标、y坐标、颜色、大小)可以唯一标识记录,它便是一个 超键 。同理,属性集(x坐标、y坐标、大小)也是表的一个超键。然而可以发现,这两个超键有多余的属性,真正起到标识作用的是(x坐标、y坐标),而它没有多余的属性,因为(x坐标)或(y坐标)不能单独用来标识一个点,所以它是一个 候选键 。它是这个表里唯一的候选键,用户可以选择用它作为 主键 来标识元组。如果我们假定颜色也是唯一的,那么表格里有两个候选键:(x坐标、y坐标)和(颜色),而用户可以任选其一作为主键。

如果主键出现在别的表中,比如一个“射线”表

x坐标 y坐标 方向
那么(x坐标,y坐标)在“射线”表里就是一个 外键


关系是一个属性集相同的元组的集合。由于是集合,因此:

1、关系中没有重复的元组

2、关系中的元组是无序的,即没有行序;(理论上属性集也是无序的,但使用时习惯考虑列的顺序)。

每个属性都是不可分解的整体,比如只能是整型、字符这种简单类型,而不能是结构体这样的复杂的类型。

根据元组的数目,关系可分为有限关系无限关系


关系模式有三类完整性规则

1、实体完整性规则,即主键的值不能是空值;

2、参照完整性规则,即不允许(通过外键)引用不存在的实体;

3、用户定义的完整性规则,比如属性“性别”只能接受“男”和“女”作为合法值,其它的输入都是非法的。

关于参照完整性,当在一个参照关系里作为删除记录时,有三种策略:
1、级联删除:将参照关系中所有外键值与被参照关系中要删除的元组的主键值相同的元组一起删除;

2、受限删除:仅当参数关系中没有外键与被参照关系中要删除的元组主键值相同时才允许删除,否则拒绝删除操作;

3、置空值删除:删除被参照关系中的元组,并将参照关系中相应的外键值置空值。

而向参照关系插入元组时,有两种策略:

1、受限插入:仅当被参照关系存在相应的元组,且其主键和要插入的元组的外键值相同时才允许插入,否则拒绝插入操作;

2、递归插入:首先在被参照关系里插入主键值等于参照关系里要插入的元组的外键值相同的元组,再在参照关系里插入元组。

关于实体完整性,主键的修改操作有两种方法:一种是不允许修改主键;另一种是允许修改主键,但必须保证修改后的主键唯一且非空。当修改的主键是参照关系的外键时,可以使用三种策略:级联修改、受限修改和置空值删除。


关系代数的运算有多种。

五个基本操作:并(Union,∪)、差(set difference,−)、笛卡儿积(Cartesian product,×)、投影(Projection,Π)和选择(Selection,σ);

四个组合操作:交(Intersection,∩)、θ连接(θ-Join,θ)、自然连接(Natural join,⋈)和除法(Division,÷);

七个扩充操作:改名(Rename,ρ)、广义投影、赋值()、外连接(Outer joins,、外部并、半连接(Semijoin,⋉ ⋊)、聚集操作(Aggregation)


选择运算:从关系中选择满足给定条件的元组。比如σA<5(R)在关系R中选择属性A的值小于5的元组。

投影运算:从关系中取出若干列组成新的关系,投影结果里要删除重复的元组。比如ΠA,B(R)从关系R中取出属性集(A、B)。

举个例子,有学生信息表S1

学号 姓名 电话
1 X 123
2 Y 456
3 Z 789
得到姓名为Y的学生的电话: Π 电话 (σ 姓名=Y (R))。


并运算:合并两个关系,即元组合并。这两个关系必须是同构的,即属性集应该相同。

例如有另一种学生信息表S2

学号 姓名 电话
3 Z 789
4 M 999

S1∪S2的结果为:
学号 姓名 电话
1 X 123
2 Y 456
3 Z 789
4 M 999
注意并运算时要删除重复的元组。


交运算:得到同时出现在两个关系的元组集合。

例如,
S1∩S2的结果为:

学号 姓名 电话
3 Z 789


差运算:得到出现在一个关系而不在另一个关系的元组集合。

例如:
S1−S2的结果为:

学号 姓名 电话
1 X 123
2 Y 456

换句话说,(S1−S2)∩S2=,而(S1−S2)∪S1=S1。


笛卡儿乘积运算:把一个关系中的每个元组和另一个关系的所有元组连接成新关系中的一个元组。新关系的元组数是两个关系的元组数之积。

比如有一张选课表SC1

学号 课程
1 语文
2 数学

那么S1×SC1的结果为:

学号 姓名 电话 学号 成绩
1 X 123 1 语文
1 X 123 2 数学
2 Y 456 1 语文
2 Y 456 2 数学
3 Z 789 1 语文
3 Z 789 2 数学

运算中的查询优化:尽可能早地执行选择操作和投影操作;避免直接做笛卡儿乘积,把笛卡儿乘积之前和之后的一连串操作和投影合并起来做。


除运算:它类似于(但不完全是)笛卡儿乘积的逆运算,被除关系的属性集(M,N)真包含除关系的属性集(N),得到的结果关系的属性集为被除关系的属性集与除关系的属性集的差集(M),且结果关系是与除关系的笛卡儿乘积被包含于被除关系的最大关系。换句话说,若R1(M,N)÷ R2(N) = R3(M),则R3(M) × R2(N) ⊆ R1(M,N),而在ΠM(R1)−R3里,没有任何子集能足这样的关系。

举个例子,有选课表SC2

学号 课程
1 语文
2 数学
1 数学
和课程表C2
课程
语文
数学

那么SC2 ÷ C2的结果为:

学号
1

结果其实为选修了所有课程的学生号。

除运算的另一种形式表达为:r ÷ s = ΠR-S(r) -ΠR-S((ΠR-S(r) × s) - ΠR-S,S(r)) (小写r、s为关系名,而大写R、S分别为r、s的属性集)。


更名运算ρx(E)可以返回关系表达式的结果,并重命名这个表达式为x。ρx(A1,A2,...,An)(E)同时将各属性更名为A1、A2……,An。例如数学成绩比王红同学高的学生:ΠS.姓名R.成绩(R ×ρS(R))。其实更名运算就是SQL里的as。


θ连接:从两个关系的广义笛卡儿积中选取给属性间满足一定条件的元组通常写法为:

RS
A θ B

A、B分别为R和S上可比的属性列。θ为算术比较符,如果是等号则称为等值连接。例如数学成绩比王红同学高的学生的另一种表示方式可以是:

ΠS.姓名((σ课程=数学 ∧ 姓名=王红(R)) σ课程=数学ρS(R)
R.成绩 < S.成绩

自然连接:从两个关系的广义笛卡儿积中选取在相同属性列上取值相等的元组,并去掉重复的列。比如前面的S1表和SC1表的自然连接的结果为:

学号 姓名 电话 成绩
1 X 123 语文
2 Y 456 数学


赋值运算:用于存储临时变量,比如r ÷ s的过程可写成:

temp1  ΠR-S(r)

temp2 ΠR-S(tmp1 × s) - ΠR-S,S(r))

result temp1 - temp2


广义投影:在投影列表中使用算术表达式来对投影进行扩展:ΠF1, F2, ..., Fn(E),其中F1,F2,...Fn是算术表达式。比如:ΠA*5, B+3(R)


外连接:为避免自然连接时因失配而发生的信息丢失,可以假定往参与连接的一方表中附加一个取值全为空值的行,它和参与连接的另一方表中的任何一个未匹配上的元组都能匹配,称之为外连接。

外连接 = 自然连接 + 未匹配元组

外连接的形式有:左外连接右外连接全外连接

左外连接 = 自然连接 + 左侧表中未匹配元组

右外连接 = 自然连接 + 右侧表中未匹配元组

全外连接 = 自然连接 + 两侧表中未匹配元组

考虑两张表“学生借书信息”(R)

学号 书名 借出时间
1 数据库 2012.1.2
5 设计模式 2012.3.6
8 操作系统 2012.4.8

和“学生会信息”(S):

学号 学生会
1 科技部
3 体育部

自然连接:RS:

学号 书名 借出时间 学生会
1 数据库 2012.1.2 科技部

左外连接:RS

学号 书名 借出时间 学生会
1 数据库 2012.1.2 科技部
5 设计模式 2012.3.6 null
8 操作系统 2012.4.8 null

右外连接:RS

学号 书名 借出时间 学生会
1 数据库 2012.1.2 科技部
3 null null

体育部

全外连接:RS

学号 书名 借出时间 学生会
1 数据库 2012.1.2 科技部
3 null null 体育部
5 设计模式 2012.3.6 null
8 操作系统 2012.4.8 null


半连接:类似于自然连接,但R ⋉ S 的连接的结果只是在 S 中有在公共属性名字上相等的元组所有的R 中的元组,而RS刚好相反。

还是以前面的“学生借书信息”和“学生会信息”为例:

R ⋉ S

学号 书名 借出时间
1 数据库 2012.1.2

R S:
学号 学生会
1 科技部


聚集函数:求一组值的统计信息,返回单一值。使用聚集的集合可以是多重集,即一个值可以重复出现多次。如果想去除重复值,可以用连接符“-”将“distinct”附加在聚集函数 名后,如sum-distinct。

聚集函数包括:

sum:求和。例如求001号学生的总成绩:sumscore(σs#=001(SC))

avg:求平均数。

count:计数。

max:求最大值。

min:求最小值。

聚集函数可以使用分组,将一个元组集合分为若干个组,在每个分组上使用聚集函数。它的形式是:属性下标G聚集函数属性下标(关系)。例如

学号G avg分数(成绩表)”得到每个学生的平均成绩。

分组运算G的一般形式是:G1,G2,...,GnGF1(A1),F2(A2),...,Fm(Am)(E)。在关系表达式E里,所有在G1,G2,...,Gn上相等的元组分成一组,分别在属性A1上执行F1,属性A2上执行F2,…,属性Am上执行Fm。


第四章 结构化查询语言

SQL可以分为两类:数据操作语言(Data Manipulation Language,DML)和数据定义语言(Data Definition Language,DDL)。

DML由查询和更新命令组成:

  • SELECT:从数据库中取出数据。
  • UPDATE:更新数据库的数据。
  • DELETE:从数据库中删除数据。
  • INSERT INTO:向数据库插入新数据。

DDL创建和删除数据库、创建和删除表、定义索引(关键字)、指定表之间的联系、定义表之间的约束。SQL里最重要的DDL的语句有:

  • CREATE DATABASE:创建一个新的数据库
  • ALTER DATABASE:修改一个数据库。
  • CREATE TABLE :创建一张新的表。
  • ALTER TABLE :修改一张表。
  • DROP TABLE :删除一张表。
  • CREATE INDEX :创建一个索引。
  • DROP INDEX :删除一个索引。

SELECT进行查询时,可以会有重复的记录。使用DISTINCT语句可以消除重复数据。比如:select distinct name from persons。使用WHERE可以指定查询的目标,比如:select * from persons where age >= 18。

WHERE 子句里允许的操作符有:
Operator Description
= Equal
<> Not equal
> Greater than
< Less than
>= Greater than or equal
<= Less than or equal
BETWEEN Between an inclusive range
LIKE Search for a pattern
IN To specify multiple possible values for a column

Note: In some versions of SQL the <> operator may be written as !=

IN的语法是

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)


BETWEEN的语法是:

SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2

在对字符串比较时,需要用单引号包围字符串常量(多数据数据库系统也接受双引号),数值不应该使用绰号。

LIKE比较时可以使用的通配符有:

Wildcard Description
% A substitute for zero or more characters
_ A substitute for exactly one character
[charlist] Any single character in charlist
[^charlist]

or

[!charlist]

Any single character not in charlist

在进行条件判断时,可以使用ANDOR来连接逻辑表达式。


可以使用ORDER BY对查询的结果进行排序,它的语法为

SELECT column_name(s)

FROM table_name

ORDER BY column_name(s) ASC|DESC

在mysql里,可以使用LIMIT子句来定义查询结果的最大数量。 比如:select * from persons order by age limit 1。会看到年纪最小的人。在SQL Server里等价的语句是

SELECT TOP number|percent column_name(s)
FROM table_name

注意limit和top都不是SQL标准。


INSERT用来插入数据,语法为:

INSERT INTO table_name
VALUES (value1, value2, value3,...)

The second form specifies both the column names and the values to be inserted:

INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)


UPDATE更新数据,语法为:

UPDATE table_name
SET column1=value, column2=value2,...
WHERE some_column=some_value

DELETE删除表示的行,语法为:

DELETE FROM table_name
WHERE some_column=some_value


AS 可以为表起别名:
SELECT column_name(s)
FROM table_name
AS alias_name


SQL里的连接

  • JOIN:自然连接;
  • LEFT JOIN:左外连接;
  • RIGHT JOIN:右外连接;
  • FULL JOIN:全外连接。

INNER JOIN 语法

SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name

LEFT JOIN 语法

SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name


RIGHT JOIN 语法

SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name

FULL JOIN 语法

SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name

UNION 求并集,语法为:

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

Note: The UNION operator selects only distinct values by default. To allow duplicate values, use UNION ALL.

UNION ALL保留重复的记录

SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

SELECT INTO 可以把查询结果写入一张表里

We can select all columns into the new table:

SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename

Or we can select only the columns we want into the new table:

SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename


CREATE DATABASE 语法

CREATE DATABASE database_name


CREATE TABLE 语法

CREATE TABLE table_name
(
column_name1 data_type,
column_name2 data_type,
column_name3 data_type,
....
)


SQL约束

约束限定可以插入表的数据的类型。它可以在表创建(CREATE TABLE)时指定,也可以在表创建手(用ALTER TABLE)指定。常用的约束有:

  • NOT NULL
  • UNIQUE
  • PRIMARY KEY
  • FOREIGN KEY
  • CHECK
  • DEFAULT

NOT NULL约束强制某一列不接受NULL值。比如:

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)


UNIQUE约束保证某列没有重复记录。在mysql中可以在创建表时有两种方法指定:

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
)

或:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
)

注意第二种方式可以同时指定多列,只有在这些列上都相等的记录才视为重复。

表创建后加入UNIQUE约束的方法是:

ALTER TABLE Persons
ADD UNIQUE (P_Id)


ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)

注意:如果该列中已经有重复的记录,那么加入约束会失败

删除UNIQUE约束

ALTER TABLE Persons
DROP INDEX uc_PersonID


创建PRIMARY KEY约束:

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)

修改表来加入PRIMARY KEY约束:

ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)

ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

删除PRIMARY KEY约束

ALTER TABLE Persons
DROP PRIMARY KEY


创建外键 FOREIGN KEY:

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)

修改表以创建FOREIGN KEY :

ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

删除FOREIGN KEY约束

ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders


创建  CHECK 约束:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
)


CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
)

修改表以创建CHECK约束

ALTER TABLE Persons
ADD CHECK (P_Id>0)


ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')


删除CHECK约束

ALTER TABLE Persons
DROP CONSTRAINT chk_Person


ALTER TABLE Persons
DROP CHECK chk_Person


创建DEFAULT约束:

My SQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)

修改表以创建DEFAULT约束:

ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'


ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'


删除DEFAULT约束

ALTER TABLE Persons
ALTER City DROP DEFAULT


创建AUTO INCREMENT约束,它只能作用在主键上:

CREATE TABLE Persons
(
P_Id int NOT NULL  AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)

我们可以设置自增的起始值:
ALTER TABLE Persons AUTO_INCREMENT=100

Indexes

索引用来提高数据查找的效率,用户看不到索引的存在。注意:使用索引会使更新表的速度变慢,因为数据更新的同时还要更新索引。

在表上创建一个允许重复值的索引

CREATE INDEX index_name
ON table_name (column_name)

在表上创建唯一的索引

CREATE UNIQUE INDEX index_name
ON table_name (column_name)

删除INDEX:

ALTER TABLE table_name DROP INDEX index_name


一个表上的约束可以通过SHOW INDEX FROMtbl_name来查看。mysql上可以通过修改一个列来增加约束:

ALTER TABLE t1 MODIFY col1 BIGINT UNSIGNED DEFAULT 1 COMMENT 'my column';
ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
但是要删除约束只能使用前面所述的drop ...的方式。


DROP TABLE 删除一张表:

DROP TABLE table_name


DROP DATABASE 删除一个数据库:

DROP DATABASE database_name


TRUNCATE TABLE可以删除一张表的所有数据而不删除该表:

TRUNCATE TABLE table_name


ALTER TABLE 可以修改一张表:

增加一列:
ALTER TABLE table_name
ADD column_name datatype

删除一列:

ALTER TABLE table_name
DROP COLUMN column_name

修改一列:

ALTER TABLE table_name ALTER COLUMN column_name datatype
ALTER TABLE t1 MODIFY col1 BIGINT UNSIGNED DEFAULT 1 COMMENT 'my column';
ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;


视图是基于一个SQL语句的结果集的一张虚拟表。视图的优点有:

提供了逻辑数据独立性。当数据的逻辑结构发生改变时,原有的应用程序不用修改。

简化了用户观点。用户只需用到数据库中的一部分,视图适应了用户需要。

数据的安全保护功能。针对不同用户定义不同视图。


创建视图

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

更新视图
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

删除视图
DROP VIEW view_name


MySQL的日期函数

Function Description
NOW() Returns the current date and time
CURDATE() Returns the current date
CURTIME() Returns the current time
DATE() Extracts the date part of a date or date/time expression
EXTRACT() Returns a single part of a date/time
DATE_ADD() Adds a specified time interval to a date
DATE_SUB() Subtracts a specified time interval from a date
DATEDIFF() Returns the number of days between two dates
DATE_FORMAT() Displays date/time data in different formats


MySQL日期数据类型

  • DATE - format YYYY-MM-DD
  • DATETIME - format: YYYY-MM-DD HH:MM:SS
  • TIMESTAMP - format: YYYY-MM-DD HH:MM:SS
  • YEAR - format YYYY or YY


IS NULL  操作符判断空值:
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL


IS NOT NULL 操作符判断非空值:

SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL

MySQL没有ISNULL函数,所以它使用IFNULL

SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products

COALESCE()函数:

SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products


MySQL数据类型

MySQL有三种主要类型:text, number和Date/Time。

Text types:

Data type Description
CHAR(size) Holds a fixed length string (can contain letters, numbers, and special characters). The fixed size is specified in parenthesis. Can store up to 255 characters
VARCHAR(size) Holds a variable length string (can contain letters, numbers, and special characters). The maximum size is specified in parenthesis. Can store up to 255 characters.Note: If you put a greater value than 255 it will be converted to a TEXT type
TINYTEXT Holds a string with a maximum length of 255 characters
TEXT Holds a string with a maximum length of 65,535 characters
BLOB For BLOBs (Binary Large OBjects). Holds up to 65,535 bytes of data
MEDIUMTEXT Holds a string with a maximum length of 16,777,215 characters
MEDIUMBLOB For BLOBs (Binary Large OBjects). Holds up to 16,777,215 bytes of data
LONGTEXT Holds a string with a maximum length of 4,294,967,295 characters
LONGBLOB For BLOBs (Binary Large OBjects). Holds up to 4,294,967,295 bytes of data
ENUM(x,y,z,etc.) Let you enter a list of possible values. You can list up to 65535 values in an ENUM list. If a value is inserted that is not in the list, a blank value will be inserted.

Note: The values are sorted in the order you enter them.

You enter the possible values in this format:ENUM('X','Y','Z')

SET Similar to ENUM except that SET may contain up to 64 list items and can store more than one choice


Number types:

Data type Description
TINYINT(size) -128 to 127 normal. 0 to 255 UNSIGNED*. The maximum number of digits may be specified in parenthesis
SMALLINT(size) -32768 to 32767 normal. 0 to 65535 UNSIGNED*. The maximum number of digits may be specified in parenthesis
MEDIUMINT(size) -8388608 to 8388607 normal. 0 to 16777215 UNSIGNED*. The maximum number of digits may be specified in parenthesis
INT(size) -2147483648 to 2147483647 normal. 0 to 4294967295 UNSIGNED*. The maximum number of digits may be specified in parenthesis
BIGINT(size) -9223372036854775808 to 9223372036854775807 normal. 0 to 18446744073709551615 UNSIGNED*. The maximum number of digits may be specified in parenthesis
FLOAT(size,d) A small number with a floating decimal point. The maximum number of digits may be specified in the size parameter. The maximum number of digits to the right of the decimal point is specified in the d parameter
DOUBLE(size,d) A large number with a floating decimal point. The maximum number of digits may be specified in the size parameter. The maximum number of digits to the right of the decimal point is specified in the d parameter
DECIMAL(size,d) A DOUBLE stored as a string , allowing for a fixed decimal point. The maximum number of digits may be specified in the size parameter. The maximum number of digits to the right of the decimal point is specified in the d parameter

*The integer types have an extra option called UNSIGNED. Normally, the integer goes from an negative to positive value. Adding the UNSIGNED attribute will move that range up so it starts at zero instead of a negative number.

Date types:

Data type Description
DATE() A date. Format: YYYY-MM-DD

Note: The supported range is from '1000-01-01' to '9999-12-31'

DATETIME() *A date and time combination. Format: YYYY-MM-DD HH:MM:SS

Note: The supported range is from '1000-01-01 00:00:00' to '9999-12-31 23:59:59'

TIMESTAMP() *A timestamp. TIMESTAMP values are stored as the number of seconds since the Unix epoch ('1970-01-01 00:00:00' UTC). Format: YYYY-MM-DD HH:MM:SS

Note: The supported range is from '1970-01-01 00:00:01' UTC to '2038-01-09 03:14:07' UTC

TIME() A time. Format: HH:MM:SS

Note: The supported range is from '-838:59:59' to '838:59:59'

YEAR() A year in two-digit or four-digit format.

Note: Values allowed in four-digit format: 1901 to 2155. Values allowed in two-digit format: 70 to 69, representing years from 1970 to 2069



SQL聚集函数计算某列的各值,返回单一值。

有用的集体函数有:

  • AVG() -平均数
  • COUNT() -计数
  • FIRST() -第一个值
  • LAST() -最后一个值
  • MAX() -最大值
  • MIN() -最小值
  • SUM() -求和

这些函数会计算重复值,可以使用DISTINCT来消除重复,比如:select sum(distinct age) from persons。

结果也可以用AS来起别名,比如select sum(age) as MySum from persons。


在MySql里没有first和last,所以

SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders

等价于:

SELECT OrderPrice FROM Orders ORDER BY O_Id LIMIT 1


SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders

等价于:

SELECT OrderPrice FROM Orders ORDER BY O_Id DESC LIMIT 1


GROUP BY可以根据记录在某列上的值把表的记录分组,然后分别计算各组的聚集函数的值。它也能指定多个列比如:

SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders
GROUP BY Customer,OrderDate

HAVING可以在查询时使用一个聚集函数来指定条件,它之前必须可以有group by修饰:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value


Having与WHERE的区别是:

where决定哪些元组被选择参加运算,作用于关系中的元组;

Having决定哪些分组符合要求,作用于分组;

聚集函数的条件关系必须用Having,Where不应该出现聚集函数。


SQL标量函数基于输入值返回单个值。有用的标量函数有:

  • UCASE() -转换成大写。
  • LCASE() - 转换成小写。
  • MID() - 抽取子字符串。
  • LEN() - 得到字符串的长度。
  • ROUND() - 舍取一个小数。
  • NOW() - 返回当前日期和时间。
  • FORMAT() - 格式化显示。

SQL UCASE() 语法

SELECT UCASE(column_name) FROM table_name

SQL MID() 语法

SELECT MID(column_name,start[,length]) FROM table_name

SQL ROUND() 语法

SELECT ROUND(column_name,decimals) FROM table_name

SQL FORMAT() 语法

SELECT FORMAT(column_name,format) FROM table_name

Parameter Description
column_name Required. The field to be formatted.
format Required. Specifies the format.


参考:http://www.w3schools.com/sql


第五章 数据库设计

软件工程与软件生命周期

软件生存期是指从软件的规划、研制、实现、测试、投入运行后的维护,直到它被新的软件所取代而停止使用的整个历程。


数据库工程与数据库生存期

数据库应用系统从规划、设计、实现、测试、运行中的维护到最后被新的系统取代而停止使用的整个期间,称为数据库生存期。它包括规划、需求分析、概念设计、逻辑设计、物理设计、实现、运行和维护


数据库设计的输入输出

输入:总体信息需求、处理需求、DBMS的特征、硬件和OS特征。

输出:完整的数据库结构、基于数据库结构和处理需求的应用程序设计原则。


数据库设计的阶段划分

规划阶段:系统调查、可行性分析、确定数据库系统的总目标和制定项目开发计划。

需求分析阶段:分析用户活动,产生业务流程图;确定系统范围,产生系统范围图;分析用户活动设计的数据,产生数据流图;分析系统数据,产生数据字典。

概念设计阶段:进行数据抽象,设计局部概念模式;将局部概念模式综合成全局概念模式。

逻辑设计阶段:从之前得到的概念模式出发,1、导出初始DBMS模式说明;2、子模式设计和应用程序设计草图;3、模式评价;4,如果处理结束,则进入物理设计阶段,否则进入下一步;5、检查模式是否需要修正,如果需要则修正模式,并回到第2步,否则回到前面的阶段。

物理设计阶段:存储记录结构设计;确定数据存放位置;存取方法的设计;完整性和安全性考虑;程序设计。

数据库实现:定义数据库结构;数据装载(大型应用和小型应用);编制和调试应用程序;数据库试运行。

数据库的运行与维护:数据库的转储和恢复;数据安全性、完整性控制;数据库性能的监督,分析和改进;数据库的重组织和重构造。


之前所述的总体信息需求在需求分析和概念设计中被使用;处理需求在需要分析、逻辑设计、物理设计阶段中都有使用;DBMS特征在逻辑设计和物理设计阶段中被使用;硬件和OS特征只在物理设计阶段被使用。


第六章 关系数据库的规范化理论

问题的提出

设有关系模式R(姓名,电话,参与的俱乐部,俱乐部的活动),候选码为(姓名,参与的俱乐部)。


姓名 电话 参与的俱乐部 俱乐部的活动
A 123 乒乓club 打乒乓球
A 123 登山club 爬山
B 456 乒乓club 打乒乓球
B 456 英语club 学习英语
C 789 登山club 爬山
C 789 英语club 学习英语

注意到上面的模式有什么问题?

1、数据冗余:一个人参与几个俱乐部,那么他的电话会重复几次;同样,一个俱乐部被几个人参加,它的活动就会重复几次。

2、修改异常:一旦一个人的手机号变化,那么对应于他参与的每个俱乐部的各行里的电话都需要修改,如果有遗漏,那么会造成数据不一致;俱乐部的活动也是如此。

3、插入异常:如果一个新人到来,还未参加任何俱乐部,那么他的信息和电话就无法插入到这张表里,因为参与的俱乐部是主属性,不能为空。

4、删除异常:如果某人暂时退出了所有的俱乐部,那么必须把所有的元组都删去,这样这个人的姓名和电话信息也不存在了。


问题的解决方式是把关系模式R分解成三个模式:

姓名 电话
A 123
B 456
C 789

俱乐部 活动
乒乓club 打乒乓球
英语club 学习英语
登山club 爬山

姓名 参与的俱乐部
A 乒乓club
A 登山club
B 乒乓club
B 英语club
C 登山club
C 英语club


函数依赖(FD,Functional Dependency)

实际上关系模式的更新异常是由属性间的数据依赖引起的,数据依赖指数据之间存在着某种内在的联系,如姓名和电话之间,每一个人都有一个确定的电话,姓名的一个取值可以确定唯一的地址。

函数依赖的概念为:设有关系模式R(U),X和Y是属性集U的子集,函数依赖是形为XY的一个命题,只要有r是R的当前关系,对r中的任意两个元组t和s,都有t[X] = s[X]蕴涵t[Y] = s[Y],那么称函数依赖XY在关系模式R(U)中成立。比如前面的U是(姓名,电话,参与的俱乐部,俱乐部的活动),子集X为(姓名),子集Y为(电话)。

函数依赖的文字化定义:设R(U)是属性集U上的关系模式,X、Y是U的子集,若对于R(U)的任意一个可能的关系r,R中不可能存在两个元组在X的属性值上相等,而在Y上的属性值不等,则称“X函数确定Y”,或“Y函数依赖于X”,记作XY。例如姓名电话。

FD的推理规则有:

基本规则:

1、自反性:Y⊆X  X Y

2、增广性:XZ YZ

3、传递性:X Y, Y  X Z

扩展规则:

4、合并性:{X Y, X Z}  X YZ

5、分解性:{X Y, Z ⊆ Y}  X Z

6、伪传递性:{X Y, WY Z}  WX Z

7、复合性:{X Y, W Z}  WX YZ


函数依赖的性质有:

1、若XY,但X ⊄ Y,则称XY是非平凡的函数依赖,一般不特殊指明的情况下,我们总是讨论非平凡函数依赖。

2、若XY,则称X是决定因素。

3、若Y不函数依赖于X,则记作XY

4、若XY,YX,则称X与Y一一对应,记为XY。

在R(U)中,如果XY,并且对于X的任意一个真子集X',都有X'Y,则称Y完全函数依赖于X,或Y对X完全函数依赖,记作X-f->Y,否则称Y对X部分函数依赖X-p->Y

在关系模式R(U)中,如果XY,(X ⊄ Y),YZ,则称Z对X传递函数依赖

设K为R中的属性或属性组,若K-f->u,则K为R的候选码,若候选码多于一个,则选其中一个作为主码。特殊情况:所有属性构成码,称为全码。包含在任何一个候选码中的属性,叫主属性(Prime Attribute),不包含在任何码中的属性为非主属性,或非码属性

关系模式R中属性或属性组X并非R的主码,但它是另一个关系模式的主码,则称X是R的外码(Foreign Key)。关系间是通过主码和外码进行联系的。


规范化理论

1971年起E.F.Codd提出了规范化理论。该理论按属性间的依赖情况(如函数依赖)规范关系模式。按规范化的程度不同分为第一范式1NF(Normal Form)、2NF、3NF、BCNF及4NF,逐步消除更新异常问题。

若R属于第几范式,一般记为R∈XNF,一个低一级范式的关系模式,通过模式分解总可以将它分解为若干个高一级范式的关系模式的结合,这种过程就叫规范化

设有关系模式R(U),属性集为U,R1、……、Rk都是U的子集,并且有R1∪R2∪……∪Rk=U。关系模式R1,……,Rk的集合用ρ={R1,……,Rk}。用ρ代替R的过程为关系模式的分解


1NF指每一个分量都是不可分的,这是最基本的规范化。即关系的所有属性都只能是预定义的简单变量,如整型,而不能是结构体。

2NF的定义为:如果R∈1NF,且每个非主属性完全函数依赖于码,则R∈2NF。如本章最开始提出的问题,在属性性(姓名,电话,参与的俱乐部,俱乐部的活动)里,候选码为(姓名,参与的俱乐部),即姓名和参与的俱乐部是主属性,但是“电话”部分函数依赖于“姓名”,并没有完全函数依赖于码;“俱乐部的活动”同样也部分函数依赖于“俱乐部”。它便是由于违反了2NF,才造成了更新异常。而表的拆分便是关系模式的分解

3NF的定义:关系模式R中若不存在这样的码X,属性组Y及非主属性Z(Z⊄Y),便利XY,YZ成立,则称R∈3NF。

比如关系

员工 所在分公司 分公司总裁

其中“员工”是主码,员工所在分公司,所在分公司分公司总裁。所以它违反了3NF。它造成的问题有修改异常:员工换了分公司的话,总裁属性也必须修改。遗漏会造成数据不一致。我们可以把它模式分解为:

员工 所在分公司
分公司 总裁

2NF、3NF有一个缺陷:它们只限制了主码对非主属性的部分函数依赖或传递函数依赖,但并没有对主属性进行限制。

比如

学号 姓名 课程名

假定姓名没有重名的,那么(学号,课程名)和(姓名,课程名)都可以是候选键,也就是说三个属性都是主属性。如果我们选取(学号,课程名)作为主码,有(学号,姓名)学号,学号姓名的传递依赖,也可以理解为部分依赖,但是因为姓名是主属性,所以这个关第符合2NF、3NF。然而,它有之前讨论过的冗余和更新异常的问题。

BCNF(Boyce Codd Normal Form)是由Boyce和Codd提出的,比3NF又进一步,通常认为BCNF是修正的第三范式,有时也称为3NF。它的定义为:如果关系模式R是1NF,且每个属性(包括主属性)都不传递依赖于R的候选键,那么称R是BCNF范式。若R∈BCNF,则R∈3NF。


范式是衡量关系模式好坏的标准,它与数据依赖有着直接的联系。1NF是关系模式的基础(对象模式违背了1NF),2NF已经称为历史,3NF和BCNF是最为常见的范式。


第七章 数据存储


物理存储媒介的分类

高速缓冲区:现今的AMD和Intel的CPU都在芯片内部集成了数据高速缓存和指令高速缓存,通称了L1高速缓存;比L1更大的L2高速缓存曾放在CPU外部的主板或CPU接口上,现在已经成为CPU内部的标准部件了;高端家用机或工作站甚至配备了L3缓存器。高速缓存使用静态随机存取存储器StaticRandomAccessMemory, SRAM)技术,比主存的DRAM技术快。


主存储区:使用动态随机存取(Dynamic Random Access Memory,DRAM)技术,性价比很高,扩展性也不错。DRAM里面所储存的数据需要周期性地更新,所以比SRAM较慢。最近生产的(2010年后)计算机主要使用的主存是DDR 3 SDRAM(第三代双倍资料率同步动态随机存取内存,Double-Data-Rate Three Synchronous Dynamic Random Access Memory)。


快擦写存储器:一种EEPROM芯片,EEPROM,或写作E2PROM,全称电子抹除式可复写只读内存 (Electrically-Erasable Programmable Read-Only Memory),是一种可以通过电子方式多次复写的半导体存储设备。相比EPROMErasable Programmable Read Only Memory可擦除可编程式只读内存),EEPROM不需要用紫外线照射,也不需取下,就可以用特定的电压,来抹除芯片上的信息,以便写入新的数据。EEPROM被广泛用于需要经常擦除的BIOS芯片,以及快闪存储器Flash Memory,简称闪存),并逐步替代部分有断电保留需要的RAM芯片,甚至取代部份的硬盘功能(固态硬盘Solid State DiskSolid State Drive,简称SSD)。

磁盘存储器:利用磁记录技术在涂有磁记录介质的旋转圆盘上进行数据存储的辅助存储器。具有存储容量大、数据传输率高、存储数据可长期保存等特点。


光存储器:由光盘驱动器和光盘片组成的光盘驱动系统,光存储技术是一种通过光学的方法读写数据的一种技术,它的工作原理是改变存储单元的某种性质的反射率,反射光极化方向,利用这种性质的改变来写入存储二进制数据.在读取数据时,光检测器检测出光强和极化方向等的变化,从而读出存储在光盘上的数据.由于高能量激光束可以聚焦成约0.8μm的光束,并且激光的对准精度高,因此它比硬盘等其他存储技术具有较高的存储容量.


磁带:一种用于记录声音、图像、数字或其他信号的载有磁层的带状材料,是产量最大和用途最广的一种磁记录材料。作为数字信息的存贮具有容量大、价格低的优点。主要大量用于计算机的外存贮器。目前仅在专业设备上使用(比如车床控制机)。


数据存储文件的组织结构

堆文件:Heap File。插入的记录被添加到文件的末尾,因此文件是无序的。记录被删除时,会在文件中间留下空白行,所以堆文件需要周期性地压缩来恢复空间。

顺序文件:Sequential File。记录以查找键的升序或降序的顺序存储。文件在载入到内存里时,可以以随机方式读取数组,比如可用二分查找法来优化查找时间。但把新记录写入到文件时,必须以顺序方式。

散列文件:Hash File。记录存储的地址(块号)是记录的某个属性值通过散列函数求得的值。

聚集文件:Cluster File。“聚集(Clustering)”的意义是为了访问的效率把相关的数据存储在一起。多个数据库和多上表被合并(join)被称为聚集(cluster)。共享同一个聚集关键字的表被存储在一起,在相同或相邻的数据块里。这样可以提升表在聚集关键字上进行的聚集操作的效率。


第八章 索引机制

索引的概念:在数据文件中,根据记录建立的一种数据结构,以次线性时间查找(sublinear time lookup)来加快查询速度。索引也用来监管数据库约束,比如unique、exclusion、primary key和foreign key。

索引的架构(Index architecture)

非簇集索引(Non-Clustered):数据以任意序表示,但索引指明了它的逻辑序(logical ordering)。数据行无视被索引的列的值而遍布在表中,但非簇集索引树包含排好序的索引关键字,并在叶子级包含记录的指针(页结构引擎(page-organized engines)里的页和数据页里的行号;文件结构引擎(file-organized engines)里的行偏移量)。

在非簇集索引里,数据存储的顺序和索引不同。索引通常在join、where、和order by语句里使用的非主键列上创建。在一个数据库表上,可以创建多个非簇集索引。

簇集索引(Clustered):数据块以特定的顺序聚集来匹配索引,导致行数据顺序存储。因此,一张表只能创建一个簇集索引。如果文件记录以非码字段排序,那么这个字段称为簇集字段(cluster field)。

有些数据库把簇集索引和记录分开存储在不同文件里,而其它一些则把它们存储在同一文件的不同数据块里。簇集索引里包含有序的记录,每个记录包含两人个字段。第一个字段和数据的簇集字段有相同的数据类型;第二个字段是一个指针。

当数据以和簇集索引相同或相反的顺序访问,或选择一个范围里的数据时,簇集索引可以大幅提升访问速度。


索引的类型(Types of indexes

位图索引(Bitmap index:一种特殊的索引,把它的大块数据存储在位数组(bit array)里,也就是位图里。多数查询都通过位逻辑操作来完成。如果索引的值不重复或只重复较少的次数时,那么最普遍使用的索引,比如b+tree,是最高效的。相反,位图索引被设计用在变量值频繁重复的情况下。比如只有“男”和“女”的性别属性。

稠密索引(Dense index):数据文件里的每个记录所对应的“关键字-指针”对所组成的文件。也就是说,数据文件里每个记录都有索引。在有重复关键字的簇集索引里,稠密索引指向该关键字的第一条记录。

稀疏索引(Sparse index):或非稠密索引(nondense index)。数据文件里的每个都有相应的“关键字-块”对。在有重复关键字的簇集索引里,块指针指向每个块的最小的搜索键(lowest search key)。

逆索引(Reverse index):在把关键字插入到索引之前,把关键字翻转。比如:值12345在索引里成为54321。它对于索引诸如序号(sequence number,单调增加的值)的值非常有用,特别是在大容量的事务处理系统(Transaction processing system)上,因为它们可以减少索引块的竞争。

逆索引使用b-tree结构实现。


主索引和辅索引

主索引(Primary Key)建立在有序文件中的排序码字段上。辅索引(Secondary Key)指定在文件的任何非排序字段上。同一个文件只能有一个主存取方式,但是可以有多个辅助索引,从而有多个索引字段。当辅索引建立在码上时,该码字段被称为辅码(Secondary Key)。


索引文件的组织:线性索引、树形索引和散列索引。


第九章 并发控制和故障恢复

事务、并发控制的概念

事务(Transaction)是构成单一逻辑工作单元的操作集合。

在多用户在线共享系统中,许多事务可能同时对同一数据进行操作,称为并发操作。并发可能导致的问题有:丢失更新问题、读胀数据问题、错误求和问题、和不可重复读问题等等。

并发控制负责协调并发事务的执行,保证数据库的完整性,同时避免用户得到不正确的数据。


事务的基本属性

原子性(Atomicity):一个事务对数据库的所有操作,是一个不可分割的工作单元。这些操作要么全部执行,要么什么也不做。

一致性(Consistency):一个事务独立执行的结果,应保持数据库的一致性,即数据不会因事务的执行而遭到破坏。

隔离性(Isolation):在多个事务并发执行时,系统应保证与这些事务先后独立执行的结果一样。

持久性(Durability):一个事务一旦完成全部操作后,他对数据库的所有更新应永久地反映在数据库中。

这些属性的首字母缩写为ACID。其中原子性是最主要的根本目标;其它三个是辅助的属性。


第十章 数据库完整性机制

数据库完整性的概念

与关系数据库的完整性不同,数据库完整性表示数据的正确性(accurate)、有效性(valid)和相容性(consistent),防止错误的数据进入数据库。

正确性指数据的合法性;

有效性指数据是否属于所定义的有效范围;

相容性指表示同一事实的两个数据应相同。

在对数据库提交修改前,必须要满足所应用的完整性约束(Integrity constraints)和数据验证(Data validation)。

完整性除了在第三章所述的实体完整性(Entity Integrity)、参照完整性(Referential Integrity)、和用户定义完整性(User Defined Integrity),还有域完整性(Domain Integrity):数据必须为预定义的数据类型,同时属性值的限制:比如取值范围,没有提供值时的默认值,以及是否可以为空等。


完整性子系统

DBMS中执行完整性检查的子系统称为“完整性子系统”。它检测事务的执行,并测试是否违反完整性的规则。若有违反完整性规则,则采取适当的操作。


完整性规则集

完整性规则集是由DBA或应用程序员事先向完整性子系统提供的有关数据约束的一组规则。它由以下部分组成:

1、什么时候使用规则进行检查(称为规则的触发条件);

2、要检查什么样的错误(称为约束条件或谓词);

3、如果查出错误,应该怎么办(称为“ELSE子句”,即违反时要做的动作)。


SQL完整性约束分类

域约束:在域定义中定义的一种约束。域约束与在特定域中定义的任何列有关。


断言:在断言定义中定义一种约束。断言可以与一个或多个表进行关联。

断言仅仅是一种可以用于多个表的CHECK约束,因此必须在表定义之外独立的创建断言。


与表相关的约束:它是在表定义中定义的一种约束。该约束可以被定义为列定义的一部分,或者定义为表定义中的一个元素。在表级别定义的约束可以应用于一个或多个列。

列约束:NOT NULL,UNIQUE PRIMARY KEY,FOREIGN KEY,CHECK

表约束:UNIQUE PRIMARY KEY,FOREIGN KEY,CHECK


第十一章 数据库安全机制

数据库安全性机制的概念

数据库的安全是指保护数据库,防止不合法的使用,导致数据的泄密、更改或破坏。


安全性的级别

环境级:计算机系统的机房和设备应加以保护,防止有人进行物理破坏。

职员级:工作人员应清正廉洁,正确授予用户访问数据库的权限。

OS级:应防止未经过授权的用户从OS处着手访问数据库。

网络级:由于大多数DBS都允许用户通过网络进行远程访问,因此网络软件内部的安全性是很重要的。

DBS级:DBS的职责是检查用户的身份是否合法以及使用数据库的权限是否正确。


授权子系统

自主访问控制(DAC)

自主访问控制机制允许对象的属主来制定针对该对象的保护策略。通常DAC通过授权列表(或访问控制列表)来限定哪些主体针对哪些客体可以执行什么操作。如此将可以非常灵活地对策略进行调整。由于其易用性与可扩展性,自主访问控制机制经常被用于商业系统。

六种权限:SELECT、INSERT、DELETE、UPDATE、REFERENCES、和USAGE。

赋予权限:GRANT <权限表> ON <数据库元素> TO <用户名表> [WITH GRANT OPTION]

收回权限:REVOKE <权限表> ON <数据库元素> FROM <用户名表> [RESTRICT | CASCADE]


强制访问控制(MAC)

用来保护系统确定的对象,对此对象用户不能进行更改。也就是说,系统独立于用户行为强制执行访问控制,用户不能改变他们的安全级别或对象的安全属性。这样的访问控制规则通常对数据和用户按照安全等级划分标签,访问控制机制通过比较安全标签来确定的授予还是拒绝用户对资源的访问。强制访问控制进行了很强的等级划分,所以经常用于军事用途。


视图机制

用来对无权用户屏蔽数据。数据安全,逻辑数据独立性和操作简便性。


数据加密

常用的数据库加密技术有:库外加密库内加密硬件加密

你可能感兴趣的:(数据库学习)