数据库系统概论-第五版
1. 绪论
1.1. 四个基本概念的数据库
1.1.1. 数据
数据与描述事物的符号记录不可分割。
1.1.2. 数据库
数据库是长期存储在计算机中、有组织、可共享的大量数据的集合。 :三个基本特征:永久存储、组织和共享。它们都是根据某个数据模型组织、描述和存储的。数据独立性高。
1.1.3. 数据库管理系统(DBMS)—软件
科学地组织和存储数据,有效地获取和维护数据。
数据管理软件位于用户和操作系统之间
主要功能:
- 数据定义功能
- 数据组织、存储和管理功能
- 数据操纵功能
- 数据库的事务管理和运行管理
- 建立和维护数据库的功能
- 其它功能(如通信等)
1.1.4 数据库系统(DBS)
数据库系统由数据库系统组成DB、数据库管理系统DBMS存储、管理、处理和维护数据系统,由应用程序和数据库管理员组成
1.2. 数据管理
对数据进行,这是数据处理的中心问题。数据处理是指收集、存储、处理和传播各种数据的一系列活动的总和。
1.2.1 发展过程
人工管理、文件系统、数据库系统
1.2.2 比较三个阶段
特点 | 人工管理阶段 | 文件系统阶段 | 数据库系统阶段 |
---|---|---|---|
管理者 | 程序员 | 文件系统 | 数据库管理系统 |
面向对象的数据 | 应用程序 | 某一应用 | 部门企业 |
数据共享程度 | 没有共享,冗余度很大 | 共享性差,冗余答案 | 共享性高,冗余性低 |
数据独立性 | 不独立 | 独立性差 | 物理独立性高,逻辑独立性强 |
数据结构化 | 无结构 | 记录中有结构,整体无结构 | 整体结构化,用数据模型描述 |
数据控制能力 | 自行控制应用程序 | 自行控制应用程序 | DBMS并发控制和恢复数据安全性、完整性 |
1.2.3 数据库系统的特点
-
数据结构化(与文件系统的本质区别)
-
共享性高,冗余性低,易于扩展
-
高数据独立性(独立性是指应用程序与逻辑结构、物理存储相互独立)
应用程序不会受到系统数据存储结构和数据逻辑结构的变化的影响
-
统一管理和控制数据
数据安全保护、数据完整性检查、并发控制和数据库恢复
1.2.4 利用数据库系统
- 使用数据库系统可以大大提高应用开发的效率
- 当需要改变数据逻辑结构时,开发人员不需要修改应用程序,或者只需要修改一小部分
- 使用数据库系统可以减少DBA维护系统的负担
1.3. 数据模型
数据模型是数据库抽象现实世界的工具,是数据库中提供信息表达和操作手段的形式框架
1.3.1. 数据模型分类
概念模型:根据用户的观点建模数据和信息
表示方法、实体-联系方法E-R 描述现实世界的概念模型,E-R方法也称为E-R 模型
-
实体
实体(人、物)是分的事务称为实体(人、物)
-
属性
实体的某一特征称为属性
-
码
标识实体的唯一属性集称为代码
-
实体型
用实体名及其属性集合抽象描绘类似实体,称为实体性
-
实体集
同类实体的集合称为实体集
-
联系
实体之间的联系通常是指不同实体集之间的联系
逻辑模型和物理模型:根据计算机的概念建模数据
- 第二类逻辑模型:、对象数据模型、对象关系数据模型、半结构化数据模型等
- 第二类中的物理模型:对数据底部的抽象。描述了系统中数据的表示和访问方法
1.3.2. 数据模型的三个要素
-
数据结构
描述数据库的组成对象和对象之间的联系
-
数据操作(增删改查)
数据操作是指允许在数据库中执行多个对象的实例值,包括操作及相关操作规则
-
数据的完整性约束条件
数据的完整性约束是一族完整性的规则
1.3.3. 各模型的优缺点
层次模型
像倒立的树一样,结点的父母是唯一的
只有一个结点没有双亲结点,称为根结点
根以外的其他结点有记录,只有一个双亲结点和两个条件,它们之间的联系是分层模型
优点:
- 数据结构简单清晰
- 查询效率高
- 为完整性提供良好的支持
缺点:
- 在现实世界中,许多接触是非层次化的
- 如果一个节点有多个双亲节点,则只能引入冗余数据。插入删除限制
- 必须通过双亲节点查询子女节点
- 由于结构严密,层次命令往往结构化
网状模型
典型的代表是DBTG 系统
特点
- 允许多个结点没有双亲结点
- 允许一个结点有多个双亲结点
- 允许两个结点之间有多种联系
- 命名每个联系联系相关的父母记录和子女记录
优点:
- 能更直接地描述现实世界
- 性能好,访问效率高
缺点:
- 结构复杂
- 语言复杂,使用难以掌握
- 用户需要了解系统结构的细节,因为户需要了解系统结构的细节
关系模型
特点
- 关系模型求关系必须是规范化(关系的每一个分量必须是一个不可分的数据项)
- 操作对象和操作结果都是关系
- 关系模型把存取路径向用户隐蔽起来,用户只要指出干什么或找什么,不必详细说明怎么干或怎么找(提高了数据独立性、提高了数据完整性)
优点:
- 建立在严格的数据概念基础上
- 概念单一
- 存取路径对用户透明,简化工作
缺点:
存取路径隐蔽,导致查询效率不高,为了提升性能,DMBS必须对用户查询请求进行优化
1.4. 数据库系统的结构
1.4.1. 数据库系统模式的概念
模式是数据库中全体数据的,它仅仅涉及型(type)的描述,不涉及具体的值。模式的一个具体值称为模式的一个实例。
1.4.2. 三级模式结构
模式、外模式、内模式
模式
模式也称逻辑模式,是数据库中的逻辑结构和特征的描述,是所有用户的公共数据视图
外模式
外模式也称用户模式,它是数据库用户能够看见和使用的的逻辑结构和特征的描述。是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
。即使对模式中的同一种数据,在外模式的结构中,类型,长度,保密级别都可以不同
内模式
-
也称存储模式,一个数据库只有一个内模式。它是,是数据在数据库内部的组织方式。
-
索引的组织方式
B+树,Bitmap,Hash
-
记录的存储方式
顺序存储,堆存储,按hash 方法存储
-
数据是否压缩、数据是否加密
-
数据存储记录的规定——数据的长度
在数据库系统中,通常用三级模式来描述数据库,其中外模式是用户与数据库的接口,是应用程序可见到的数据描述,概念模式是对数据整体的逻辑结构的描述,而内模式描述了数据的物理结构
1.4.3. 数据库的二级映像功能与数据独立性
-
外模式/模式映像 模式改变,对映象做修改,可以保证外模式不变,保证了。
-
保证数据的逻辑独立性
当模式改变时,数据库管理员对外模式/模式映像作相应改变,使外模式保持不变
应用程序是依据数据的外模式编写的,应用程序不必修改与程序的逻辑独立性,简称数据的逻辑独立性
-
有一个外模式/模式映像定义外模式与模式之间的对应关系,映像定义通常包含在个外模式的描述中
-
-
模式/内模式映象 内模式改变(数据库的存储结构改变),对映象做修改,可以保持模式不变,保证了。
1.5. 数据库系统的组成
- 数据库是由数据库、数据库管理系统(及其开发工具)、应用程序、数据库管理员组成
- 硬件平台及数据库、软件、人员
2. 关系数据库
按照数据模型三要素,关系模型由数据结构、关系操作集合和关系完整性约束三部分组成
acid 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability).
2.1. 关系模型数据结构及形式化定义
关系模型的数据结构非常简单,只包含单一的数据结构——关系
2.1.1. 关系
关系是关系模式某一时刻的内容或状态
关系在域上D笛卡尔积的子集 关系可以有三种类型:
-
域是一组具有相同数据类型的值的集合
-
笛卡尔积
给定一组域 D 1 , D 2 , D 3 , D n 的笛卡尔积为 D 1 ∗ D 2 ∗ D 3 = { d 1 , d 2 , d n } 给定一组域D_1,D_2,D_3,D_n的笛卡尔积为D_1*D_2*D_3=\{d_1,d_2,d_n\} 给定一组域D1,D2,D3,Dn的笛卡尔积为D1∗D2∗D3={ d1,d2,dn}
每一个元素 ( d 1 , d 2 , d 3 ) 叫做一个元组,每一个元素中的每一个值 d i 叫做一个分量 (d_1,d_2,d_3)叫做一个元组,每一个元素中的每一个值d_i叫做一个分量 (d1,d2,d3)叫做一个元组,每一个元素中的每一个值di叫做一个分量
一个域允许的不同取值个数称为这个域的基数
1) 基本关系
有6 条性质
- 列是同质的,即每一列中的分量是同一类型的数据
- 不同列可能出自同一个域,称其中的每一列为一个属性,不同的属性要给予不同的属性名
- 列的顺序是无所谓的,即列的次序可以任意交换
- 任意两个元祖的候选码不能去相同的值
- 行的顺序也是 无所谓的
- 分量必须取原子值,即每一个分量都必须是不可分的数据项
2) 查询表
3) 视图表
2.1.2. 关系模式
关系的描述称为关系模式 ,可形式化的表示为 其中R为关系名,U为组成该关系的属性名集合,D为U中属性所来自的域,DOM为属性向域的映象集合,F为属性间数据的依赖关系集合。
组成部分
- 关系数据结构
- 关系操作
- 关系的完整性约束
2.1.3 关系数据库
关系数据库:关系数据库也有型和值之分,型是关系模式,是对关系数据库的描述。值是关系模式在某一时刻对应的关系集合。
区别
- 关系模式:对关系的描述称为关系模式,可以形式化表示为R(U,D,DOM,F)
- 关系:是关系模式某一时刻的状态或者内容,关系模式是静态的,而关系是动态的。
2.1.4. 关系模式与关系的区别
关系模式是型;关系是值,是关系模式的实例。 例如S(num,name,age)是关系模式,组成的表是关系,即某一时刻关系模式的值
- 对关系的描述 静态的、稳定的
- 关系模式在某一时刻的状态或内容动态的、随时间不断变化的关系模式和关系往往统称为关系
在数据库学科中可以把关系模式理解为表的结构、属性之间的关系、约束条件,把关系理解为二维表
2.2. 关系操作
2.2.1 基本操作
: 选择、投影、连接、除、并、差、交、笛卡尔积 选择、投影、并、差、笛卡尔积是五种基本操作 :插入、删除、修改
2.2.2 关系数据语言的分类
1) 关系代数
关系代数是用关系的运算来表达查询要求,代表:ISBL;
2) 关系演算
关系演算语言用谓词来表达查询要求;关系演算又可按照谓词变元的基本对象是元组变量还是域系变量分为元组关系演算和域关系演算
- 谓词变元的基本对象是元组变量; 代表:APLHA, QUEL;
- 谓词变元的基本对象是域变量; 代表:QBE;
3) 结构化查询语言
具有关系代数和关系演算双重特点的语言; 代表:SQL(Structured Query Language) ;
2.3. 关系完整性约束
1) 实体完整性约束-主键约束
若属性A是基本关系R的主属性,则属性A不能取空值
2) 参照完整性约束-外键约束
外码(Foreign Key)
- 设F是基本关系R的一个或一组属性,但不是关系R的码。如果F与基本关系S的主码Ks相对应,则称F是基本关系R的
外码
,即该码是另一个表的主码。 - 基本关系R称为
参照关系
(Referencing Relation),即本表。 - 基本关系S称为
被参照关系
(Referenced Relation) 或目标关系
(Target Relation),即外码对应的主码所在的表。
若属性F是基本关系R的外码,它与基本关系S的主码K相对应,则对R中的每个元组在F上的值,必须为空值或者S中某个元组的主码值
若属性(或属性组)F是基本关系R的外码它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:
-
或者取空值(F的每个属性值均为空值)
-
或者等于S中某个元组的主码值
-
外码的值要么为空,要么为S中某个元组的主码值
例2
例3
3) 用户定义的完整性约束
- 性针对某一具体关系数据库的约束条件。它反映了某一具体应用所涉及的数据必须满足的语义要求。
- 针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求
- 关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不要由应用程序承担这一功能
2.4. 关系代数
关系代数运算是以集合运算为基础的运算
2.4.1 传统的集合运算
并
举例
差
举例
笛卡尔积
R和S 具有相同的元数,且对应的属性的类型也相同
下面是RxS的结果,R和S使用上图中的R,S
交
即属于R又属于S的元组(行)组成
2.4.2 专门的关系运算
选择
举例
选择出满足条件的元组的操作叫做选择
选择A2值为a或b的元祖
投影
关系R上的投影是从R上选择出若干属性列出组成新的关系
连接
连接也被 θ 连接,它是从两个关系的笛卡尔积中选取属性满足一定条件的元组 连接也被\theta 连接,它是从两个关系的笛卡尔积中选取属性满足一定条件的元组 连接也被θ连接,它是从两个关系的笛卡尔积中选取属性满足一定条件的元组
连接运算中有两种最重要也是最为常用的连接,一种是等值连接,一种是自然连接
-
θ 为 " = " 的连接运算称为等值连接 \theta 为"=" 的连接运算称为等值连接 θ为"="的连接运算称为等值连接
从广义笛卡尔积中选取A,B 属性值相等的那些元组
-
自然连接是一种特殊的等值连接
要求两个关系中进行比较的分量必须是同名的属性,且在结果中把重复的属性列去掉
除
设关系R除以关系S的结果为关系T,则T包含所有在R但不在S上的属性及其值,且T的元组与S的元组的所有组合都在R中
2.5 关系演算
2.5.1 元组关系演算语言
2.5.2 元组关系演算
3. 数据库标准语言SQL
3.1. SQL概述
3.1.1. SQL特点
- 集数据定义语言 DDL(Data Definition Language),数据操纵语言 DML(Data Manipulation Language),数据控制语言 DCL(Data Control Language) 功能于一体。
- 可以独立完成数据库生命周期中的全部活动:
- 定义关系模式,插入数据,建立数据库;
- 对数据库中的数据进行查询和更新;
- 数据库重构和维护
- 数据库安全性、完整性控制等
- 用户数据库投入运行后,可根据需要随时逐步修改模式,不影响数据的运行。
- 数据操作符统一
- 非关系数据模型的数据操纵语言“面向过程”,必须制定存取路径
- SQL只要提出“做什么”,无须了解存取路径。
- 存取路径的选择以及SQL的操作过程由系统自动完成。
- 非关系数据模型采用面向记录的操作方式,操作对象是一条记录
- SQL采用集合操作方式:
- 操作对象、查找结果可以是元组的集合
- 一次插入、删除、更新操作的对象可以是元组的集合
- SQL是独立的语言
- 能够独立地用于联机交互的使用方式
- SQL又是嵌入式语言
- SQL能够嵌入到高级语言(例如C,C++,Java)程序中,供程序员设计程序时使用
- SQL功能极强,完成核心功能只用了9个动词。
SQL功能 | 动词 |
---|---|
数据查询 | SELECT |
数据定义 | CREATE、DROP、ALTER |
数据操纵 | INSERT、UPDATE、DELETE |
数据控制 | GRANT、REVOKE |
3.1.2. 基本概念
- SQL支持关系数据库三级模式结构
- 本身独立存在的表
- SQL中一个关系就对应一个基本表
- 一个(或多个)基本表对应一个存储文件
- 一个表可以带若干索引
- 逻辑结构组成了关系数据库的内模式
- 物理结构是任意的,对用户透明
- 从一个或几个基本表导出的表
- 数据库中只存放视图的定义而不存放视图对应的数据
- 视图是一个虚表
- 用户可以在视图上再定义视图
3.1.3 数据字典
数据字典
是关系数据库管理系统内部
的一组系统表
,它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等
。- 关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息。
- 在进行查询优化和查询处理时,数据字典中的信息是其重要依据。
3.2. 数据定义
3.2.1 数据定义概览
SQL的数据定义功能: 模式定义
、表定义
、视图
和索引
的定义
3.2.2 SCHEMA
- 在这个
空间
中可以定义
该模式
包含的数据库对象
,例如基本表
、视图
、索引
等。 - 在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>]
- 如果没有指定<模式名>,那么<模式名>隐含为<用户名>
① 定义模式
dbo database owner 数据库的创建者,创建该对象的用户. guest 顾客 能够访问数据库中对象的数据, 要求dbo分配权限给guest, 一般给他查看的权限select
- 这里我先创建一个数据库用户:
CREATE SCHEMA "S-T" AUTHORIZATION BitHachi; -- 为用户BitHachi定义了一个模式S-T
- 如果没有指定<模式名>,那么<模式名>隐含为<用户名>
CREATE SCHEMA AUTHORIZATION BitHachi;-- <模式名>隐含为用户名BitHachi 这个不知道咋回事,没出结果,默认模式BitHachi没创建出来,没显示
CREATE SCHEMA "S-T" AUTHORIZATION BitHachi
CREATE TABLE TAB1(
COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2)
);
② 删除模式
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
CASCADE(级联)
删除模式的同时把该模式中所有的数据库对象全部删除RESTRICT(限制)
如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。- 当该模式中没有任何下属的对象时才能执行。
- 以下是运行结果,至于为什么是错误的,暂且放在这里,等熟悉相关知识之后,再来解决。
DROP SCHEMA "S-T" CASCADE;
DROP SCHEMA "S-T" RESTRICT;
3.2.3 TABLE
① 定义基本表的标准格式
CREATE TABLE <表名>(
<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件>] ]
………
[,<表级完整性约束条件> ]
);
如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。
② 数据类型
- SQL中
域
的概念用数据类型
来实现 - 定义表的
属性
时 需要指明其数据类型及长度
- 选用哪种数据类型
- 取值范围
- 要做哪些运算
- 以下是通用数据类型,不同数据库的数据类型可能有所不同,可查相关文档。
③ 修改基本表
ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <完整性约束名> ]
[ ALTER COLUMN<列名> <数据类型> ];
- 不论基本表中原来是否已有数据,新增加的列一律为空值。
ALTER TABLE Student ADD S_entrance DATE;
ALTER TABLE Student ALTER COLUMN Sage INT;
ALTER TABLE Course ADD UNIQUE(Cname);
④ 删除基本表
DROP TABLE <表名>[RESTRICT| CASCADE];
-
RESTRICT
:删除表是有限制的。
- 欲删除的基本表不能被其他表的约束所引用
- 如果存在依赖该表的对象,则此表不能被删除
-
CASCADE
:删除该表没有限制。
- 在删除基本表的同时,相关的依赖对象一起删除
-
基本表定义被删除,数据被删除
-
表上建立的索引、视图、触发器等一般也将被删除
-
还是和上述删除模式情况一样,加了CASCADE和RESTRUCT删除不了
DROP TABLE Student CASCADE ;
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS';
DROP TABLE Student RESTRICT;
456
--ERROR: cannot drop table Student because other objects depend on it
- 这里还是跟之前的情况一样,删除不了,可能是我用的数据库不同叭
DROP TABLE Student CASCADE;
--NOTICE: drop cascades to view IS_Student
SELECT * FROM IS_Student;
--ERROR: relation " IS_Student " does not exist
3.2.4 INDEX
- 谁可以建立索引?
- DBA 或 表的属主(即建立表的人)
- DBMS一般会自动建立以下列上的索引
- PRIMARY KEY
- UNIQUE
- 谁维护索引? DBMS自动完成
- 使用索引 DBMS自动选择是否使用索引以及使用哪些索引
- RDBMS中索引一般采用B+树、HASH索引来实现
- B+树索引具有动态平衡的优点
- HASH索引具有查找速度快的特点
- 采用B+树,还是HASH索引 则由具体的RDBMS来决定
- 索引是关系数据库的内部实现技术,属于内模式的范畴
CREATE INDEX
语句定义索引时,可以定义索引是唯一索引、非唯一索引或聚簇索引
① 建立索引的标准格式
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
CREATE CLUSTERE INDEX Stusname ON Student(Sname);
- 在Student表的Sname(姓名)列上建立一个
聚簇索引
- 在最经常查询的列上建立聚簇索引以提高查询效率
- `一个基本表上最多只能建立一个聚簇索引(逻辑位置与物理位置相同)
- 经常更新的列不宜建立聚簇索引
- Student表按学号升序建唯一索引
- Course表按课程号升序建唯一索引
- SC表按学号升序和课程号降序建唯一索引
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Coucno ON Course(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
② 删除索引
- 删除索引时,系统会从数据字典中删去有关该索引的 描述。
DROP INDEX Stusno ON Student;
//等价
DROP INDEX Student.Stusno;
3.3. 数据查询
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7DTPCznk-1648358301002)(https://gitee.com/fakerlove/picture_1/raw/master/20200329000307604.png)]
3.3.1 表数据及结构
- 本篇文章都是围绕这三个表展开的。
3.3.2 SELECT语句的一般格式
先从整体上了解一下SELECT的格式,关键字的位置。
SELECT [ALL|DISTINCT]
<目标列表达式> [别名] [ ,<目标列表达式> [别名]] …
FROM <表名或视图名> [别名] [ ,<表名或视图名> [别名]] …
[WHERE <条件表达式>]
[GROUP BY<列名1>
[HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]
4567
3.3.4 单表查询
1) 选择表中的若干列
① 查询指定列
查询指定列
SELECT Sno,Sname
FROM Student;
SELECT Sname,Sno,Sdept
FROM Student;
12
② 查询全部列
- 选出所有属性列:在SELECT关键字后面列出所有列名 ,将<目标列表达式>指定为 *
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
//两种方式
<