数据库复习
题型
单选:10 个 × 2 分
填空:10 个 × 1 分
综合应用题:3 个,每个 10-30 分(考察 2-6 章知识点,重点为关系代数和 sql 语句)
第一章 数据库系统概述
- 数据库的 4 个基本概念
- 数据
- 数据库
- 数据库系统 = 数据库 + 数据库管理系统 + 应用程序 + 数据库管理员
- 数据库管理系统:本质是软件
第二章 关系数据库
关系数据结构及形式化定义
- 域:概念上等同于集合
- 笛卡尔积:几个集合取乘积(类似于乘法分配律)所得的集合,不能有重复元素
- 基数:一个域中的不同元素的个数叫做域的基数
- 关系:若干个域的笛卡尔积的子集叫做域上的关系,写为 $R(D_1,D_2,\ldots ,D_n)$,其中 n 叫做关系的目或者度
- 候选码:关系中某一属性组能唯一标识一个元组,而其子集不能,这个属性组叫做候选码。(不能有重复的取值)
- 主码:一个关系有多个候选码时,选定其中一个为主码。候选码的诸属性叫主属性
- 关系的三种类型:基本关系(基本表),查询表,视图表
- 表中不能有小表
- 关系模式:$R(U,D,DOM)$
关系操作
- 基本的关系操作:
- 查询(前五种为五种基本操作)
- 选择
- 投影
- 并
- 差
- 笛卡尔积
- 连接
- 除
- 交
- 插入、删除、修改
- 查询(前五种为五种基本操作)
关系的完整性
- 实体完整性:主属性不能取空值
- 参照完整性:
- F 是关系 R 的属性但不是码,K 是关系 S 的主码,如果 F 和 K 相对应,则 F 是关系 R 的外码,称 R 是参照关系,S 是被参照关系。R、S 可以是同一关系。
- F 是关系 R 的外码,则 F 的各个取值或者取空值,或者等于 S 中对应的值
- 用户定义的完整性
关系代数
用对关系的运算表达查询
传统的集合运算
- 并 $R \cup S$,两集合取并集
- 差 $R - S$,属于 R 但不属于 S
- 交 $R \cap S$,两集合取交集
- 笛卡尔积 $R \times S$
专门的关系运算
选择(限制):在关系R中选择满足给定条件的诸元组,$\sigma F(R)$(例如,$\sigma {Sdept=’IS’}(student)$),其中F表示选择条件。是从行的角度进行的运算。
投影:从关系R中选择出若干属性列组成新的关系,$\piA(R)$(例如,$\pi{Sname}(student)$),其中 A 是 R 的属性列,结果应取消相同行。是从列的角度进行运算。
连接:从两个关系的笛卡尔积里选择满足关系的元组,$R \underset{A\theta B}\Join S$,其中 $\theta$ 为比较运算符。
- 等值连接:当 $\theta$ 为 ”$=$“ 时
- 自然连接:特殊的等值连接,进行比较的分量必须是同名的属性组,并在结果中取消重复列。同时从行和列的角度进行运算。
- 外连接
- 悬浮元组:自然连接运算中被舍弃的元组
- 外连接:把悬浮元组也保存在结果关系中,在其他属性填 $NULL$,$R\ ⟗\ S$
- 左外连接:只保留左边关系 R 的悬浮元组,$R\ ⟕\ S$
- 右外连接:只保留左边关系 S 的悬浮元组,$R\ ⟖\ S$
- 等值连接:当 $\theta$ 为 ”$=$“ 时
除:$R\div S=T$,$T$ 包含在 R 但不在 S 中的属性及其值。同时从行和列的角度进行运算。
类似于在两关系的共同属性上一一对照,找到左边关系中含右边关系的所有非共同属性的非共同属性,即为运算结果。
第三章 关系数据库标准语言 SQL
概述
- SQL 的特点
- 综合统一
- SQL 集数据定义语言、数据操纵语言、数据控制语言、数据查询语言的功能于一体
- 高度非过程化
- 面向集合的操作方式
- 提供多种使用方式
- 语言简洁,易学易用
- 综合统一
数据定义
模式
定义
create schema <模式名> authorization <用户名>
删除
drop schema <模式名><cascade(级联)|restrict(限制)>
级联和限制必选其一,级联表示把该模式的数据库对象全部删除;限制表示如果已经该模式中如果已经定义了下属的数据库对象,就拒绝该语句的执行。
常用完整性约束
基本表
定义表
create table <表名>(
<列名><数据类型> [列级完整约束条件]
[,<表级完整约束条件>]);删除表
drop table <表名> [restrict|cascade];
- restrict:删除表有限制条件。欲删除的基本表不能被其他表的约束所引用,如果存在依赖该表的对象,则此表不能被删除。 默认是 restrict。
- cascade:删除表没有限制条件。在删除基本表的同时,相关的依赖对象一起删除
模式与表
表中给出模式名
创建模式语句中同时创建表
修改表
alter table <表名>
[add <新列名> <数据类型> [完整性约束]]
[drop <完整性约束名>]
[alter column <列名> type <数据类];表级完整性约束条件定义
索引
分类
- 普通索引(normal Index):索引表的 Search-key 项中的每一索引值对应全部取该值的基本表中的记录。普通索引通过索引表的指针项指向一个单链表来实现,该链表的每个结点的数据项指向一条物理记录。
- 单一索引(unique Index):每一个索引值只对应唯一的数据记录。当建立单一索引后,索引项不可以再插入已有值,但可以插入多个空值,这等同于在建表时对索引列增加一个 UNIQUE 约束;同样,当建立单一索引时,如果待索引项存在相同值则不能建立。
- 聚簇索引(cluster Index):索引项顺序与表中数据记录的物理顺序一致。即基本表是按照索引表的 Search-key 项的排列次序组织存储的,因此,一个基本表只能建立一个聚簇索引。
建立索引
create [unique] | [cluster] index <索引名>
on <表名>(<列名>[<次序>][,<列名>[<次序>] ]…) ;用表名指定要建索引的基本表名字
索引可以建立在该表的一列或多列上,各列名之间用逗号分隔
用次序指定索引值的排列次序,升序:ASC,降序:DESC;缺省值:ASC
unique 表明此索引的每一个索引值对应唯一的数据记录
cluster 表示要建立的索引是聚簇索引
删除索引
alter table <表名> drop index <索引名>;
数据查询
单表查询
select 语句
SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC | DESC ] ] ;- select 子句:指定要显示的属性列
- from 子句:指定查询对象(基本表或视图)
- where 子句:指定查询条件
- group by 子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中使用集函数;having 短语:筛选出只有满足指定条件的组
- order by 子句:对查询结果按指定列值升序或降序排序
选择表中的若干列($\pi$)
查询指定列
查询全部列
select *
from <table>;查询经过计算的值
选择表中的若干元组
消除取值重复的行:distinct
查询满足条件的元组:where($\sigma$)
比较
确定范围:between and,not between and
确定集合:in,not in
字符匹配:like,not like
- %:任意长度字符串
- _:任意单个字符
涉及空值的查询:is nullI,is not null
多重条件(逻辑运算):and,or,not
order by 语句
- 可以按一个或多个属性列排序
- 升序:ASC
- 降序:DESC
- 默认为升序
- 当排序列含空值时:将空值作为最大值来理解
- 可以按一个或多个属性列排序
聚集函数(count,sum,avg,max,min:只能用于 SELECT 语句和 GROUP BY
计数
COUNT ([DISTINCT|ALL] *) COUNT ([DISTINCT|ALL] <列名>)
计算总和
SUM ([DISTINCT|ALL] <列名>)
计算平均值
AVG ([DISTINCT|ALL] <列名>)
求最大值
MAX ([DISTINCT|ALL] <列名>)
求最小值
MIN ([DISTINCT|ALL] <列名>)GROUP BY 语句
连接查询
等值与非等值连接查询
- 自然连接:等值连接中,去掉重复的属性列为自然连接
自身连接
外连接
- 左外连接列出左边关系所有元组
- 右外连接列出右边关系所有元组
多表连接
嵌套查询
查询块:一个 select-from-where 语句称为一个查询块
带有 IN 谓词的子查询
- 不相关子查询:子查询的查询条件不依赖于父查询(可以用自身连接)
- 相关子查询:子查询的查询条件依赖于父查询
带有比较运算符的子查询(比较运算符)
带有 ANY(SOME)或 ALL 谓词的子查询(效率低于聚集函数)
带有 EXISTS 谓词的子查询,不返回任何值,只产生逻辑真,假
集合查询
- 并 union:将多个查询结果合并,自动去掉重复元组
- 交 intersect
- 差 except
基于派生表的查询
数据更新
插入数据
插入元组 INSERT INTO VALUES
INSERT INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>] … ) ;- INTO 子句
- 指定要插入数据的表名及属性列
- 属性列的顺序可与表定义中的顺序不一致
- 没有指定属性列:表示要插入的是一条完整的元组,且属性列属性与表定义中的顺序一致
- 指定部分属性列:插入的元组在其余属性列上取空值
- VALUES 子句:提供的值的个数和值的类型必须与 INTO 子句匹配
- INTO 子句
插入子查询结果 INSERT INTO 子查询
INSERT INTO <表名> [(<属性列1> [,<属性列2>… )]
子查询;- INTO 子句,与插入单条元组类似
- 子查询,SELECT 子句目标列属性的个数和类型必须与 INTO 子句匹配。
修改数据 UPDATE SET
语法
UPDATE <表名>
SET <列名>=<表达式>[, <列名>=<表达式>]…
[WHERE <条件>];SET 子句:指定修改方式,要修改的列和修改后取值
WHERE 子句
- 指定要修改的元组
- 缺省表示要修改表中的所有元组
修改某一个元组的值
修改多个元组的值
带子查询的修改语句
删除数据(DELETE 只删除表的数据,不删除表的定义)
语法
DELETE FROM <表名>
[WHERE <条件>] ;- WHERE 子句
- 指定要删除的元组
- 缺省表示要修改表中的所有元组
- WHERE 子句
删除某一个元组的值
删除多个元组的值
带子查询的删除语句
空值的处理
空值的判断:is null,is not null
空值的约束条件
- 有 NOT NULL 约束条件的不能取空值
- 加了 UNIQUE 限制的属性不能取空值
- 码属性不能取空值
空值的运算
- 算术运算:空值与另一个值(包括另一个空值)的算术运算的结果为空值
- 比较运算:空值与另一个值(包括另一个空值)的比较运算的结果为 UNKNOWN
- 逻辑运算:有 UNKNOWN 后,传统二值(TRUE,FALSE)逻辑就扩展成了三值逻辑
视图
是一个虚表
对应三级模式的外模式
定义视图
建立视图
CREATE VIEW <视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];- CREATE VIEW 子句中的列名可以省略,此时视图的属性由子查询中 SELECT 目标列中的诸字段组成。但在下列情况下明确指定视图的所有列名:
- 某个目标列是集函数或列表达式
- 多表连接时选出了几个同名列作为视图的字段
- 需要在视图中为某个列启用新的更合适的名字
- 子查询中的属性列不允许定义别名,不允许含有 ORDER BY 子句和 DISTINCT 短语。
- WITH CHECK OPTION 表示对视图进行更新操作的数据必须满足视图定义的谓词条件(子查询的条件表达式)。
- CREATE VIEW 子句中的列名可以省略,此时视图的属性由子查询中 SELECT 目标列中的诸字段组成。但在下列情况下明确指定视图的所有列名:
删除视图
DROP VIEW <视图名> [CASCADE] ;
查询视图
和基本表一样
- 如果该视图导出了其他视图,则使用CASCADE级联删除,或者先显式删除导出的视图,再删除该视图;
- 删除基表时,由该基表导出的所有视图定义都必须显式删除。
DBMS 实现视图查询的方法
实体化视图
视图消解法
更新视图
- 插入 INSERT
- 删除 DELETE
- 修改 UPDATE
- 视图的作用
- 简化用户的操作
- 使用户能以多种角度看待同一数据
- 对重构数据库提供了一定程度的逻辑独立性
- 对机密数据提供安全保护
第四章 数据库安全性
定义
是指保护数据库以防止不合法使用所造成的数据泄露,更改和破坏
不安全因素
- 非授权用户对数据库的恶意存取和破坏
- 数据库中重要或敏感数据被泄露
- 安全环境的脆弱性
数据库的安全性控制
用户身份鉴别
- 每个用户由用户名 username 和用户标识号 UID 组成
- 常用的用户身份鉴别方法
- 静态口令鉴别:用户名和密码
- 动态口令鉴别:短信验证码
- 生物特征识别:指纹,声纹,虹膜
- 智能卡鉴别
存取控制
存取控制机制主要包括定义用户权限和合法权限检查两部分
自主存取控制 DAC
用户权限由两个要素组成:数据库对象和操作类型
授权:授予和收回
授权
grant <权限> on <对象类型> <对象名>
to <用户>收回
revoke <权限 >on <对象类型> <对象名>
from <用户>with grant option 子句使得获得某种权限的用户把权限再授予其他用户
数据库角色
定义:是被命名的一组与数据库操作相关的权限,是权限的集合
使用
角色的创建:
create role <角色名>
给角色授权:
grant <权限> on <对象类型><对象名>to<角色名>
将一个角色授予其他的角色或用户
grant <角色1>,...to <角色3>[,<用户1>]
[with admin option]角色权限的收回
revoke <权限> on <对象类型> <对象名>
from <角色>
自主存取控制,仅仅通过对数据的存取权限来进行安全控制,而数据本身并无安全性标记
强制存取控制 MAC
- 全部实体分为主体和客体
- 主体是系统中活动实体,实际用户和各进程
- 客体是系统中被动实体,包括文件、基本表、索引、视图等
- 对于主体和客体,DBMS 为每个实例(值)指派一个敏感度标记
- 敏感度标记被分为若干级别:绝密、机密、可信、公开
- 主体的敏感度标记称为许可证级别,客体的敏感度级别称为密级
- 主体对任何客体的存取需遵循的规则
- 仅当主体的许可证级别大于或等于客体的密级,该主体才能读取相应的客体
- 仅当主体的许可证级别小于或等于客体的密级,该主体才能写相应的客体
- 全部实体分为主体和客体
视图控制:为不同用户定义不同的视图,把数据库对象限制在一定范围内
数据加密存储和加密传输
第五章 数据库完整性
定义
是指数据的正确性和相容性
实体完整性
create table student( |
将属性组定义为主码只能在表级
参照完整性
create table student( |
用户定义的完整性
属性上的约束条件
列值非空
create table student
(sno char(9) not null,/*属性不允许取空*/
sname ... not null,
cno... not null,
primary key (sno, cno)
);列值唯一
create table student
(sno char(9) not null,
sname ... unique not null,/*列值唯一且不取空*/
cno... not null,
primary key (sno, cno)
);检查列值是否满足一个条件表达式(check 表达式)
create table student
(sno char(9) not null,
sname ... not null,
ssex char(2) check (ssex in('男','女')),/*性别只允许取男女*/
...
primary key (sno, cno)
);
元组上的约束条件
create table student
(sno char(9) not null,
sname ... not null,
ssex char(2),
...
primary key (sno, cno)
check (ssex='女' or sname not like 'Ms.%'),/*性别女的不允许叫 Ms.%*/
);
完整性约束命名子句
在创建表时,可以增加、删除一个完整性约束条件
constraint <完整性约束条件名> <完整性约束条件>
修改表中的完整性约束限制
ALTER TABLE表名
Drop Constraint<完整性约束条件>
ALTER TABLE表名
ADD Constraint<完整性约束条件><CHECK短语>
第六章 关系数据理论
关系模式的问题
- 数据冗余
- 更新异常
- 插入异常
- 删除异常
函数依赖
x 函数确定 y,y 函数依赖于 x,写为 $x\to y$
- $x\to y$,$y\subsetneq x$,非平凡函数依赖
- $x\to y$,$y\subseteq x$,平凡函数依赖
- $x\to y$,$y\to x$,记作$x\leftarrow \to y$
- y 不函数依赖于x,记作 $x\nrightarrow y$
- 完全函数依赖:$x\to y$,且对 x 的子集 x’,都有$x’\nrightarrow y$,则 y 对 x 完全函数依赖,记作 $x \stackrel{F}\to y$
- 不完全函数依赖:$x\to y$,但y 对 x 不完全函数依赖,记作 $x \stackrel{P}\to y$
- 传递依赖
范式
- 1NF:表不可再分
- 2NF:任意候选码都是非主属性的完全函数依赖
- 3NF :不存在 ”关键字->==非关键字->非关键字==“
- BCNF:即每个依赖左边必包含码,即不存在”==关键字x->关键字y==->非关键字“