第一章 绪论
1. 数据库系统概述
1.1 四个基本概念
1.1.1 数据(Data)
数据是数据库中存储的基本对象,其定义为:描述事物的符号记录。
数据的种类包括:文本、图形、图像、音频、视频、学生的档案记录、货物的运输情况等。
数据的特点有:数据与其语义是不可分的
1.1.2 数据库(Database)
数据库是长期储存在计算机内、有组织的、可共享的大量数据的集合。
数据库的基本特征:
- 数据按一定的数据模型组织、描述和储存
- 可为各种用户共享
- 冗余度较小
- 数据独立性较高
- 易扩展
1.1.3 数据库管理系统(DBMS)
是位于用户与操作系统之间的一层数据管理软件。
是基础软件,是一个大型复杂的软件系统
DBMS的主要功能:
- 数据定义功能
提供数据定义语言(DDL)。
定义数据库中的数据对象。 - 数据组织、存储和管理
分类组织、存储和管理各种数据。
确定组织数据的文件结构和存取方式。
实现数据之间的联系。
提供多种存取方法提高存取效率。 - 数据操纵功能
提供数据操纵语言(DML)。
实现对数据库的基本操作(查询、插入、删除和修改)。 - 数据库的事务管理和运行管理
数据库在建立、运行和维护时由DBMS统一管理和控制。
保证数据的安全性、完整性、多用户对数据的并发使用。
发生故障后的系统恢复。 - 数据库的建立和维护功能(实用程序)
数据库初始数据装载转换。
数据库转储。
介质故障恢复。
数据库的重组织。
性能监视分析等。 - 其它功能
DBMS与网络中其它软件系统的通信。
两个DBMS系统的数据转换。
异构数据库之间的互访和互操作。
1.1.4 数据库系统(DBS)
数据库系统的构成
- 数据库
- 数据库管理系统(及其开发工具)
- 应用系统
- 数据库管理员
1.2 数据管理技术的产生和发展
1.2.1 什么是数据管理
对数据进行分类、组织、编码、存储、检索和维护
数据处理的中心问题
1.2.2 数据管理技术的发展过程
人工管理阶段(20世纪40年代中–50年代中)
文件系统阶段(20世纪50年代末–60年代中)
数据库系统阶段(20世纪60年代末–现在)
1.3 数据库系统的特点
- 数据结构化
- 数据的共享性高,冗余度低,易扩充
- 数据独立性高
- 数据由DBMS统一管理和控制
2. 数据模型
通俗地讲数据模型就是现实世界的模拟。
数据模型应满足三方面要求
- 能比较真实地模拟现实世界
- 容易为人所理解
- 便于在计算机上实现
2.1 两大类数据模型
数据模型分为两类(分属两个不同的层次)
(1) 概念模型
也称信息模型,它是按用户的观点来对数据和信息建模,用于数据库设计。
(2) 逻辑模型和物理模型
逻辑模型主要包括网状模型、层次模型、关系模型、面向对象模型等,按计算机系统的观点对数据建模,用于DBMS实现。
物理模型是对数据最底层的抽象,描述数据在系统内部的表示方式和存取方法,在磁盘或磁带上的存储方式和存取方法。
2.2 数据模型的组成要素
- 数据结构,数据结构是对系统静态特性的描述。
- 数据操作,数据操作是对系统动态特性的描述。
- 完整性约束条件,一组完整性规则的集合。
2.3 概念模型
(1) 实体(Entity)
客观存在并可相互区别的事物称为实体。
可以是具体的人、事、物或抽象的概念。
(2) 属性(Attribute)
实体所具有的某一特性称为属性。
一个实体可以由若干个属性来刻画。
(3) 码(Key)
唯一标识实体的属性集称为码。
(4) 域(Domain)
属性的取值范围称为该属性的域。
(5) 实体型(Entity Type)
用实体名及其属性名集合来抽象和刻画同类实体称为实体型
(6) 实体集(Entity Set)
同一类型实体的集合称为实体集
(7) 联系(Relationship)
现实世界中事物内部以及事物之间的联系在信息世界中反映为实体内部的联系和实体之间的联系。
实体内部的联系通常是指组成实体的各属性之间的联系
实体之间的联系通常是指不同实体集之间的联系
2.4 概念模型的一种表示方法
实体-联系方法(E-R方法)
用E-R图来描述现实世界的概念模型
实体型:用矩形表示,矩形框内写明实体名。
属性:用椭圆形表示,并用无向边将其与相应的实体连接起来。
联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体连接起来,同时在无向边旁标上联系的类型(1:1、1:n或m:n)
2.5 最常用的数据模型
2.6 层次模型
2.7 网状模型
2.8 关系模型
3. 数据库系统结构
3.1 数据库系统模式的概念
3.1.1 “型” 和“值” 的概念
型(Type)
对某一类数据的结构和属性的说明
值(Value)
是型的一个具体赋值
3.1.2 模式和实例的概念
模式(Schema)
数据库逻辑结构和特征的描述
是型的描述
反映的是数据的结构及其联系
模式是相对稳定的
实例(Instance)
模式的一个具体值
反映数据库某一时刻的状态
同一个模式可以有很多实例
实例随数据库中的数据的更新而变动
3.2 数据库系统的三级模式结构
3.2.1 模式(Schema)
模式(也称逻辑模式)
数据库中全体数据的逻辑结构和特征的描述
所有用户的公共数据视图,综合了所有用户的需求
一个数据库只有一个模式
模式的地位:是数据库系统模式结构的中间层
与数据的物理存储细节和硬件环境无关
与具体的应用程序、开发工具及高级程序设计语言无关
模式的定义
数据的逻辑结构(数据项的名字、类型、取值范围等)
数据之间的联系
数据有关的安全性、完整性要求
3.2.2 外模式(External Schema)
外模式(也称子模式或用户模式)
数据库用户(包括应用程序员和最终用户)使用的局部数据的逻辑结构和特征的描述
数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
外模式的地位:介于模式与应用之间
外模式的用途
保证数据库安全性的一个有力措施
每个用户只能看见和访问所对应的外模式中的数据
3.2.3 内模式(Internal Schema)
内模式(也称存储模式)
是数据物理结构和存储方式的描述
是数据在数据库内部的表示方式
记录的存储方式(顺序存储,按照B树结构存储,按hash方法存储)
索引的组织方式
数据是否压缩存储
数据是否加密
数据存储记录结构的规定
一个数据库只有一个内模式
3.3 数据库的二级映像功能与数据独立性
三级模式是对数据的三个抽象级别
二级映象在DBMS内部实现这三个抽象层次的联系和转换
外模式/模式映像
模式/内模式映像
模式:描述的是数据的全局逻辑结构
外模式:描述的是数据的局部逻辑结构
同一个模式可以有任意多个外模式
每一个外模式,数据库系统都有一个外模式/模式映象,定义外模式与模式之间的对应关系
映象定义通常包含在各自外模式的描述中
保证数据的逻辑独立性
当模式改变时,数据库管理员修改有关的外模式/模式映象,使外模式保持不变
应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。
4. 数据库系统的组成
数据库
数据库管理系统(及其开发工具)
应用系统
数据库管理员
第二章 关系数据库
参考文章:
数据库——元组关系演算语言ALPHA
数据库——关系演算ALPHA例题
数据库关系模型之关系演算:存在量词和全称量词的使用
元组关系演算ALPHA——如何使用量词与蕴含
1. 关系数据结构及形式化定义
单一的数据结构—-关系
现实世界的实体以及实体间的各种联系均用关系来表示
逻辑结构—-二维表
从用户角度,关系模型中数据的逻辑结构是一张二维表
关系数据结构是建立在集合代数的基础上
1.1 介绍一下
1.1.1 域是一组具有相同数据类型的值的集合
1.1.2 笛卡尔积
1.1.3 元组(Tuple)
1.1.4 分量(Component)
1.1.5 基数(Cardinal number)
1.1.6 码
2. 关系操作
常用的关系操作
查询:选择、投影、连接、除、并、交、差
数据更新:插入、删除、修改
查询的表达能力是其中最主要的部分
选择、投影、并、差、笛卡尔基是5种基本操作
关系操作的特点
集合操作方式:操作的对象和结果都是集合,一次一集合的方式
3. 关系的完整性
- 实体完整性,若属性A是基本关系R的主属性,则属性A不能取空。
实体完整性规则的说明
(1) 实体完整性规则是针对基本关系而言的。一个基本表通常对应现 实世界的一个实体集。
(2) 现实世界中的实体是可区分的,即它们具有某种唯一性标识。
(3) 关系模型中以主码作为唯一性标识。
(4) 主码中的属性即主属性不能取空值。
主属性取空值,就说明存在某个不可标识的实体,即存在不可区
分的实体,这与第(2)点相矛盾,因此这个规则称为实体完整性 - 参照完整性
什么是外码,什么是参照关系和被参照关系?设F是基本关系R的一个或一组属性,但不是关系R的码。如果F与基本关系S的主码K相对应,则称F是基本关系R的外码
基本关系R称为参照关系(Referencing Relation)
基本关系S称为被参照关系(Referenced Relation)或目标关系(Target Relation)
参照完整性的规则
若属性(或属性组)F是基本关系R的外码它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:或者取空值(F的每个属性值均为空值)或者等于S中某个元组的主码值 - 用户定义的完整性
针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求
关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不要由应用程序承担这一功能
4. 关系代数(非常重要)
- R∪S:仍为n目关系,由属于R或属于S的元组组成
- R∩S:仍为n目关系,由既属于R又属于S的元组组成
- R-S:仍为n目关系,由属于R而不属于S的所有元组组成
- R×S:广义的笛卡尔积
- 象集:
- 选择:就是选择当前表中符合条件的行(也叫元组)
选择运算是从关系R中选取使逻辑表达式F为真的元组,是从行的角度进行的运算 - 投影:就是选择当前表中符合条件的列(也叫属性)
选择运算是从关系R中选取使逻辑表达式F为真的属性,是从列的角度进行的运算 - 连接:连接运算是从R和S的广义笛卡尔积R×S中选取(R关系)在A属性组上的值与(S关系)在B属性组上值满足比较关系θ的元组。
有两类常用连接运算:
等值连接(equijoin):θ为“=”的连接运算称为等值连接
自然连接(Natural join):自然连接是一种特殊的等值连接,两个关系中进行比较的分量必须是相同的属性组,在结果中把重复的属性列去掉。 - 外连接
如果把舍弃的元组也保存在结果关系中,而在其他属性上填空值(Null),这种连接就叫做外连接(OUTER JOIN)。 - 左外连接(可以看成自然连接后,左边关系哪个元组没有放入到表中,然后把这个元组放进去。如果某个属性列没有值就填NULL)
如果只把左边关系R中要舍弃的元组保留就叫做左外连接(LEFT OUTER JOIN或LEFT JOIN) - 右外连接(可以看成自然连接后,右边关系哪个元组没有放入到表中,然后把这个元组放进去。如果某个属性列没有值就填NULL)
如果只把右边关系S中要舍弃的元组保留就叫做右外连接(RIGHT OUTER JOIN或RIGHT JOIN)。 - 除(非常好用,可以用来求涉及所有人有没有取值,以及和的关系):
5. 关系演算(ALPHA非常重要)
ALPHA语言是以元组变量作为谓词变元的基本对象
语句格式:
GET 工作空间名[ (定额) ] (表达式1) [:操作条件] [DOWN/UP 表达式2]
定额:规定检索的元组个数
格式:数字
表达式1:指定语句的操作对象
格式:关系名| 关系名. 属性名| 元组变量. 属性名| 集函数 [,… ]
操作条件:将操作结果限定在满足条件的元组中
格式:逻辑表达式
表达式2:指定排序方式
格式:关系名. 属性名| 元组变量. 属性名[,… ]
元组变量的定义
格式:RANGE 关系名 变量名
一个关系可以设多个元组变量
接下来的是重点!!!
用元组变量的检索
什么情况下,要用到用元组变量的检索呢?
- 操作条件中使用量词时必须用元组变量
- 简化关系名:设一个较短名字的元组变量来代替较长的关系名
- 或者最简单的说法就是:涉及一张表的时候,可以不用元组变量,涉及到多张表的时候,就需要用到元组变量。
什么情况下用全称量词,什么情况下用存在量词?
第一种简单理解的方式:两个不同的变量来自同一个元组,或者说是来自同一个表。
第二种方式:通过严谨的自然逻辑语言来表达要求,然后将其转化为ALPHA。
下面用一道题目来讲解
对于第一题:
我们有三张表:学生表(S),选课关系表(SC),课程表(C)。题目要求我们查找学生的学号和姓名。首先,我们从学生表(S)中获取一条记录,然后根据这条记录在选课关系表(SC)中查找对应的选课信息。由于选课关系表(SC)中没有课程名称,我们需要进一步查找课程表(C)来获得课程信息,这样就涉及到了三张表,要使用元组变量了。
在这里,我们使用“存在”量词而非“全称”量词,因为题目要求我们找到满足条件的任意一条选课记录,而不是每一条都要满足条件(可以试着念一下,是任取一个选课记录都要满足表达式,还是存在一个选课记录满足表达式即可,看看哪个更加符合题目的要求。)。所以,我们可以先定住学生表(S)中的一条记录,然后查找选课表(SC)中是否存在对应的选课记录。如果选课表中有记录,就继续查找课程表(C)中是否有相应的课程信息。如果所有条件都满足,我们就把当前的记录存入输出结果中。
所以答案为(对一个学生,存在一条选课记录,这条选课记录能够在课程表中找到对应的记录(也就是课程表中存在一条记录满足条件)):
RANGR SC SCX C CX
GET W(S.sno, S.sname) : ∃SCX(SCX.sno = S.sno ∧ ∃CX(SCX.cno = C.cno ∧ C.cname = ‘数据库原理’))
对于第二题,解题思路和第一题差不多,所以我直接给出答案。
答案为:
RANGR SC SCX C CX
GET W(S.sno, S.sname) : ∃SCX(SCX.sno = S.sno ∧ ∃CX(SCX.cno = C.cno ∧ C.cpno = ‘5’))
对于第三题
我们有三张表:学生表(S),选课关系表(SC),课程表(C)。题目要求我们查找课程名。首先,我们从课程表(C)中获取一条记录,然后根据这条记录在选课关系表(SC)中查找对应的选课信息。由于选课关系表(SC)中不一定有完整的学生名单,我们需要进一步查找学生表(S)来获得课程信息,这样就涉及到了三张表,要使用元组变量了。
在这里,对于学生我们使用“全称”量词而非“存在”量词,因为题目要求我们找到满足条件的所有学生,而不是一条满足条件的学(可以试着念一下,是任取一个都要满足表达式,还是存在一个满足表达式即可,看看哪个更加符合题目的要求。)。所以,我们可以先定住课程表(C)中的一条记录,然后查找选课表(SC)中是否存在对应的选课记录。如果选课表中有记录,就继续查找学生表(S)中是否有相应的课程信息。如果所有条件都满足,我们就把当前的记录存入输出结果中。
所以答案为(对一个课程,对所有学生进行查询,看看是否存在一条对于当前选择的课程的选课记录,这个解释只是通顺而已,我感觉不合理,因为只能拿到有相同记录的表,要按照逻辑来的话,应该是对一个课程,存在一条选课记录,这条选课记录能够在学生表中的所有人中找到对应的记录):
RANGR SC SCX S SX
GET W(C.cname) : ∀SX(∃SCX(SCX.sno = SX.sno ∧ C.cno = SCX.cno))
还有下面这几种题目:
- 检索至少修读了学号为S5的学生修读的一门课的学生的姓名。
答案:
RANGE C CX
SC SCX
SC SCY
GET W(S.SN):∃CX(∃SCX(SCX.CNO=CX.CNO∧SCX.SNO=’S5’)→∃SCY(SCY.CNO=CX.CNO∧SCY.SNO=S.SNO)) - 检索修读了学号为S4的学生所修读的所有课程的学生的姓名。
答案:
RANGE C CX
SC SCX
SC SCY
GET W(S.SN):∀CX(∃SCX(SCX.CNO=CX.CNO∧SCX.SNO=’S4’)→∃SCY(SCY.CNO=CX.CNO∧SCY.SNO=S.SNO)) - 检索选修所有课程的学生的学号。
RANGE C CX
SC SCX
GET W(S.SN):∀CX∃SCX(SCX.SNO=S.SNO∧CX.CNO=SCX.CNO)
#从学生表S中取学生姓名,条件是对任意课程CX该学生都有选课关系SCX存在并选了CX这门课 - 检索不选修任何课程的学生的学号。
答案:
RANGE C CX
SC SCX
GET W(S.SNO):∀CX(¬∃SCX(SCX.CNO=CX.CNO∧SCX.SNO=S.SNO)) - 用蕴含的检索,查询最少选修了学号为200402的学生所选课程的学生学号
答案:
RANGE C CX
SC SCX
SC SCY
GET W(S.SNO):∀CX(∃SCX(SCX.SNO=’200402’∧SCX.CNO=CX.CNO)→∃SCY(SCY.SNO=S.SNO∧SCY.CNO=CX.CNO))
#从学生表S的当前记录取学号,条件是对任意课程CX都有:如果存在有200402学生的选修记录SCX,其选修课程是CX,则当前被检索学生比存在选修元组SCY也选修了课程CX
第三章 关系数据库标准语言SQL
SQL语句有个执行顺序:
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- 各种聚合函数
- WITH 应用ROLLUP或CUBE
- HAVING
- SELECT 选出指定列
- DISTINCT 行去重
- ORDER BY 排列
- LIMIT/OFFSET 指定返回行
所以说有下面几个总结:
having是在分组后对数据进行过滤。
where是在分组前对数据进行过滤。
having后面可以使用聚合函数。
where后面不可以使用聚合函数,因为还没执行到聚合函数。
1. 数据定义
1.1 模式
1.1.1 模式定义
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>;
如果没有指定<模式名>,那么<模式名>隐含为<用户名>
在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]
1.1.2 模式删除
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
CASCADE(级联)
删除模式的同时把该模式中所有的数据库对象全部删除
RESTRICT(限制)
如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。
当该模式中没有任何下属的对象时才能执行。
1.2 基本表
1.2.1 基本表的定义
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件>] ] …
[,<表级完整性约束条件> ] );
如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
1.2.2 基本表的删除
DROP TABLE <表名>[RESTRICT| CASCADE];
RESTRICT:删除表是有限制的。
欲删除的基本表不能被其他表的约束所引用
如果存在依赖该表的对象,则此表不能被删除
CASCADE:删除该表没有限制。
在删除基本表的同时,相关的依赖对象一起删除
1.2.3 基本表的修改
ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <完整性约束名> ]
[ ALTER COLUMN<列名> <数据类型> ];
1.3 索引
1.3.1 索引的建立
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
CLUSTER的是聚簇索引,有以下这些性质:
- 在最经常查询的列上建立聚簇索引以提高查询效率
- 一个基本表上最多只能建立一个聚簇索引(这是因为聚簇索引实质上是将硬盘上的数据的顺序改变了,如果建立多个,那么硬盘的顺序会很混乱)
- 经常更新的列不宜建立聚簇索引(因为聚簇索引实质上是将硬盘上的数据的顺序改变了,如果建立了,会导致开销很大)
1.3.2 索引的删除
DROP INDEX <索引名>;
删除索引时,系统会从数据字典中删去有关该索引的
描述。
2. 数据查询
语句格式
SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
LIMIT <行数1>[ OFFSET <行数2>];
2.1 单表查询
这种查询仅涉及一个表:
SELECT [ALL/DISTICNT] 属性名,…(这里可以用*代表所有属性,同时可以对属性名使用算术表达式或者集函数,还可以使用列别名改变查询结果的列标题,用ALL来保留重复的行,用DISTINCT来去除重复的行)
FROM 表名
WHERE 查询条件(这里门道很多)
ORDER BY 属性名 ASC(升)/DESC(降)
GROUP BY 属性名;
HAVING 条件;
注意:匹配串为含通配符的字符串 : %(这个符合后面完全不管了,有多少都可以), _(1个这个符合后面只能有1个字符,中文是2个字符,所以中文要有两个 _ )
ESCAPE ‘\’ 表示“ \” 为换码字符
聚集函数:
计数
COUNT([DISTINCT|ALL] *)
COUNT([DISTINCT|ALL] <列名>)
计算总和
SUM([DISTINCT|ALL] <列名>)
计算平均值
AVG([DISTINCT|ALL] <列名>)
最大最小值
MAX([DISTINCT|ALL] <列名>)
MIN([DISTINCT|ALL] <列名>)
GROUP BY子句分组
细化聚集函数的作用对象
未对查询结果分组,聚集函数将作用于整个查询结果
对查询结果分组后,聚集函数将分别作用于每个组
作用对象是查询的中间结果表
按指定的一列或多列值分组,值相等的为一组
HAVING短语与WHERE子句的区别
作用对象不同
WHERE子句作用于基表或视图,从中选择满足条件的元组
HAVING短语作用于组,从中选择满足条件的组。
LIMIT子句
用于限制SELECT语句查询结果的(元组)数量
LIMIT <行数1>[ OFFSET <行数2>];
语义是忽略前<行数2>行,然后取<行数1>作为查询结果数据
OFFSET可以省略,代表不忽略任何行
LIMIT子句经常和ORDER BY子句一起使用
2.2 连接查询
连接查询:同时涉及多个表的查询
连接条件或连接谓词:用来连接两个表的条件
一般格式:
[<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
连接字段:连接谓词中的列名称
连接条件中的各连接字段类型必须是可比的,但名字不必是相同的
在SQL中经常使用在“FROM/WHERE”字句中包含一个形如“SELECT-FROM-WHERE”的查询块,这样的查询块称为子查询或嵌套查询,包含子查询的语句称为父查询或外部查询。
子查询分为相关子查询和不相关子查询
不相关子查询
子查询可独立执行,不依赖于父查询表的查询,称为不相关子查询。
执行过程:
(1)先执行子查询,其结果不会被显示,而是返回给外部查询来作为外部查询的查询条件;
(2)根据子查询的结果,执行外部查询。
相关子查询
构造子查询的查询条件时需要用到父查询的某一个属性列,这样的查询称为相关子查询。
相关子查询是无法独立执行的,因为它必然含有对外部查询表中元组分量的引用。
其执行过程为:
(1)按顺序从外部查询中取出一个元组,将元组的相关分量值传递给子查询;
(2)执行子查询,得到结果值;
(3)外部查询根据子查询返回的结果或结果集确定取出的这一行元组是否满足条件;若外层的where子句返回真值,说明符合;否则不符合,舍弃。
(4)重复步骤1-3,直到外部查询表中的所有元组都被处理完毕。