PowerPoint 演示文稿
Download
Report
Transcript PowerPoint 演示文稿
数据库原理与设计方法
东南大学自动控制系
邵家玉
EMAIL:[email protected]
[email protected]
邵家玉@中国
课件下载:
http://automation.seu.edu.cn/
参考书:
1.王能斌。数据库系统。电子工业
出版社。1995年。
2.王能斌编。数据库系统原理。电
子工业出版社。2000年。
3.王珊 陈红。数据库系统原理教程。
4.[美]J·D·厄尔曼。数据库系统原理。
第一章
Introduction
1.1 Concepts
1.1.1 Data、DataBase、DataBase System、
DataBase Management System
1.
Data
(李明,男,1972,江苏,计算机系,1990)
数据、信息、知识三者之间的关系:
数据的语义即为信息,信息在计算机中的存储
(表示形式)即为数据。从信息中提升、推理、
推导出的新的信息即为知识。
例如:40(数据)—40℃(信息)—发烧(知
识)
2.
3.
DBMS
4.
Database——DB
Database Management System——
database system——DBS
数据库管理员(database administrator,简称DBA)。
5.
Data Model
数据模型是用来描述数据的一组概念和定义。一
般来说,数据的描述包括两个方面:
(1)数据的静态特性
它包括数据的基本结构、数据间的联系和数据中
的约束。
(2)数据的动态特性
它指定义在数据上的操作。
如文件系统。
数据模型要面向现实世界,面向用户。
数据模型要面向实现,面向计算机。
1)
conceptual data model
如ER模型、面向对象数据模型等。
2)
logical data model
如关系数据模型、层次模型、网状模型等。
3)
physical data model
概念数据模型只用于数据库的设计,逻辑数据
模型和物理数据模型用于DBMS的实现。
6.
Data Schema
type: 型是该数据所属数据类型的说明。
value: 值 是 型 的 一 个 实 例 (instance 或
occurrence)。
对某一类数据的结构、联系和约束的描述是型
的 描 述 , 型 的 描 述 称 为 数 据 模 式 ( Data
Schema)。在同一数据模式下,可以有很多的
值,即实例。
例如,学生记录可以定义为图1-3(a)的形式,这
是数据模式。而图1-3(b)是其一个实例。
数据模型是描述数据的手段.而数据模式是用
给定数据模型对具体数据的描述。
美 国 国 家 标 准 协 会 (ANSI) 的 ANSI / X3 /
SPARC报告把数据模式分为三级(见图1-4)。
1)
conceptual schema/logical schema
2)
external schema
3)
internal schema
7.
Database Instance
数据模式是相对稳定的,而实例是相对变动的。
数据模式反映一个单位的各种事物的结构、属
性、联系和约束,实质上是用数据模型对一个
单位的模拟。而实例反映数据库的某一时刻的
状态,也就是这一单位在此时的状态。
1.1.2 数据库技术的产生与发展
1.
人工管理阶段
人工管理数据具有如下特点:
1)
数据不保存。
2)
数据需要由应用程序自己管理,没有相应的
软件系统负责数据的管理工作。
3)
数据不共享。
4)
数据不具有独立性。
人工管理阶段应用程序与数据之间的对应关系可用图
l-3表示。
2.
文件系统阶段
用文件系统管理数据具有如下特点:
1) 数据可以长期保存。
2) 由专门的软件即文件系统进行数据管理。
3) 数据共享性差。
4) 数据独立性低。
文件系统阶段应用程序与数据之间的关系如图14所示。
3.
数据库系统阶段
用数据库系统来管理数据具有如下特点:
1)
数据结构化
学生人事记录
学 姓 性 系
号 名 别 别
年
龄
政
治
面
貌
图1-5
家
庭
出
身
籍
贯
家
庭
成
员
奖
惩
情
况
2)
数据的共享性好,冗余度低
3)
数据独立性高
4)
数据由DBMS统一管理和控制
l
数据的安全性(security)
l
数据的完整性(integrity)
l
并发(concurrency)控制
l
数据库恢复(recovery)
•
•
•
量大
持久
共享
1.1.3 数据库技术的研究领域
1.
数据库管理系统软件的研制
2.
数据库设计
3.
数据库理论
1.2
数据库工程与应用
1.2.1 数据库设计的目标与特点
图 1-10
1.2.2 数据库设计方法
新奥尔良方法:需求分析(分析用户要求)、概念设
计(信息分析和定义)、逻辑设计(设计实现)和物理设
计(物理数据库设计)。
S.B.Yao:需求分析、模式构成、模式汇总、模
式重构、模式分析和物理数据库设计。
I.R.Palmer则主张把数据库设计当成一步接一步
的过程,并采用一些辅助手段实现每一过程。
此 外 , 基 于 E—R 模 型 的 数 据 库 设 计 方 法 , 基 于
3NF(第三范式)的设计方法,基于抽象语法规范的
设计方法等。
规范设计法在具体使用中又可以分为两类:手工
设计和计算机辅助数据库设计。
ORACLE Designer 2000
1.2.3 数据库设计步骤
图1-11
1.
需求分析
4.
数据库物理设计
2.
概念结构设计
5.
数据库实施
3.
逻辑结构设计
6.
护
数据库运行和维
在数据库设计过程中必须注意以下问题。
1.
数据库设计过程中要注意充分调动用户的积
极性。
2.
应用环境的改变、新技术的出现等都会导致
应用需求的变化,因此设计人员在设计数据库时必
须充分考虑到系统的可扩充性,使设计易于变动。
3.
系统的可扩充性最终都是有一定限度的。
1.2.4 Database Application
各种用户的数据视图
DBA主要职责包括:
1.
设计与定义数据库系统
2.
帮助最终用户使用数据库系统
3.
监督与控制数据库系统的使用和运行
4.
能
改进和重组数据库系统,调优数据库系统的性
5.
转储与恢复数据库
6.
重构数据库
第二章
Data Model
数据模型应满足三方面要求:一是能比较真实地模
拟现实世界;二是容易为人所理解;三是便于在计
算机上实现。
两类:概念模型也称信息模型,数据模型包括网状
模型、层次模型、关系模型。
2.1
数据模型的要素
2.1.1 数据结构
2.1.2 数据操作
2.1.3 数据的约束条件
2.2
概念模型——E-R Data Model
2.2.1 Concepts
E-R数据模型(Entity-Relationship Data Model)
EER数据模型(Extended Entity-Relationship Data
Model)
1.实体(entity)、实体集(entity set)
entity set与entity是型(type)与值(value)的关
系(类似于前述data schema与database instance)
2.属性(attribute)
值集(value set) 实体键(entity key)实体主键
(entity primary key)
3. 联系(relationship)
基数比约束(cardinality ratio constraint)
参与约束(participation constraint):部分参与、
全参与
结构约束(structural constraint)
两个实体之间的联系可以分为三类:
l
一对一联系(1:1)
l
一对多联系(1:m)
l
多对多联系(m:n)
所有(ownership)关系——弱实体(weak entity)
2.2.2 E-R diagram
用E-R数据模型对某一单位进行模拟,可以得到ER
数据模式,ER数据模式可以ER图来直观地表示。
entity:
weak entity:
relationship:
attribute:
示例:
职工编号
姓名
是否博导
出生年月
教职工
职称
是否硕导
学号
姓名
学位类型
出生年月
研究生
是否在职
课程号
名称
上课地点
开课学期
课程
学时
学分
班级号
班级
信箱
起
止
N
时间
班级
班主任
1
止
起
专业
方向
M
M
教职工
M
时间
N
M
类型
任课
类型
N
说明:
N
研究生
导师
可担任
类型
C_G
N
课程
M
N
性质
选课
成绩
1.学位类型:硕士/博士
2.导师类型:主要指导老师、协助指导
3.研究生可能换导师,换专业、方向
4.选课性质:学位课/非学位课
5.任课类型:主讲/辅讲
6.可担任描述有哪些老师可以上哪些课
7.任课是指目前该课程的任课老师
8.开课学期:春/秋季
9.上课地点:目前该课程的上课教室
问题:
1.课性质属性为什么不属于课程实体,而属于选
课联系?
2.专业、方向可不可以属于研究生?
2.2.3 EER data model
1 . 特 殊 化 ( specialization ) 和 普 遍 化
(generalization)
全 特 殊 化 ( total specialization ) / 部 分 特 殊 化
(partial specialization)
不相交特殊化(disjoint specialization)/重叠特殊
化(overlapping specialization)
2. 聚集(aggregation)
3. 范畴(category)
2.3
Hierarchy Data Model
2.3.1 层次数据模型的数据结构
1.层次模型的基本结构
图 TS数据模式
图 TS数据模式的一个值
2.多对多联系在层次模型中的表示
2.3.2 层次数据模型的操纵与完整性约束
2.3.3 层次数据模型的存储结构
2.3.4 层次数据模型的优缺点
层次数据模型的优点主要有:
l 层次数据模型本身比较简单,只需很少几条命令
就能操纵数据库,比较容易使用。
l 对于实体间联系是固定的,且预先定义好的应用
系统,采用层次模型来实现,其性能优于关系模型,
不次于网状模型。
l 层次数据模型提供了良好的完整性支持。
层次数据模型的缺点主要有:
l 现实世界中很多联系是非层次性的,如多对多联
系、一个结点具有多个双亲等,层次模型表示这类
联系的方法很笨拙,只能通过引入冗余数据(易产生
不一致性)或创建非自然的数据组织(引入虚拟结点)
来解决。
l 对插入和删除操作的限制比较多。
l 查询子女结点必须通过双亲结点。
l 由于结构严密,层次命令趋于程序化。
2.4
网状数据模型
2.4.1 网状数据模型的数据结构
2.4.2 网状数据模型的操纵与完整性约束
2.4.3 网状数据模型的存储结构
2.4.4 网状数据模型的优缺点
网状数据模型的优点主要有:
l 能够更为直接地描述现实世界,如一个结点可以
有多个双亲、允许结点之间为多对多的联系等。
l 具有良好的性能,存取效率较高。
网状数据模型的缺点主要有:
l 其DDL语言极其复杂。
l 数据独立性较差。由于实体问的联系本质上是通
过存取路径指示的,因此应用程序在访问数据时要
指定存取路径。
2.5
Relation Data Model
2.5.1 Concepts
1. Attribute and Domain
Domain: 第一范式1NF(first nomal form)
data
atomic
非第一范式(Non-First Nomal Form)NF2
空值:NULL
2.
relation and tuple
设有一命名为R的关系,它有属性A1、A2、…、An,
其对应的城分别为Dl 、D2 、…、Dn 则关系R可表示
为:
R=(D1/Al,D2/A2,…,Dn/An)
或
R=(A1,A2,…,An)
或
R=(A1A2…An)
R.A1表示关系R的属性A1。
degree(arity):n
R的值:r r(R)
r={t1,t2,…,tm}
t=<v1,v2,…,vn>, vi∈Di,1≤i≤n
笛卡尔乘积×
A
B
A×B
D
E
F
G
D
E
F
G
1
2
5
6
1
2
5
6
3
4
7
8
1
2
7
8
9
0
1
2
9
0
3
4
5
6
3
4
7
8
3
4
9
0
×
=
关系模式:
SUDENT(姓名,学号,性别,出生年份.籍贯,系别,入
学年份)
<李彤,9093135,女,1975,江苏,计算机系,1993>
投影:R[X] t[X] STUDENT[姓名,性别]
3.
key
定义:如果关系的某一属性或属性组的值唯一地决定其他所
有属性的值,也就是唯一地决定一个元组,而其任何真子集
无此性质,则这个属性或属性组称为该关系的候选键
(candidate key),或简称为键。
superkey
primary key
alternate key
(SUPPLY(供应商,零件名,工程名))
all key
prime attribute
non-prime attribute
foreign key
COURSE(课程名,课程号,学分,开课时间,先修课程号)
GRADE(学号,课程号,成绩)
2.5.2 Constraint
R=(D1/Al,D2/A2,…,Dn/An)
1.
Domain integrity constraint
2.
Entity integrity constraint
3.
Referential integrity constraint
4.
General integrity constraint
2.5.3 Operation
relational algebra operations
1.
Select operation
σ<选择条件>(<关系名>)
2.
Project operation
Π<属性表>(<关系名>)
Π性别,籍贯、出生年份(STUDENT)
若<属性表2>包含<属性表1>则:
Π<属性表1>(Π<属性表2>(R))=Π<属性表1>(R)
Π姓名(σ性别=‘女’(STUDENT))
3.
Set operation
A∩B≡A-(A-B)
union compatibility
Π课程号(COURSE)-Π先修课程号(COURSE)
σ系别=‘计算机系’(STUDENT)∪σ系别=‘电子系’(STUDENT)
R×S={<t,g>|t∈R AND g∈S}
4
Join operation
R
<连接条件>S=σ<连接条件>(R×S)
连接条件:<条件1>AND<条件2>AND……AND <条件k>
θ连接:AiθBj
等连接(equijoin) 自然连接(natural join)
例:
GRADE
GRADE.课程号=COURSE.课程号(Π课程名,课程号,学分
(COURSE))
关系代数操作集{σ,Π,∪,-,×}是完备的操作
集。
{σ,Π,∪,-,
}
relationally complete
5.
Outer join operation
6.
Outer union operation
2.5.4 Relational Calculus
1.
Tuple Relational Calculus
2.
Domain Relational Calculus
第三章 Database Language SQL
结构化查询语言(structured query language,简
称SQL)
3.1 Introduction
SQL语言是1974年由Boyce和Chamberlin提出的。
1975年至1979年IBM System R实现了这种语言。
1986年10月 美国国家标准局(简称ANSI) SQL-86
1987年国际标准化组织(简称ISO)也通过了这
一标准。
ANSI 1989年第二次公布SQL标准(SQL-89)
1992年 SQL-92标准
目前ANSI正在酝酿新的SQL标准:SQL3。
现 在 SQL 已 被 重 新 解 释 成 为 : Standard Query
Language
SQL按其功能可分为四大部分:
1. 数据定义语言(Data Definition Language,简称
DDL)
2. 查询语言(Query Language,简称QL)
3. 数据操纵语言(Data Manipulation Language,
简称DML)
4. 数据控制语言(Data Control Language,简称
DCL)
3.1.1 SQL的特点
1. 综合统一
2. 高度非过程化
3. 面向集合的操作方式
4. 以同一种语法结构提供两种使用方式
5. 语言简洁,易学易用
表3-1 SQL语言的动词
3.1.2
SQL语言的基本概念
3.2 数据定义
表3-2 SQL的数据定义语句
3.2.1 定义、删除与修改基表
1. 定义基表
CREATE TABLE <表名> (<列名><数据类型
>[列级完整件约束条件][,<列名><数据类型>
[列级完整性约束条件]……]
[<表级完整性约束条件>]);
列级完整性约束条件格式:
[NOT NULL [UNIQUE]] [DEFAULT 字 值
|USER|NULL]
表级完整性约束条件有三个任选项。用于定义主
键 的 PRIMARY KEY 子 句 , 用 于 定 义 外 键 的
FOREIGN KEY子句和用于定义列值限制条件的
CHECK子句。格式:
[,PRIMARY KEY (<列名>…)]
[ , FOREIGN KEY [ 外 键 名 ] ( < 列 名 >… )
REFERENCES <表名>[ON DELETE RESTRICT
|CASCADE|SET NULL]]
[,CHECK (条件)……]
IBM DB2 SQL主要支持以下数据类型:
SMALLINT 半字长二进制整数。
INTEGER或INT 全字长二进制整数。
DECIMAL(p[,q])或DEC(p[,q]) 压缩十进制数,共p
位,其中小数点后有q位。0≤q≤p≤15,q=0时可以
省略。
FLOAT 双字长浮点数。
CHARTER(n)或CHAR(n) 长度为n的定长字符串。
VARCHAR(n) 最大长度为n的变长字符串。
GRAPHIC(n) 长度为n的定长图形字符串。
VARGRAPHIC(n) 最大长度为n的变长图形字符
串。
DATE 日期型,格式为YYYY—MM—DD。
TIME 时间型,格式为HH.MM.SS。
TIMESTAMP 日期加时间。
例1 建立Student(学生)、Course(课程)、SC
(选课)表。
1.“学生”表student由学号(Sno)、姓名(Sname)、
性别(Ssex)、年龄〔Sage〕、所在系(Sdept)5个
属性组成,可记为
Student(Sno,Sname,Ssex,Sage,Sdept)
其中sno为主键。
2 . “ 课 程 ” 表 course 由 课 程 号 (Cno) 、 课 程 名
(Cname)、先修课号(Cpno)、学分(Ccredit)4个属
性组成,可记为:
Course(Cno,Cname,Cpno,Ccredit)
其中Cno为主键。
3.“学生选课”表SC由学号(Sno)、课程号(Cno)、
成绩(Grade)3个属性组成,其中(Sno,Cno)为主
键。
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE,
Sname VARCHAR(20) NOT NULL,
Ssex CHAR(1),
Sage INT,
Sdept CHAR(15),
PRIMARY KEY(Sno));
CREATE TABLE Course
(Cno CHAR(1) NOT NULL,
Cname VARCHAR(20),
Cpno CHAR(1)
Ccredit DEC(2,1),
PRIMARY KEY(Cno),
FOREIGN KEY (Cpno) REFERENCES Course
ON DELETE RESTRICT);
CREATE TABLE SC
(Sno CHAR(5) NOT NULL,
Cno CHAR(1) NOT NULL,
Grade DEC(4,1) DEFAULT NULL,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY (Sno) REFERENCES Student
ON DELETE CASCADE,
FOREIGN KEY (Cno) REFERENCES Course
ON DELETE RESTRICT);
2. 修改基表
ALTER TABLE<表名>
[ADD<新列名><数据类型>[完整性约束]]
[DROP<完整性约束名>]
[MODIFY<列名><数据类型>];
例2 向student表增加“入学时间”列,其数据类型
为日期型。
ALTER TABLE Student ADD Scome DATE;
例3 将年龄的数据类型改为半字长整数。
ALTER TABLE Student MODIFY Sage
SMALLINT;
例4 删除(撤消)Student表主键定义。
ALTER TABLE Student DROP PRIMARY KEY;
3. 删除基表
DROP TABLE <表名>;
例5删除Student表。
DROP TABLE Student;
3.2.2 建立与删除索引
1. 建立索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名
> ON <表名>(<列名> [次序] [,<列名> [次序]]…);
排列次序,包括ASC(升序)和DESC(降序)两种,
缺省值为ASC。
CREATE CLUSTER INDEX Stusname ON
Student(Sname);
例6 为学生—课程数据库中的Student,Course,
SC 3个表建立索引。其中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);
2. 删除索引
DROP INDEX<索引名>;
例7 删除Student表的Stusname索引。
DROP INDEX Stusname;
3.3 查询
SELECT [ALL| DISTINCT] <目标列表达式>[,
<目标列表达式>]…
FROM <表名或视图名>[,<表名或视图名>]…
[WHERE<条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC | DESC]];
3.3.1 单表查询
1. 选择表中的若干列
1) 查询指定列
例1 查询全体学生的学号与姓名。
SELECT Sno,Sname
FROM Student;
例2 查询全体学生的姓名、学号、所在系。
SELECT Sname,Sno,Sdept
FROM Student;
2) 查询全部列
例3 查询全体学生的详细记录
SELECT *
FROM Student;
3) 查询经过计算的值
例4 查询全体学生的姓名及其出生年份。
SELECT Sname,2004-Sage
FROM Student;
例5 查询全体学生的姓名、出生年份和所在系,
要求用小写字母表示所在系名
SELECT Sname , ‘ Year of Birth : ’ , 2004Sage,ISLOWER(Sdept)
FROM Student;
SELECT Sname NAME , ‘ Year of Birth : ’
BIRTH
,
2004-Sagc
BIRTHDAY
,
ISLOWER(Sdept) DEPARTMENT
FROM Student;
结果为:
NAME BIRTH
BIRTHDAY DEPARTMENT
李勇 Year of Birth: 1976
cs
刘晨 Year of Birth: 1977
if
王名 Year of Birth: 1978
ma
张立 Year of Birth: 1978
if
2. 选择表中的若干元组
1) 消除取值重复的行
例6 查询所有选修过课的学生的学号。
SELECT Sno
FROM SC;
假设SC表中有下列数据:
Sno Cno Grade
95001 1 92
95001 2 85
95001 3 88
95002 2 90
95002 3 80
执行上面的SELECT语句后,结果为:
Sno
95001
95001
95001
95002
95002
SELECT DISTINCT Sno
FROM SC;
执行结果为:
Sno
95001
95002
SELECT Sno
FROM SC;
与
SELECT ALL Sno
FROM SC;
完全等价。
2) 查询满足条件的元组
表3-5 常用的查询条件
①比较大小
= 等于
> 大于
< 小于
>= 大于等于
<= 小于等于
!=或<> 不等于
有些产品中还包括:
!> 不大于
!< 不小于
逻辑运算符NOT可与比较运算符同用,对条件求
非。
例7 查计算机系全体学生的名单。
SELECT Sname
FROM Student
WHERE Sdept=‘CS’;
例8 查所有年龄在20岁以下的学生姓名及其年龄。
SELECT Sname,Sage
FROM student
WHERE Sage<20;
或
SELECT Sname,Sage
FROM student
WHERE NOT Sage>=20;
例9 查考试成绩有不及格的学生的学号。
SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;
②确定范围
谓 词 BETWEEN . . . AND . . . 和 NOT
BETWEEN...AND...可以用来查找属性
值在(或不在)指定范围内的元组,其中BETWEEN
后是范围的下限(即低值),AND后是范围的上限
(即高值)。
例10 查询年龄在20至23岁之间的学生的姓名、系
别和年龄。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
与 BETWEEN . . . AND . . . 相 对 的 谓 词 是
NOT BETWEEN...AND...。
例11 查询年龄不在20至23岁之间的学生姓名、系
别和年龄。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
③确定集合
谓词IN可以用来查找属性值属于指定集合的元组。
例12 查信息系(IS)、数学系(MA)和计算机科学系
(CS)的学生的姓名和性别。
SELECT Sname.Ssex
FROM Student
WHERE Sdept IN(‘IS’,‘MA’,‘CS’);
与IN相对的谓词是NOT IN,用于查找属性值不属
于指定集合的元组。
例13 查既不是信息系、数学系,也不是计算机科
学系的学生的姓名和性别。
SELECT Sname.Ssex
FROM Student
WHERE Sdept NOT IN(‘IS’,‘MA’,‘CS’);
④字符匹配
谓词LIKE可以用来进行字符串的匹配。其一般语
法格式如下:
[NOT] LIKE ‘<匹配串>’
其含义是查找指定的属性列值与<匹配串>相匹
配的元组,<匹配串>可以是一个完整的字符串,
也可以含有通配符%和_。其中:
%(百分号) 代表任意长度(长度可以为0)的字符串。
例如a%b表示以a开头,以b结尾的任意长度的字
符串,acb,adefb,ab等都满足该匹配串。
_(下划线)
代表任意单个宁符。例如a_b表示以a
开头,以b结尾,长度为3的字符串,acb,adb等都
满足该匹配串。
例14 查询学号为95001的学生的详细情况
SELECT *
FROM Student
WHERE Sno LIKE ‘9500l’;
该语句实际上与下面的语句完全等价:
SELECT *
FROM Student
WHERE Sno=‘9500l’;
例15 查所有姓刘的学生的姓名、学号和性别。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE ‘刘%’;
例16 查姓“欧阳”且全名为3个汉字的学生的姓名。
SELECT Sname
FROM Student
WHERE Sname LIKE ‘欧阳__’;
例17 查名字中第二字为“阳”字的学生的姓名和学
号。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE ’__阳%’;
例18查所有不姓刘的学生姓名。
SELECT Snamc,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE ‘刘%’;
⑤涉及空值的查询
谓词IS NULL和IS NOT NULL可用来查询空值和
非空值。
例19 某些学生选修某门课程后没有参加考试,所
以有选课记录,但没有考试成绩,下面来查一下
缺少成绩的学生的学号和相应的课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;
例20 查所有有成绩的记录的学生学号和课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
⑥多重条件查询
例21 查CS系年龄在20岁以下的学生姓名
SELECT Sname
FROM Student
WHERE Sdept=‘CS’AND Sage<20;
例12中的IN谓词实际上是多个OR运算符的缩写,
因此,例l2中的查询也可以用OR运算符写成如下
等价形式:
SELECT Sname.Ssex
FROM Student
WHERE
Sdept=‘IS’OR
Sdept=‘MA’OR
Sdept=‘CS’;
3. 对查询结果排序
例22 查询选修了3号课程的学生的学号及其成绩,
查询结果按分数的降序排列。
SELECT Sno,Grade
FROM SC
WHERE Cno=‘3’
ORDER BY Grade DESC;
例23 查询全体学生情况,查询结果按所在系升序
排列,对同一系中的学生按年龄降序排列。
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC;
4. 使用集函数
COUNT([DISTINCT | ALL ] *) 统计元组个数
COUNT([DISTINCT | ALL]<列名>)
统计一列
中值的个数
SUM([DISTINCT | ALL] <列名>)
计算一列值
的总和(此列必须是数值型)
AVG([DISTINCT | ALL] <列名>) 计算一列值的
平均值(此列必须是数值型)
MAX([DISTINCT | ALL] <列名>)
求一列值中
的最大值
MIN([DISTINCT | ALL] <列名>) 求一列值中的
最小值
例24 查询学生总人数。
SELECT COUNT(*)
FROM Student;
例25 查询选修了课程的学生人数。
SELECT COUNT(DISTINCT Sno)
FROM SC;
例26 计算1号课程的学生平均成绩。
SELECT AVG(Grade)
FROM SC
WHERE Cno=‘l’;
例27 查询学习l号课程的学生最高分数。
SELECT MAX(Grade)
FROM SC
WHERE Cno=‘1’;
5. 对查询结果分组
例28 查询各个课程号与相应的选课人数。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
例29 查询信息系选修了3门以上课程的学生的学
号,为简单起见,假设SC表中有一列Dept,它记
录了学生所在系。
SELECT Sno
FROM SC
WHERE Dept=‘IS’
GROUP BY Sno
HAVING COUNT(*)>3;
3.3.2 连接查询
1. 等值与非等值连接查询
[<表名1>.]<列名1><比较运算符>[<表名2
>.]<列名2>
其中比较运算符主要有:=、>、<、>=、<
=、!=。
此外,连接谓词还可以使用下面形式:
[<表名1>.]<列名1>BETWEEN[<表名2.]<
列名2>AND[<表名2>.]<列名3>
当连接运算符为=时,称为等值连接。使用其它
运算符称为非等值连接。
例30 查询每个学生及其选修课程的情况。
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno;
例31 Student表和SC表的笛卡尔积。
SELECT Student.*,SC.*
FROM Student,SC
例32 自然连接Student表和SC表。
SELECT Student.Sno , Sname, Ssex, Sage,
Sdept, Cno, Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno;
或
SELECT Student.*,Cno, Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno;
2. 自身连接
例33 查询每一门课的间接先修课(即先修课的先
修课)。
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.Cno;
Cno Cpno
1
7
3
5
5
6
3. 外连接
例34
SELECT Student.Sno , Sname, Ssex, Sage,
Sdept, Cno, Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno(*);
Student.Sno,Sname, Ssex, Sage, Sdept, Cno, Grade
9500l
李勇
男
20
CS
1
92
9500l
李勇
男
20
CS
2
85
9500l
李勇
男
20
CS
3
88
95002
刘晨
女
19
IS
2 90
95002
刘晨
女
19
IS
3 80
95003
王名
女
18
MA
95004
张立
男
18
IS
4. 复合条件连接
例35 查询选修2号课程且成绩在90分以上的所有学生。
SELECT Student.Sno,Sname
FROM Student, SC
WHERE Student .Sno=SC.Sno AND
SC.Cno=’2’AND SC.Grade>90;
结果表为;
Student.Sno Sname
95002
刘晨
例36 查询每个学生选修的课程名及其成绩。
SELECT Student.Sno , Sname , Cname ,
Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno and SC.Cno
=COURSE.Cno;
3.3.3 嵌套查询
SELECT Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno=‘2’);
1. 带有IN谓词的子查询
例37 查询与“刘晨”在同一个系学习的学生。
查询与“刘晨”在同一个系学习的学生,可以首先确
定“刘晨”所在系名,然后再查找所有在该系学习的
学生。所以可以分步来完成此查询:
①确定“刘晨”所在系名
SELECT Sdept
FROM Student
WHERE Sname=‘刘晨’;
结果为:IS
②查找所有在IS系学习的学生。
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept=‘IS’;
分步写查询毕竟比较麻烦,上述查询实际上可以
用子查询来实现,即将第一步查询嵌入到第二步
查询中,用以构造第二步查询的条件。SQL语句
如下:
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname=‘刘晨’);
本例中的查询也可以用前面学过的表的自身连接
查询来完成:
SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1,Student S2
WHERE
S1.Sdept=S2.Sdept
AND
S2.Sname=‘刘晨’;
本例中父查询和子查询均引用了Student表.也可
以像表的自身连接查询那样用别名将父查询中的
Student表与子查询中的Student表区分开:
SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1
WHERE S1.Sdept IN
(SELECT S2.Sdept
FROM Student S2
WHERE S2.Sname=’刘晨’);
例38 查询选修了课程名为信息系统的学生学号和
姓名。
完成此查询的基本思路是:
①首先在Course关系中找出‘信息系统’课程的课程
号Cno。
②然后在SC关系中找出Cno 等于第一步给出的
Cno集合中某个元素的Sno。
③最后在Student关系中选出Sno等于第二步中求
出Sno集合中某个元素的元组。取出Sno和Sname
送入结果表列。
将上述想法写成SQL语句就是:
SELECT Sno,Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno IN
(SELECT Cno
FROM Course
WHERE Cname=’信息系统’));
DBMS按照由内向外的原则求解此SQL语句,首先
处理最内层查询块,即课程名‘信息系统’的课程
号:
SELECT Cno
FROM Course
WHERE Cname=‘信息系统’
查询结果为3。从而可以把上面的SQL语句简化为:
SELECT Sno,Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno IN (‘3’));
对此SQL语句再处理内层查询,
SELECT Sno
FROM SC
WHERE Cno IN (‘3’)
结果为95001和95002。从而可以把上面的SQL语
句进一步简化为:
SELECT Sno,Sname
FROM Student
WHERE Sno IN(‘95001’,‘95002’);
这样就可以求得最终结果。
本查询同样可以用连接查询实现:
SELECT Student.Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND
SC.Cno=Course.Cno AND
Course.Cname=’信息系统’;
2. 带有比较运算符的子查询
带有比较运算符的子查询是指父查询与子查询之
间用比较运算符进行连接。当用户能确切知道内
层查询返回的是单值时,可以用>、<、=、>
=、<=、!=或<>等比较运算符。
例如,在例37中,由于一个学生只可能在一个系
学习,也就是说内查询刘晨所在系的结果是一个
唯一值,因此该查询也可以用比较运算符来实现,
其SQL语句如下;
SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1
WHERE S1.Sdept =
(SELECT S2.Sdept
FROM Student S2
WHERE S2.Sname=’刘晨’);
需要注意的是,子查询一定要跟在比较符之后。
下列写法是错误的:
SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1
WHERE (SELECT S2.Sdept
FROM Student S2
WHERE S2.Sname=’刘晨’)=S1.Sdept;
例38中信息系统的课程号是唯一的,但选修该课
程的学生并不止一个,所以例38也可以用=运算符
和IN谓词共同完成:
SELECT Sno,Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno=
(SELECT Cno
FROM Course
WHERE Cname=’信息系统’));
3. 带有ANY或ALL谓词的子查询
>ANY 大于子查询结果中的某个值
<ANY 小于子查询结果中的某个值
>=ANY 大于等于子查询结果中的某个值
<=ANY 小于等于子查询结果中的某个值
=ANY
等于子查询结果中的某个值
!=ANY或<>ANY 不等于子查询结果中的某个
值
>ALL 大于子查询结果中的所有值
<ALL 小于子查询结果中的所有值
>=ALL 大于等于子查询结果中的所有值
<=ALL 小于等于子查询结果中的所有值
=ALL
等于子查询结果中的所有值(通常没有实
际意义)
!=ALL或<>ALL 不等于子查询结果中的任何一
个值
例39 查询其他系中比IS系某一学生年龄小的学生
名单。
SELECT S1.Sname,S1.Sage
FROM Student S1
WHERE S1.Sage<ANY
(SELECT S2.Sage
FROM Student S2
WHERE S2.Sdept=’IS’)
AND S1.Sdept<>’IS‘
ORDER BY S1.Sage DESC;
注意,S1.Sdept<>‘IS’条件是父查询块中的条件,
不是子查询块中的条件。
用集函数实现:
SELECT S1.Sname,S1.Sage
FROM Student S1
WHERE S1.Sage<
(SELECT MAX(S2.Sage)
FROM Student
WHERE S2.Sdept=’IS’)
AND S1.Sdept<>‘IS’
ORDER BY Sage DESC;
例40 查询其他系中比IS系所有学生年龄都小的学
生名单。
SELECT S1.Sname,S1.Sage
FROM Student S1
WHERE S1.Sage<ALL
(SELECT S2.Sage
FROM Student S2
WHERE S2.Sdept=’IS’)
AND S1.Sdept<>’IS“
ORDER BY S1.Sage DESC;
本查询同样也可以用集函数实现。即首先用子查
询找出‘IS’系的最小年龄(18),然后在父查询中
查所有非‘IS’系且年龄小于18岁的学生姓名及其
年龄。SQL语句如下:
SELECT S1.Sname,S1.Sage
FROM Student S1
WHERE S1.Sage<
(SELECT MIN(S2.Sage)
FROM Student S2
WHERE S2.Sdept=’IS’)
AND S1.Sdept<>’IS’
ORDER BY S1.Sage DESC;
事实上,用集函数实现子查询通常比直接用ANY
或ALL查询效率要高。
4. 带有EXISTS谓词的子查询
EXISTS代表存在量词。带有EXISTS谓词的子查
询不退回任何实际数据,它只产生逻辑真值
“TRUE”或逻辑假值“FALSE”。
例41 查询所有选修了1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE SC.Sno=Student. Sno AND Cno=‘1’);
例41 查询所有未修1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE SC.Sno=Student. Sno AND Cno=‘1’);
带有IN谓词的例37可以用如下带EXISTS谓词的子
查询替换:
查询与“刘晨”在同一个系学习的学生。
SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1
WHERE EXISTS
(SELECT *
FROM Student S2
WHERE S1.Sdept=S2.Sdept AND S2.Sname
=’刘晨’);
例42 查询选修了全部课程的学生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE SC.Sno=Student.Sno
AND SC.Cno=Course.Cno));
例43 查询至少选修了学生95002选修的全部课程
的学生号码。
本题的查询要求可以做如下解释,查询这样的学
生,凡是95002选修的课,他都选修了。换句话说,
若有一个学号为x的学生,对所有的课程y,只要
学号为95002的学生选修了课程y,则x也选修了y;
那么就将他的学号选出来。
即不存在这样的课程y,学生95002选修了y,而学
生x没有选。用SQL语言可表示如下:
SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS
(SELECT *
FROM SC SCY
WHERE SCY.Sno=’95002’ AND
NOT EXISTS
(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno AND
SCZ.Cno=SCY.Cno));
3.3.4 集合查询
集 合 操 作 主 要 包 括 并 操 作 UNION 、 交 操 作
INTERSECT和差操作MINUS。
例44 查询计算机科学系的学生及年龄不大于19岁
的学生。
SELECT *
FROM Student
WHERE Sdept=’CS’
UNION
SELECT *
FROM Student
WHERE Sage<=19;
本查询实际上是求计算机科学系的所有学生与年
龄不大于19岁的学生的并集。
例45 查询选修了课程1或者选修了课程2的学生。
本例实际上是查选修课程1的学生集合与选修课程
2的学生集合的并集。
SELECT Sno
FROM SC
WHERE Cno=’1’
UNION
SELECT Sno
FROM SC
WHERE Cno=’2’;
注:标准SQL只有并,没有交和差,但实际上,
交或差都可以用其它方法实现,具体实现根据不
同的查询而不同(用语义替换)。
例46 查询计算机科学系的学生与年龄不大于19岁
的学生的交集。
本查询换种说法就是,查询计算机科学系中年龄
不大于19岁的学生。
例47 查询选修课程l的学生集合与选修课程2的学
生集合的交集
本例实际上是查询既选修了课程1又选修了课程2
的学生。
例48 查询计算机科学系的学生与年龄不大于19岁
的学生的差集。
本查询换种说法就是,查询计算机科学系中年龄
大于19岁的学生。
例49 查询选修课程1的学生集合与选修课程2的学
生集合的差集
本例实际上是查询选修了课程1但没有选修课程2
的学生。
3.3.5 小结
问题:有关系模式part(Item_no,Name,P_no)表示
一个产品零部件情况及产品的组成(P_no表示上
一级的零件),如何用SQL实现查询:查询某个
产品(给定Item_no)的所有零部件?。
3.4 数据更新
3.4.1 插入数据
1. 插入单个元组
INSERT INTO <表名>[(<属性列1>[,<属性
列2>…)]
VALUES (<常量1>[,<常量2>…])
例1 将一个新学生记录(学号:95020;姓名:陈
冬;性别:男;所在系:IS;年龄:18岁)插入
Student表中。
INSERT INTO Student
VALUES(’95020’,‘陈冬’,‘男’,‘IS’,18);
例2 插入一条选课记录(’95020’,’1’)
INSERT INTO SC(Sno,Cno)
VALUES(“95020’,’1’);
2. 插入子查询结果
INSERT INTO<表名>[(<属性列1>[,<属性列
2>…]]
子查询;
例3 对每一个系,求学生的平均年龄,并把结果
存入数据库。
对于这道题,首先要在数据库中建立一个有两个
属性列的新表,其中一列存放系名,一列存放相
应系的学生平均年龄。
CREATE TABLE Deptage
(Sdept CHAR(15),Avgage SMALLINT);
然后对数据库的student表按系分组求平均年龄,
再把系名和平均年龄存入到新表中。
INSERT INTO Deptage(Sdept,Avgage)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;
3.4.2 修改数据
UPDATE <表名>
SET<列名>=<表达式>[,<列名>=<表达
式>…]
[WHERE <条件>];
1. 修改某一个元组的值
例4 将学生95001的年龄改为22岁
UPDATE Student
SET Sage=22
WHERE Sno=‘95001’;
2. 修改多个元组的值
例5 将所有学生的年龄增加1岁。
UPDATE Student
SET Sage=Sage+1;
3. 带子查询的修改语句
例6 将计算机科学系全体学生的成绩置零。
UPDATE SC
SET Grade=0
WHERE ‘CS’=
(SELECT Sdept
FROM Student
WHERE Student.Sno=SC.Sno);
或
UPDATE SC
SET Grade=0
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sdept=‘CS’);
4. 修改操作与数据库的一致性
第一条UPDATE语句修改Student表:
UPDATE Student
SET Sno=’96089’
WHERE Sno=’95007’;
第二条UPDATE语句修改SC表:
UPDATE SC
SET Sno=‘96089’
WHERE Sno=’95007’;
问题:SC表中要修改的Sno是引用Student的外键,
第一条UPDATE执行后,显然已破坏该参照完整
性。这样的过程能正常执行吗?
3.4.3 删除数据
DELETE FROM<表名>
[WHERE<条件>];
1. 删除某一个元组的值
例7 删除学号为95019的学生记录。
DELETE
FROM Student
WHERE Sno=‘95019’;
1.
删除多个元组的值
例8 删除所有的学生选课记录。
DELETE FROM SC;
2.
带子查询的删除语句
例9 删除计算机科学系所有学生的选课记录。
DELETE FROM SC
WHERE ‘CS’=
(SELECT Sdept
FROM Student
WHERE Student.Sno=SC.Sno);
3.5 视图
3.5.1 定义视图
1. 建立视图
CREATE VIEW<视图名>[(<列名>[,<列名
>]…)]
AS<子查询>
如果CREATE VIEW语句仅指定了视图名,省略了
组成视图的各个属性列名,则隐含该视图由子查
询中SELECT子句目标列中的诸字段组成。但在下
列三种情况下必须明确指定组成视图的所有列名:
l 其中某个目标列不是单纯的属性名,而是集
函数或列表达式。
l 多表连接时选出了几个同名列作为视图的字
段。
l 需要在视图中为某个列启用新的更合适的名
字。
例1 建立信息系学生的视图
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept=‘IS’;
本例中省略了视图IS_Student的列名,隐含了该视
图由子查询中SELECT子句中的3个目标列名组成。
DBMS执行此语句就相当于建立虚表:
IS_Student (Sno,Sname,Sage)
2.
删除视图
DROP VIEW<视图名>;
例2 删除视图IS_Student。
DROP VIEW IS_Student;
3.5.2 查询视图
对视图的查询转换为对基表的查询的过程称为视
图的消解(view resolution)。
例3 在信息系学生的视图中找出年龄小于20岁的
学生。
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
DBMS执行此查询时,将其与IS_Student视图定义
中的子查询
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept=‘IS’;
结合起来,转换成对基表student的查询:
SELECT Sno,Sage
FROM Student
WHERE Sdept=‘IS’ AND Sage<20;
3.5.3 更新视图
更新视图包括插入(INSERT)、删除(DELETE)和修
改(UPDATE)三类操作。
例如,如定义的视图S_G是由‘学号’和‘平均成绩’两
个属性列组成的,其中平均成绩一项是由SC表中
多个元组分组后计算平均值得来的。如果想把视
图S_G中学号为95001的学生的平均成绩改成90分,
SQL语句如下:
UPDATE S_G
SET Grade=90
WHERE Sno=’95001’;
但这个对视图的更新是无法转换成对基表SC的更
新的,因为系统无法修改各科成绩,以便平均成
绩成为90。所以S_G视图是不可更新的。
l 由一个基表定义的视图,只有含有基表的主
键或候补键,并且视图中没有用表达式或函数定
义的属性,才允许更新;
l 由多表连接所定义的视图不允许更新;
l 定义中用到GROUP BY子句或集函数的视图
不允许更新。
3.5.4 视图的用途
1. 视图能够简化用户的操作
2. 视图使用户能以多种角度看待同一数据
3. 视图对重构数据库提供了一定程度的逻辑独
立性
例如,将学生关系
Student(Sno,Sname,Ssex,Sage,Sdept)分为
SX(Sno,Sname,Ssex) 和
SY(Sno,Sage,Sdept)
两个关系,这时原表Student为SX表和SY表自然
连接的结果。如果建立一个视图Student:
CREATE VIEW Student (Sno, Sname, Ssex,
Sage, Sdept)
AS
SELECT SX.Sno,Sname,Ssex,Sage,Sdept
FROM SX,SY
WHERE SX.Sno=SY.Sno;
4. 视图能够对机密数据提供安全保护
3.6 嵌入式SQL介绍
嵌入式SQL(embedded SQL)
嵌入式SQL必须解决下列四个问题:
(1)宿主语言编译器不可能识别和接受SQL语言,
如何将嵌有SQL的宿主语言编译成可执行码,这
是首先要解决的问题;
(2)宿主语言和DBMS之间如何传递数据和信息;
(3)数据库的查询结果一般是元组的集合,而宿主
语言使用变量(单值),这些元组须逐个地赋值给程
序中的变量,供宿主语言处理,其间存在一个转
换问题;
(4)两者的数据类型有时不完全对应或等价,须解
决必要的数据类型转换问题。要进行何种数据类
型转换,与宿主语言和DBMS有关。
如 ORACLE 的 PRO 接 口 : PRO*C 、
PRO*PASCAL等。
第四章 数据库系统结构
4.1 数据库系统的模式结构
type
value
4.1.1 数据库系统的三级模式结构
1. 模式
2. 外模式
3. 内模式
图4-1 数据库系统的模式结构
4.1.2 数据库的二级映象功能与数据独立性
两层映象:外模式/模式映象和模式/内模式映象
4.1.3 Conclusion
4.2 数据库系统的体系结构
从最终用户角度来看,数据库系统分为单用户结构、
主从式结构、分布式结构和客户/服务器结构等。
4.2.1 单用户数据库系统
图4-2 单用户数据库系统
4.2.2 主从式结构的数据库系统
图4-3 主从式数据库系统
特点:数据集中、处理集中。
4.2.3 分布式结构的数据库系统
图4-4 分布式数据库系统
特点:数据分布、处理分布。
4.2.4 Client/Server结构的数据库系统
图 4-5 集中的服务器结构
特点:数据集中、处理分布 。
图 4-6 分布的服务器结构
特点:数据分布、处理分布 。
4.2.5 联邦分布式数据库系统
每个结点所看到的数据模式仅仅限于该结点所
用到的数据。它—般由两部分组成:一是本结
点的数据模式,二是供本结点共享的其他的点
上有关的数据模式。
结点间的数据共享由双边协商确定。
特点:数据分布、处理分布。
目 前 大 型 主 流 DBMS ( 如 ORACLE 、 SQL
Server 等 ) 商 品 化 产 品 均 为 支 持 分 布 的
Client/Server结构。
4.3 Database Management System
4.3.1 DBMS的功能和组成
1.
数据定义
2.
数据操纵
3.
数据库运行管理
4.
数据组织、存储和管理
5.
数据库的建立和维护
6.
数据通信接口
为了提供上述6方面的功能,DBMS通常由以下4
部分组成。
1.
数据定义语言及其翻译处理程序
2.
数据操纵语言及其编译(或解释)程序
3.
数据库运行控制程序
4.
实用程序
4.3.2 数据库管理系统的工作过程
图 4-7
从数据库中读取记录的过程
应用程序(或用户)从数据库中读取一个数据通常
需要以下步骤:
1.
应用程序A向DBMS发出从数据库中读数据
记录的命令;
2.
DBMS对该命令进行语法检查、语义检查,
并调用应用程序A对应的外模式,检查A的存取
权限,决定是否执行该命令。如果拒绝执行,则
向用户返回错误信息;
3.
在决定执行该命令后,DBMS调用模式,
依据外模式/模式映象的定义,确定应读入模式
中的哪些记录;
4.
DBMS调用内模式,依据模式/内模式映
象的定义,决定应从哪个文件、用什么存取方
式、读入哪个或哪些物理记录;
5.
DBMS向操作系统发出执行读取所需物理
记录的命令;
6.
操作系统执行读数据的有关操作;
7.
操作系统将数据从数据库的存储区送至系
统缓冲区;
8.
DBMS依据外模式/模式映象的定义,导
出应用程序A所要读取的记录格式;
1.
DBMS将数据记录从系统缓冲区传送到应用
程序A的用户工作区;
2.
DBMS向应用程序A返回命令执行情况的状态
信息。
图4-8表示了一个关系DBMS处理上述过程的层次
结构。
图4-8 关系
DBMS的层次
结构
4.3.3 TRANSACTION
1. Atomic
Nothing Or All
2. Consistency
3. Isolation
4. Durability
例1 将款项S从A帐号拨给B帐号。
BEGIN TRAN
/*事务开始*/
Read A
/*读A帐号*/
A=A-S
/*从A帐号中减去款项S*/
If A<0 then /*A款不足*/
Begin
Display “A款不足”
ROLLBACK
/*卷回事务,即返回到该事务
执行之前的状态*/
End
Else
Begin
B=B+S
/*为B帐号加上款项S*/
Display “拨款完成”
COMMIT
End
/*事务提交,持久化*/
出口:ROLLBACK——Nothing
COMMIT——All
4.3.4 数据库管理系统的实现方法
1. N方案
图 4-9 N 方案
图 4-10 2N 方案
如FOXPRO、MS ACCESS等桌面(DESKTOP)DBMS。
2. 2N方案
3. M+N方案
图 4-11
M+N 方案
图 4-12
N+1 方案
4. N+1方案
l
Nonblocking I/O and asynchronous I/O
l
Fair Schedule
4.4 Data Catalog (or directory)
数据字典(data dictionary)
第五章 数据库的存储结构
5.1 数据库存储介质的特点
l 内存
容量低(一般只有几百M,最多一两个G),价格
高,速度快,数据易丢失(掉电、当机等)。
一般做DBMS(或CPU)和DB之间的数据缓冲区。
实时/内存数据库系统中使用内存存放实时数据。
l 硬盘
容量高(一般有几十G,多到一两百G),价格中,
速度较快,数据不易丢失(除非物理性损坏)。
一般做用来存放DB。实时/内存数据库系统中使用
硬盘存放历史数据库。
l 移动硬盘(USB接口)
容量高(一般有几十G),价格中,速度较快,数
据不易丢失(除非物理性损坏)。
一般做用来做备份。
l 光盘
容量低(一般650M/片,但光盘可在线更换,海
量),价格低,速度中,数据不易丢失(除非物
理性损坏)。
一般做用来做备份。
l 磁盘(软盘)
容量低(一般有几M,优盘多到一两百M),价格
中,速度较慢,数据不易丢失(除非物理性损
坏)。
一般数据库不使用磁盘。
l 磁带
容量低(但可在线更换,海量),价格低,速度
最慢,且要按顺序存取,数据不易丢失(除非物
理性损坏)。
一般做用来做备份。
按速度从高到低:
内存、硬盘、USB盘(移动硬盘和优盘)、光盘、
软盘、磁带。
按在线容量从大到小:
硬盘、移动硬盘、内存、光盘、磁带、优盘、软
盘。
物理块:512byte/1K/2K/4K/8K
原因:
(1) 减少I/O的次数;
(2) 减少间隙的数目,提高硬盘空间的利用率。
ORACLE 逻 辑 块 与 物 理 块 ( init.ora 中
db_block_size定义逻辑块大小)
缓冲块和缓冲区(即SGA中的Data Buffer Cache)
延迟写(delayed write)技术/预取(Prefetching)技术
(ORACLE中由DBWR进程完成数据的读写)
5.2 记录的存储结构
5.2.1 记录的物理表示
1. Positional Technique
2. Relational Technique
3. Counting Technique
5.2.2 记录在物理块上的分配
不跨块组织(unspanned organization)
跨块组织(spanned organization)
5.2.3 物理块在磁盘上的分配
1. 连续分配法(continuous allocation)
2. 链接分配法(linked allocation)
3. 簇集分配法(Clustered Allocation)
4. 索引分配法(Indexed Allocation)
5.2.4 数据压缩技术
1. 消零或空格符法(null suppression)
如:#5表示5个空格,@6表示6个零等。
2. 串型代替法(pattern substitution)
3. 索引法(indexing)
5.3 文件结构和存取路径
5.3.1 访问文件的方式
1. 查询文件的全部或相当多的记
录
2. 查询某一特定记录
3. 查询某些记录
4. 范围查询
5. 记录的更新
5.3.2 数据库对文件的要求
5.3.3 文件的基本类型
1. 堆文件(heap file)
方便(快):插入
不方便(慢):查找、删除
2. 直接文件(direct file)
方便(快):按散列键访问
不方便(慢):其它访问方式
3. 索引文件(indexed file)
方便(快):按索引键访问
不方便(慢):其它访问方式,特别是更新时要
进行索引维护。
l 索引项=<索引键,地址>
l primary index and secondary index
l nondense index and dense index
l 预查找功能
设要查询年龄为20岁或2l岁的四年级学生,如果
学生文件在年龄和年级属性上建有索引,则可查
出年龄为20岁的学生记录的集合S20 ,年龄为2l岁
的学生记录的集合S21,四年级学生记录的集合Ss,
于是,所需的学生记录的集合S应为:
S=(S20∪S21) ∩Ss
l clustering index
l B tree index
动态平衡多叉(分)树
有B+ 树、B* 树等,数据库管理系统中常用B+ 树实
现索引。
B+树结构:
B+树动态平衡特性:
(1) 每个结点最多有2k个键值;
(2) 根结点至少有—个键值,其他结点至少有k个
键值;
(3) 除叶结点(即顺序集结点)无子女外,对于其他
结点,若有J个键值,则有J+1个子女;
(4) 所有叶结点都处于树的同一级上,即树始终保
持平衡。
k值一般根据块的大小确定,使得B+树的结点最大
不超过一个块,即一个结点占一个块(block)。
优点:所有记录都具有相同的访问I/O次数(即树
的高度+记录本身访问的I/O次数),(若k=20,
树的高度为11,则至少可表示2010=1024X1010 个
记录)。
缺点:索引维护需要代价,当记录更新引起索引
变化时,最差的情况可能从底层一直影响到根结
点,即整个树的变动。
第六章 查询处理和优化
6.1 Introduction
1. 代数优化
2. 物理优化
3. 规则优化
4. 代价估算优化
6.2
代数优化
例1 设有S(供应商),P(零件),SP(供应关系)
三个关系,关系模式如下:
S(SNUM,SNAME,CITY)
P(PNUM,PNAME,WEIGHT,SIZE)
SP(SNUM,PNUM,DEPT,QUAN)
设有查询Q:
SELECT SNAME
FROM S,P,SP
WHERE S.SNUM=SP.SNUM
AND SP.PNUM=P.PNUM
AND S.CITY=‘NANJING’
AND P.PNAME=‘BOLT’
AND SP.QUAN>10000;
代数优化的大致过程:
1. 以SELECT子句对应投影操作,以FROM子句
对应笛卡儿乘积,以WHERE子句对应选择操作,
生成原始查询树。
2. 应用变换原则(2)、(6)、(7)、(9),尽可能将选
择条件移向树叶方向。
3. 应用连接、笛卡儿乘积的结合律,按照小关系
先做的原则,重新安排连接(笛卡儿乘积)的次序。
4. 如果笛卡儿乘积后还须按连接条件进行选择操
作,可将两者组合成连接操作。
5. 对每个叶结点添加必要的投影操作,以消除对
查询无用的属性。
6.3 依赖于存取路径的规则优化
6.3.1 选择操作的实现和优化
1. 相关因素
l 选择条件
l 可用的存取路径
l 选取的元组数在整个关系中所占的比例有关
2. 实现方法
(1)
对于小关系,不必考虑其他存取路径,直接
用顺序扫描。例如对于六个物理块大小的关系,
如果顺序搜索,则平均的I/O次数为3,不值得采用
其他存取路径。
(2)
如果无索引或散列等存取路径可用,或估计
中选的元组数在关系中占有较大的比例(例如大于
20%)且有关属性上无族集索引,则用顺序扫描。
(3) 对于主键的等值条件,最多只有一个元组可以
满足此条件,应优先采用主键上的索引或散列。
(4)
对于非主键的等值条件,要估计中选的元组
数在关系中所占的比例。如果比例较小(例如小于
20%),可以用无序索引,否则只能用簇集索引或
顺序扫描。
(5)
对于范围条件,一般先通过索引找到范围的
边界,再通过索引的顺序集沿相应方向按索,例
如对于条件Sage>20,可先找到Sage=20的顺
序集结点,再沿顺序集向右搜索。若中选的元组
数在关系中所占比例较大,且无有关属性的簇集
索引,则宜采用顺序扫描。例如对于条件Sage>
15,因为大学生绝大部分是大于15岁的。
(6)
对于用AND连接的合取选择条件。若有相应
的多属性索引,则优先采用多属性索引。否则,
可检查诸合取条件中有无多个可用二次索引的,
若有,则用预查找法处理。即通过二次索引找出
满足各合取条件的tid集合,再求这些tid集合的交
集。然后取出交集中tid所对应的元组.并在取这
些元组的同时,用合取条件中的其余条件检查。
凡能满足所有其余条件的元组,即为所选择的元
组。如果上述途径都不可行,但合取条件中有个
别条件具有规则(3)、(4)、(5)中所述的存取路径,
则可用此存取路径选择满足此条件的元组,再将
这些元组用合取条件中的其他条件筛选。若在诸
合取的条件中,没有一个具有合适的存取路
径.那只有用顺序扫描。
(7) 对于用OR连接的析取选择条件,尚无好的优
化方法,只能按其中各个条件分别选出一个元组
集,再求这些元组集的并。众所周知,并是开销
大的操作,而且在OR连接的诸条件中,只要有一
个条件无合适的存取路径,就不得不采用顺序扫
描来处理这种查询。因此,在查询语句中,应尽
量避免采用析取选择条件。
(8) 有些选择操作只要访问索引就可得到结果,例
如查询索引属性的最大值、最小值、平均值等。
在此情况下,应优先利用索引、避免访问数据。
6.3.2 连接操作的实现和优化
1.
嵌套循环(nested loop)法
R R.A=S.B S
外关系(outer relation)
内关系(inner relation)
2. 利用索引或散列寻找匹配元组法
3. 排序归并(sort-merge)法
下面是选用连接方法的启发式规则。
(1)
如果两个关系都已按连接属性排序,则优先
用排序归并法。如果两个关系中已有一个关系按
连接属性排序,另一个关系很小,也可考虑对此
未排序的关系按连接属性排序,再用排序归并法
连接。
(2)
如果两个关系中有一个关系在连接属性上有
索引(特别是簇集索引)或散列,则可令另一关系为
外关系,顺序扫描,并利用内关系上的索引或散
列寻找其匹配元组,以代替多遍扫描。
(3)
如果应用上述两规则的条件都不具备,且两
个关系都比较小,可以应用嵌套循环法。
(4) 如果(1)、(2)、(3)规则都不适用,可用散列连
接法。
6.3.3 投影操作的实现
6.3.4 集合操作的实现
6.3.5 组合操作
第七章 事务管理
恢复
事务管理
并发控制
7.1 恢复引论
fault
error
failure
loss
1. 单纯以后备复本为基础的恢复技术
2. 以后备复本和运行记录(log或journal)为基础的
恢复技术
运行记录包括:
(1) 前象(Before Image BI)——undo
(2) 后象(After Image AI)——redo
(3) 事务状态
commit
rollback/abort
backward recovery —— undo
forward recovery —— redo
3. 基于多复本的恢复技术
independent failure mode
多服务器DBS:
1. 双机热备份
2. 双机CLUSTER
3. 磁盘阵列RAID0~5
4. 等
7.2
运行记录的结构
1. Active Transaction List (ATL)
2. Committed Transaction List (CTL)
3. 前象文件
4. 后象文件
措施:
1. 不保留已提交事务的前象
2. 有选择地保留后象
3. 合并后象
7.3 更新事务的执行与恢复
更新事务在执行时应遵守下列两条规则:
1. 提交规则(commit rule)
2. 先记后写规则(log ahead rule)
方案:
1. 后象在事务提交前完全写入数据库
其步骤如下:
(1) TID→ATL
(2) BI→log /*先记后写规则*/
(3) AI→DB /*在提交前,后象完全写入DB,
满足提交规则*/
(4) TID→CTL
(5) 从ATL中删除TID
2. 后象在事务提交后才写入数据库
其步骤如下:
(1) TID→ATL
(2) AI→log /*提交规则*/
(3) TID→CTL
(4) AI→DB
(5) 从ATL中删除TID
3. 后象在事务提交前后写入数据库
其步骤如下:
(1) TID→ATL
(2) AI、BI→log
/* 提 交 规 则 及 先 记 后 写
规则*/
(3) AI→DB(部分写入)
(4) TID→CTL
(5) AI→DB(继续完成)
7.4 易地更新恢复技术
设有数据库DB为:
DB={F1,……Fj,……Fn}
(1)
取M到内存,并读取
M[j];
(2) 按M[j]找到PTj,并取
PTj 到 内 存 中 ( 为 Ti 所 用 的
PTj 的内存版本表示为 PTji ,
见图7-8);
(3) 按PTji[k]取Fj 的第k页
Pjk 至内存,并在内存中更
新其内容,设更新后的P
jk
(4) ’写入P’jk至数据库的一个新地方,设其在磁盘
为P
’ );
jk;
上的地址为ADD(P
jk
(5) 在内存中,以ADD(P’jk)加取代PTji[k],因而
在内存中形成PTj的新版本PTji;
(6) 写入PTji至数据库的一个新地方,设其
在磁盘上的地址为ADD(PTji);
(7) 再取M至内存;
(8) 以ADD(PTji)取代M[j];
(9) 在原地址写回M,事务提交。
易地更新恢复技术的限制和缺点
7.5 消息的处理
消息管理(message manager MM)
7.6 失效的类型及恢复的对策
1. 事务失效
措施:
l MM丢弃该事务的消息队列;
l 如果需要,进行undo操作;
l 从ATL删除该事务的TID,释放该事务所占
的资源。
2. 系统失效
措施:
l 重新启动操作系统和DBMS;
l 恢复数据库至一致状态(对末提交的事务进行
undo操作,对已提交的事务进行redo操作)。
检查点(check point CP)
取CP的过程如下:
l 暂停事务的执行
l 写入上一个CP以后所提交的事务留在内存中
的后象
l 在运行记录的提交事务表中记下检查点
l 恢复事务的执行。
3. 介质失效
措施:
l 修复系统,必要时更换磁盘;
l 如果系统(操作系统和DBMS)崩溃,重新启动
系统;
l 加载最近后备复本;
l
用运行记录中的后象,重做取最近后备复本
以后提交的所有事务。
7.7 并发控制引论
7.7.1 数据库系统中的并发
串行访问
交叉并发
并发访问
同时并发
7.7.2 并发的目的
1. 改善系统的资源利用率
2. 改善短事务的响应时间
7.7.3 并发引起的问题
1. 丢失更新(lost update)
写—写冲突(write-write conflict)
2. 读脏数据(dirty read)
读—写冲突(read-write conflict)
3. 读值不可复现(unrepeatable read)
读—写冲突(read-write conflict)
7.7.4 并发控制的正确性准则
操作顺序安排的原则是:既要交叉执行,以充分利
用系统的资源;又要避免访问冲突。
S=…R1(x)…W2(x)…R1(x)…
目标等价(view equivalence)
冲突等价(conflit equivalence)
冲突的操作:Ri(x)和Wj(x)以及Wi(x)和Wj(x) i≠j
不冲突的操作:Ri(x)和Rj(x)以及Ri(x)和Wj(y) i≠j
可串行化(serializable)
S=R2(x)W3(x)R1(y)W2(y)
S→R2(x)R1(y)W3(x)W2(y)→R1(y)R2(x)W2(y)W3(x)=S’
Conclusion: 在一般DBMS中都是以可串行化作为并
发控制的正确性准则(冲突可串行化)。
7.8
加锁协议
7.8.1 X锁
X锁:既用于写操作,也用于读操作。
连锁卷回(cascading rollback)
7.8.2 两段封锁协议
定义7.8-1 在一个事务中,如果加锁动作都在所
有释放锁动作之前,则称此事务为两段事务(twophase transaction)。上述的加锁限制称为两段封
锁协议(two-phase locking protocol,简称2PL协
议)。
定义7.8-2 一个事务如果遵守先加锁,后操作的
原则,则此事务称为合式(well formed)事务。
定理7.8-1 如果所有事务都是合式、两段事务,
则它们的任何调度都是可串行化的。
严格的2PL协议(strict 2PL protocol)
7.8.3 (S,X)锁
S锁(Sharing locks)用于读访问
X锁(eXclusive locks)用于写访问
活锁(live lock): first come first serve
7.8.4 (S,U,X)锁
活锁(live lock): first come first serve
7.9
死锁的检测、处理和防止
死锁(dead lock):对付死锁无非两种办法:
一是检测死锁,发现死锁后处理死锁;二是防
止死锁。
7.9.1 死锁的检测和处理
1. 超时法
2. 等待图法(wait-for graph)
G=(W,U)
其中,W是结点的集合,w={Ti|Ti是数据库系统
中当前运行的事务,i=1,2,…,n}
U是边的集合,U={(Ti,Tj)|Ti等待Tj,i≠j}
DBMS对死锁一般作如下处理:
l
在循环等待的事务中,选一个事务作为牺
牲者(victim),给其他事务“让路”;
l
卷回牺牲的事务,释放其获得的锁及其他
资源;
l
将释放的锁让给等待它的事务。
被牺牲事务的选择原则:
l
选择最迟交付的事务作为牺牲者
l
选择获得锁最少的事务作为牺牲者
l
选择卷回代价最小的事务作为牺牲者
7.9.2 死锁的防止
时间标记(time stamp简称时标ts):随时间增
长的正整数。
系统启动时,ts=0,每当一个新事务开始运行时,
ts+1,并把此时的ts赋予该事务,作为该事务的
时标。
设有两个事务TA和TB,如ts(TA)<ts(TB),则表示
TA早于TB,也就是TA比TB“年老”,或者说TB比
TA“年轻”。
1. 等待—死亡(wait-die)策略
设TB持有某数据对象的锁,当TA申请同一数据对象
的锁而发生冲突时,则按如下的规则处理:
if ts(TA)<ts(TB) then TA waits;
else {
rollback TA;
/*die */
restart TA with the same ts(TA);
}
2. 击伤—等待(wound-wait)策略
if ts(TA)>ts(TB) then TA waits;
else {
rollback TB;
/*wound */
restart TB with the same ts(TB);
}
7.10 多粒度封锁
7.11 基于时间标记的并发控制技术
7.11.1 基本的时间标记协议
事务的时间标记:ts(T)
数据的时间标记:
l
读时间标记tr
l
写时间标记tw
1. 事务T读数据D
read(D);
if ts(T) ≥tw
then
/*符合时间标记协议,read(D)即
为读取值*/
tr := max(ts(T), tr);
else
/*已有比T年轻的事务写入D,违反时间
标记协议,T应卷回*/
rollback T and resart it with a new ts(T);
2. 事务T写数据D
if ts(T) ≥tr AND ts(T) ≥tw
then
/*符合时间标记协议*/
{
write(D);
tw := ts(T);
}
else
/*违反时间标记协议,T应卷回*/
rollback T and resart it with a new ts(T);
7.11.2 多版本并发控制技术
7.12
乐观并发控制技术
乐观法(optimistic method)
悲观法(pessimistic method)
1. 读阶段(read phase)
2. 检验阶段(validation phase)
3. 写阶段(write phase)
检验Ti ,设Tj 是已提交或正在检验的任一事务,
如果对所有Tj ,Ti 满足下列三个条件之一,则检
验通过,Ti 可进人写阶段;否则,Ti 须卷回并重
新启动。
(1) Tj在Ti进入读阶段之前就已完成写阶段
(2) Ti的读数据集与Tj的写数据集的交集为空集,
而且Ti在Tj完成写阶段之后才进人写阶段
(3) Ti的读数据集和写数据集都与Tj的写数据集不相交
书后习题:
16.如果把wait-die策略修改为:
如果ts(TA)>ts(TB)
则TA等待
否则,卷回TA,井以原来的ts(TA)重新启动。
请回答以下问题:
(1)此策略能否避免死锁?
(2)此策略有何主要问题?
(3)如何改进此策略,消除其存在的问题?
(4)请将改进后的策略与标准的wait-die和woundwait策略比较。
第八章
数据库的安全和完整性约束
数据库的破坏一般来自下列四个方面:
(1)系统故障;
(2)并发所引起的数据不一致;
(3)人为的破坏,例如数据被不该知道的人访问,
甚至被篡改或破坏;
(4)输入或更新数据库的数据有误,更新事务未遵
守保持数据库一致性的原则。
8.1
数据库的安全
安全的操作系统是数据库安全的前提。
8.1.1 视图定义和查询修改
8.1.2 访问控制
数据库用户按其访问权力的大小,一般可分为以
下三类。
1. 一般数据库用户
在SQL中,这种用户称为“具有CONNECT特权的
用户”。这种用户可以与数据库联系,并具有下列
特权:
(1)按照授权可以查询或更新数据库中的数据;
(2)可以创建视图或定义数据的别名。
2. 具有支配部分数据库资源特权的数据库用户
在SQL中,这种用户称为“具有RESOURCE特权
的用户”,除具有一般数据库用户所拥有的所有特
权外,还有下列特权:
(1)可以创建表、索引和簇集;
(2)可以授予或收回其他数据库用户对其所创建的
数据对象的访问权;
(3)有权对其所创建的数据对象跟踪审查(audit)(有
关跟踪审查的内容将在稍后介绍)。
3. 具有DBA特权的数据库用户
DBA拥有支配整个数据库资源的特权,这种用户
除具有上述两种用户所拥有的一切特权外,还有
下列特权:
(1)有权访问数据库中的任何数据;
(2)不但可以授予或收回数据库用户对数据对象的
访问权,还可以批准或收回数据库用户;
(3)可以为PUBLIC定义别名,PUBLIC是所有数据
库用户的总称;
(4)有权对数据库进行调整、重组或重构;
(5)有权控制整个数据库的跟踪审查。
1.
2.
identification and authentication
authorization
GRANT 〈特权类型〉 [{,〈特权类型〉}]
TO〈 用 户 标 识 符 〉 [ IDENTIFIED BY 〈 口
令〉];
〈特权类型〉::=CONNECT | RESOURCE |
DBA
例8-1 GRANT DBA TO WANG IDENTIFIED BY
B02M29@J;
例 8-2
GRANT CONNECT TO CHANG
IDENTIFIED BY xyzabc;
GRANT RESOURCE TO CHANG;
REVOKE〈特权类型〉 [{,〈特权类型〉}]
FROM〈用户标识符〉;
GRANT 〈特权〉 ON 〈表名〉 TO 〈受权者〉
[ { , 〈 受 权 者 〉 } ] [ WITH GRANT
OPTION];
〈特权〉::=ALL PRIVILEGES | 〈操作〉[{,
〈操作〉}]
〈操作〉::=SELECT | INSERT | DELETE |
UPDATE [(〈准许修改的属性表〉)]
〈准许修改的属性表〉::=〈属性名〉[{,〈属
性名〉}]
〈受权者〉::=PUBLIC | 〈用户标识符〉
REVOKE 〈特权〉ON〈表名〉FROM〈受权者〉
[{,〈受权者〉}];
设有用户Ul、U2、U3和U4,U1有一张表S,下面
是一连串授权过程:
U1授权给U2:
U1 : GRANT SELECT ON TABLE S TO U2
WITH GRANT OPTION;
U2授权给U3:
U2:GRANT SELECT ON TABLE U1.S TO U3
WITH GRANT OPTION;
U3授权给U4:
U3:GRANT SELECT ON TABLE U1.S TO U4
WITH GRANT OPTION;
U1收回授给U2的特权;
U1:REVOKE SELECT ON TABLE S FROM U2;
此 语 句 的 作 用 不 仅 收 回 U1 授 予 U2 的 特 权 ( 即
SELECT ON TABLE S),而且还收回U2授予U3、
U3授予U4的这种特权。
GRANT SELECT , UPDATE(GRADE ,
ADDRESS) ON TABLE S1 TO XU,MA;
8.1.3 数据加密
8.1.4 跟踪审查
AUDIT SELECT,INSERT,DELETE,UPDATE
ON emp WHENEVER SUCCESSFUL;
即对emp表的每次成功的选择、增、删、改操作
都作跟踪审查记录。
NOAUDIT ALL ON emp;
8.2 统计数据库的安全
8.3 完整性约束
8.3.1 完整性约束的类型
固有约束
静态约束
隐含约束
显式约束
动态约束
8.3.2 完整性约束的说明
1 用过程说明约束
2 用断言说明约束
ASSERT余额约束 ON 储蓄账:余额≥0;
3 用触发子表示约束
whenever <条件> thcn <动作>;
DEFINE TRIGGER 余额约束ON储蓄账:
余额<0
ACTION_PROCEDURE 卷回事务,通知帐户;
4 CHECK子句
8.3.3 完整性约束的实施
第九章 分布式数据库管理系统
9.1
分布式数据库系统
分布式数据库系统(distributed database system,
简称DDBS)
DDBS有以下三个特点:
(1)
数据是分布的,因此它不同于通过计算机网
共享的集中式数据库系统;
(2)
分布的数据是相互有关的,一般是一个单位
或多个有关单位的数据,因此它不同于由网络互
连的多个独立数据库系统;
(3) 数据由DDBMS统一管理,因此它不同于一般
的分布式文件系统。
分布式数据库有下列四个优点:
(1) 有利于改善性能
(2) 可扩充性好
(3) 可用性好
(4) 自治性好
DDBS的缺点:
(1) 异构
(2) 分布设计
9.2
数据分布策略
9.2.1 数据分布的目的
1. 提高访问的局部性(locality of reference)
2. 分担负荷
目的不同,数据库服务器的位置、客户机与其连
接的方式均不同。
9.2.2
1.
2.
3.
数据分布的方式
划分式(partitioned)
全重复式(fully replicated)
部分重复式(partially replicated)
9.2.3 关系的分割
分布单位:
1. 关系
2. 裂片(fragment)
分割方式:
l 水平分割
l 垂直分割
l 混合分割
分割准则:
a) Completeness
b) Reconstruction
c) Disjointness
9.2.4 数据分布带来的问题
1. 保持多复本—致性
2. 保持分布一致性
3. 全局查询的处理
4. 分布事务的管理
9.3 分布式数据库系统结构
9.4 数据目录的分布及管理
9.4.1 数据目录分布的策略
1. 集中式(centralized)
2. 扩展的集中式(centralized (extended))
3. 全重复式(fully replicated)
4. 部分重复式(partially replicated)
5. 用 缓 存 提 高 目 录 读 速 度 (speed up through
caching)
9.4.2 分布式数据库系统中的命名
1. 全局名空间(global name space)
2. 层次名空间
9.5
化
查询分解和优
9.6 分布式数据库系统中的恢复技术
9.6.1 两步提交协议
9.6.2 三步提交协议
9.7 分布式数据库系统中的并发控制
9.7.1 分步式数据库系统中的两步封锁
1. 写全锁(write locks all)
写全锁的加锁协议如下:
l 读:在任一复本上加S锁
l 写:在所有复本上加X锁
l 保持所有锁到全局事务结束(EOT)
2. 多数封锁(majority locking)
加锁协议如下:
l 读:对过半数的复本上加S锁
l 写:对过半数的复本上加X锁
l 保持所有锁到全局事务结束(EOT)
3. N中取K封锁(K out of N locking)
加锁协议如下:
l 写:对n个复本中的k个复本上加X锁 k>n/2
l 读:对n个复本中的n-k+1个复本上加S锁
l 保持所有锁到全局事务结束(EOT)
4. 主结点法
9.7.2 全局死锁的检测
第十章
数据依赖和关系模式的规范化
10.1 关系模式设计中的一些语义问题
Functional Dependency (FD): X→Y
R(S#,C#,G.,TN,D)
F={{S#,C#}→G, C#→TN, TN→D}
计算机系要通知教师准备给学生补考,可以“查
询计算机系所开课程的不及格学生的学号、不及
格课程号以及任课教师的姓名”:
SELECT S#,C#,TN
FROM R
WHERE D=‘CS’AND G=‘F’;
问题:
1. 数据冗余太大
2. 更新异常(update anomalies):
l modification anomaly
l insertion anomaly
l deletion anomaly
solution:
分解——关系模式规范化:
SCG(S#,C#,G)
CTN(C#,TN)
TND(TN,D)
SELECT S#,C#,TN
FROM SCG,CTN,TND
WHERE
SCG.C#=CTN.C#
AND
CTN.TN=TND.TN AND D=’CS’ AND G=’F’;
10.2 函数依赖
R U={A1,A2,…,An} F r
Define 10.2-1 functional dependency
R(A1,A2,…,An) XU, Y U t1,t2 r 若t1[X]=t2[X], 则
t1[Y]=t2[Y], X→Y
Trivial functional dependency: 若Y X,则X→Y
X →Y
若X→Y,Y→X则X↔Y
Define 10.2-2 full (partial) functional dependency
R(A1,A2,…,An) X U, Y U 且X≠Y,如X→Y,
且X‘ X,使得X’→Y,则称X Y,否则,
p
X
Y。
f
p
{S#, C#} TN {S#, C#}
G
f
Define 10.2-3 transitive functional dependency
R(A1,A2,…,An) X U, Y U, Z U,且X≠Y≠Z,
t
若X→Y,Y → X,Y→Z,则称X
Z。
Define 10.2-4 逻辑蕴涵
F是R的FD的集合,X→Y是R的一个FD,若一关
系模式满足F,则必然满足X→Y,称F逻辑蕴涵
X→Y:F╞ X→Y
Define 10.2-5 closure
函数依赖集合F所逻辑蕴涵的函数依赖的全体称为
F的闭包,记为F+,即F+={X→Y|F╞ X→Y }
Armstrong’s axioms:
A1: reflexivity
若Y X U,则X→Y。
A2: augmentation
若X→Y,且Z U,则XZ→YZ。
A3: transitivity
若X→Y,Y→Z,则X→Z。
合并规则:{X→Y,X→Z}╞ X→YZ
引理10.2-1 Armstrong公理是正确的(sound),即
如果F成立,则由F根据Armstrong公理所推导的函
数依赖总是成立的。
引理10.2-2 下列三条推理规则是正确的:
(1) the union rule:{X→Y,X→Z}╞ X→YZ
(2) the pseudo transitivity rule:
{X→Y,WY→Z}╞ XW→Z
(3) the decomposition rule:
如果X→Y且Z Y,则X→Z成立。
结 论 : 由 分 解 规 则 , 若 X→{ A1,A2,…,Ak} , 则
X→Ai ( i=1…k ) ; 由 合 并 规 则 , 若 X→Ai
( i=1…k ) , 则 X→{A1,A2,…,Ak} , 故
X→{ A1,A2,…,Ak} X→Ai(i=1…k)
Define 10.2-6 closureX+
设 X U , 则 属 性 集 X 关 于 FD 集 F 的 闭 包
X+={A|A∈U,且X→A可由Armstrong’s axioms导
出}
引理10.2-3 X→Y可由Armstrong’s axioms导出
Y X+。
定理10.2-1 Armstrong’s axioms是正确的、完备
的(complete)。
X+={A|A∈U,且X→A∈F+}或X+={A|A∈U,且F╞
X→A}
F+={X→Y|X→Y可由Armstrong’s axioms从F导出}
算法10.2-1 求X+
Input: X U,F
Output: X+
方法:按下列方法依次求X ( 0 ) ,X ( 1 ) ,……X
(i),……
(1) 初始化:X(0)=X,i=0;
(2) 求B={A|(V)( W)(V→W∈F∧V
X(i)∧A∈W)}
(3) X(i+1)=B∪X(i)
(4) X(i+1)=X(i)?
(5) 不等,i=i+1,返回(2)。
(6) 相等,X+=X(i)
例10-1 设F={AB→C,D→EG,C→A,BE→C,
BC→D , CG→BD , ACD→B , CE→AG} , 计 算
(BD)+。
解:X(0)=BD
找左部为BD的子集的函数依赖,只有D→EG
X(1)=BD∪EG=BDEG
找左部为BDEG的子集的函数依赖,有D→EG,
BE→C
X(2)= X(1)∪EGC=BCDEG
找左部为BCDEG的子集的函数依赖,有D→EG,
C→A,BE→C,BC→D,CG→BD,CE→AG
X(3)= X(2)∪ABCDEG=ABCDEG
(BD)+=U
算法10.2-1改进:
1. 若X(i)=U,则迭代结束,X+=U
2. 在每次迭代中,用过的FD可不必再选出来,
因其对结果已不再增加属性。
Define 10.2-7 FD set F、G,若F+=G+,则称FG
等价。
引理10.2-4 F+=G+ F G+,G F+
引理10.2-5 任一函数依赖集F总可以为一右部恒
为单属性的函数依赖集所覆盖。
Define 10.2-8 函数依赖集F如果满足下列条件,
则称为极小函数依赖集或最小覆盖。
(1)F中每个函数依赖的右部为单属性。
(2)F 中 不 存 在 这 样 的 函 数 依 赖 X→A , 使 得 F (X→A)与F等价。
(3)在F中也不存在这样的X→A,使得F-(X→A)
∪(Z→A)与F等价,式中Z X。
定理10.2-2 任一函数依赖集F都与一最小函数依
赖集F’等价。F’称为F的最小覆盖。
10.3 多值依赖
X→→Y
X→→U-X-Y
Define 10.3-1 设X、Y是关系模式R的属性集,如
果对于R的任何值r,都有如下性质,则称R满足
X→→Y。
如果r中存在两个元组s、t,使得
s[X]=t[X]
则r中必然存在两个元组u、v,使得
u[X]=v[X]=s[X]=t[X]
u[Y]=t[Y]且u[U-X-Y]=s[U-X-Y]
v[Y]=s[Y]且v[U-X-Y]=t[U-X-Y]
10.4 连接依赖
例10-2 设有一关系SPJ(S#,P#,J#),S#表示供
应商号,P#表示零件号,J#表示工程号。SPJ表
示供应关系,即某供应商供应某零件给某工程。
如果此关系的语义满足下列条件:
SPJ=SPJ[S#,P#] SPJ[P#,J#]
SPJ[J#,S#]
10.5 关系模式的分解及其问题
Define 10.5-1 设有一关系模式R(U),若用一关系
模式的集合{R1(U1),R2(U2),…Rk(Uk)}来取代,
k
其中,U=
Ui,则称此关系模式的集合为R的
i 1
一个分解,以ρ={Rl,R2,…,Rk}表示。
Define 10.5-2 F在属性集Ui( U)上的投影定
义为
关系模式的分解主要有两种准则:
(1) 只满足无损分解要求。
(2)
既满足无损分解要求,又满足保持依赖要求。
关 系 R(ABCD) , F = {A→B , C→D} , 则 分 解
ρ={R1(AB),R2(CD)}
算法 10.5-1 检验一个分解是否无损分解。
Input: 关系模式R(A1,A2,…,An);
R上有FD集F;
R上的分解ρ={Rl,R2,…,Rk}。
Output: ρ是否无损分解。
方法:建立n列、k行的矩阵M,其中每列对应于R
的一个属性,每行对应于ρ中的一个关系模式。
则,ρ不是无损分解。
例10-4 R(ABCDE),ρ={R1(AD),R2(AB),
R3(BE),R4(CDE),R5(AE)}是R的一个分解。
在R上有下列FD:A→C、B→C、C→D、DE→C、
CE→A。试判断ρ是否为无损分解。
例10-5 在例10-3中:
10.6 关系模式的规范化
1NF(Normal Form)
2NF
3NF
BCNF
4NF
5NF
R(S#,C#,G.,TN,D)
F={{S#,C#}→G, C#→TN, TN→D}
R分解为R1(S#,C#,G)和R2(C#,TN,D)
R2可分解为R3(C#,TN)和R4(TN,D)
算法10.6-1 NF2 1NF
横向或纵向展开。
算法10.6-2 1NF 2NF
即消除非主属性对键的PFD。
设R(K1,K2,A,B),K1+K2为键,AB为非主
属性。F={K1→A,K1K2→B}
则将R分解为R1(K1,A)和R2(K1,K2,B)
算法10.6-3 2NF 3NF
即消除非主属性对键的TFD。
设R(K,A,B,C),K为键,ABC为非主属性。
F={K→A,K→B,B→C}
则将R分解为R1(B,C)和R2(K,A,B)
可以直接从1NF3NF
例10-6 R(ABCD)F={AB→C,B→D,BC→A}
键:AB和BC,则ABC为主属性,D为非主属性,
D部分FD于键,分解为:
R1(BD)和R2(ABC)
例10-7 R(CTHRSG),C-课程,T-教师,H-时
间,R-教室,S-学生,G-成绩。F={C→T,HR→C,
HT→R,CS→G,HS→R}
键:HS,HS为主属性,CTRG为非主属性。
HS→R(已知),HS→H(平凡FD)HS→HR(合
并规则),HR→C(已知),HS→C(传递律)
C→T(已知),HS→T(传递律)
HS→R(已知)
HS→S(平凡FD)HS→C(已求出)HS→CS(合
并规则)CS→G(已知),HS→G(传递律)
处 理 HS→G ( TFD ) 得 R1 ( CSG ) 原 R 变 为 R
(CTHRS)
处 理 HS→T ( TFD ) 得 R2 ( CT ) 原 R 变 为 R
(CHRS)
处 理 HS→C ( TFD ) 得 R3 ( HRC ) 原 R 变 为 R4
(HRS)
即R分解为:
R1(CSG):学生的各门课程的成绩
R2(CT):每门课程的教师
R3 (HRC):每门课的上课时间和在每个时间的
上课教室
R4(HRS):学生在每个时间的上课教室。
第十一章 数据库设计
11.1 Introduction
数据库设计的基本任务是:根据—个单位的信息
需求,处理需求和数据库的支撑环境(包括DBMS,
操作系统和硬件),设计出数据模式(包括外模式,
逻辑(概念)模式和内模式)以及典型的应用程序。
信息需求——静态要求
处理需求——动态要求
数据库设计方法:
1. Data-oriented approach
2. Process-oriented approach
数据库设计特征:
1. Iterative
2. Tentative
3. Multistage
数据库设计步
骤:
1. 需求分析
2. 概念设计
3. 逻辑设计
4. 物理设计
11.2 需求分析
11.2.1 需求分析的任务
需求分析的任务是通过详细调查现实世界要处理
的对象(组织、部门、企业等),充分了解原系统
(手工系统或计算机系统)工作概况,明确用户的各
种需求,然后在此基础上确定新系统的功能。新
系统必须充分考虑今后可能的扩充和改变,不能
仅仅按当前应用需求来设计数据库。
11.2.2 需求分析的方法
调查与初步分析用户的需求通常需要四步:
①首先调查组织机构情况。包括了解该组织的部
门组成情况,各部门的职责等,为分析信息流程
作准备。
②然后调查各部门的业务活动情况。包括了解各
个部门输入和使用什么数据,如何加工处理这些
数据,输出什么信息,输出到什么部门、输出结
果的格式是什么。这是调查的重点。
③在熟悉了业务活动的基础上,协助用户明确对
新系统的各种要求,包括信息要求、处理要求、
完全性与完整性要求,这是调查的又一个重点。
④最后对前面调查的结果进行初步分析,确定新
系统的边界,确定哪些功能由计算机完成或将来
准备让计算机完成,哪些活动由人工完成。由计
算机完成的功能就是新系统应该实现的功能。
常用的调查方法有以下几种:
①跟班作业。通过亲身参加业务工作来了解业务
活动的情况。这种方法可以比较准确地理解用户
的需求,但比较耗费时间。
②开调查会。通过与用户座谈来了解业务活动情
况及用户需求以相互启发。
③请专人介绍。
④询问。对某些调查中的问题,可以找专人询问。
⑤设计调查表请用户填写。如果调查表设计得合
理,这种方法很有效,也易于为用户接受。
⑥查阅记录。即查阅与原系统有关的数据记录。
图11-2 需求分析的策略
图11-3 系统高层抽象图
图11-4 需求分析的过程
实例:假设要开发一个学校管理系统。经过可行
性分析和初步需求调查,抽象出该系统最高层数
据流图,如图所示。该系统由教师管理子系统、
学生管理子系统、后勤管理子系统组成.每个子
系统分别配备一个开发小组。
其中学生管理子系统开发小组通过做进一步的需
求调查,明确了该子系统的主要功能是进行学籍
管理和课程管理,包括学生报到、入学、毕业的
管理,学生上课情况的管理。通过详细的信息流
程分析和数据收集后,他们生成了该子系统的数
据流图,如图所示。
图11-5 学校管理系统最高层数据流图
图11-6 学籍管理的数据流图
图11-7 课程管理和数据流图
11.2.3 数据字典
数据字典通常包括数据项、数据结构、数据流、
数据存储和处理过程5个部分。
1.数据项
数据项是不可再分的数据单位。对数据项的描述
通常包括以下内容
数据项描述={数据项名,数据项含义说明.别名,
数据类型,长度,取值范围,取值含义,与其他
数据项的逻辑关系}
2.数据结构
数据结构描述={数据结构名,含义说明,组成:
{数据项或数据结构}}
3.数据流
数据流描述={数据流名,说明,数据流来源,数
据流去向,组成:{数据结构},平均流量,高峰期
流量}
4.数据存储
数据存储描述={数据存储名,说明,编号,流入
的数据流,流出的数据流组成:{数据结构},数据
量,存取方式}
5.处理过程
处理过程描述={处理过程名,说明,输入:{数据
流},输出:{数据流},处理:{简要说明}}
以上述学生学籍管理子系统为例,简要说明如何
定义数据字典。
该子系统涉及很多数据项,其中“学号”数据项
可以描述如下:
数据项:学号
含义说明:唯一标识每个学生
别名:学生编号
类型:字符型
长度: 8
取值范围;00000000至99999999
取值含义:前2位标别该学生所在年级,后6位按
顺序编号
与其他数据项的逻辑关系:……
“学生”是该系统中的一个核心数据结构,它可以
描述如下:
数据结构:学生
含义说明:是学籍管理子系统的主体数据结构,
定义了一个学生的有关信息
组成:学号,姓名,性别,年龄,所在系,年级
数据流“体检结果”可描述如下:
数据流:体检结果
说明:学生参加体格检查的最终结果
数据流来源:体检
数据流去向:批准
组成:……
平均流量:……
高峰期流量:……
数据存储“学生登记表”可描述如下:
数据存储:学生登记表
说明:记录学生的基本情况
流入数据流:……
流出数据流:……
组成:
数据量:每年3000张
存取方式:随机存取
处理过程“分配宿舍”可描述如下:
处理过程:分配宿舍
说明;为所有新生分配学生宿舍
输入:学生,宿舍
输出:宿舍安排
处理:在新生报到后,为所有新生分配学生宿舍。
要求同一间宿舍只能安排同一性别的学生,同一
个学生只能安排在一个宿舍中。每个学生的居住
面积不小于3平方米。安排新生宿舍其处理时间
应不超过15分钟。
11.3 数据库的概念设计
11.3.1 数据库概念设计的基本方法
1. Centralized schema design approach
2. View integration approach
11.3.2 视图设计
1. 自顶向下
2. 自底向上
3. 由内向外
11.3.3 视图集成
1. 确认视图中的对应和冲突
(1)
命名冲突
(2)
概念冲突
(3)
域冲突
(4)
约束冲突
2. 对视图进行某些修改,解决部分冲突
3. 合并视图,形成全局模式
11.4 数据库的逻辑设计
11.4.1 E-R图到关系模式的转换
1 命名和属性域的处理
2 非原子属性的处理
3 弱实体的处理
4 联系的转换
(1)
1:1联系
若E1全参与:
R1(k,a,h,s)
R2(h,b)
若E1、E2均部分参与:
R1(k,a)
R2(h,b)
R3(k,h,s)
(2) 1:N联系
若E2全参与:
R1(k,a)
R2(h,b,k,s)
若E2部分参与:
R1(k,a)
R2(h,b)
R3(h,k,s)
(3) M:N联系
R1(k,a)
R2(h,b)
R3(k,h,s)
(4) 多元联
系
R1(k,a)
R2(h,b)
R3(j,c)
R4(k,h,j,s)
5 普遍化/特殊化层次的转换
6 范畴的转换
11.4.2 逻辑模式的规范化、调整和实现
1) 规范化,
2) 适应DBMS限制条件的修改,
3) 满足性能、存储空问等要求的调整,
4) 用DBMS所提供的DDL实现逻辑模式
1. 改善数据库性能的调整
(1) 减少连接运算
(2) 减小关系的大小和数据量
(3) 尽可能使用snapshot
2. 节省存储空间的调整
(1) 节省每个属性所占的空间
(2) 采用dummy attribute减少重复数据所占存储空
间
11.4.3 外模式的设计
11.5 数据库的物理设计
11.5.1 簇集设计
11.5.2 索引的选择
凡是满足下列条件之一的属性或表,不宜建立索
引:
①不出现或很少出现在查询条件中的属性。
②属性值很少的属性。例如属性“性别”只有两
个值,若在其上建立索引,每个属性值对应一半
的元组;用索引检索,还不如顺序扫描。
③属性值分布严重不均的属性。例如学生的年龄
往往集中在几个属性值上,若在年龄属性上建立
索引,则在检索某个年龄的学生时,会涉及到相
当多的学生,用索引查询,还不如顺序扫描。
④经常更新的属性或表。因为更新时索引需要维
护。
⑤过长的属性,例如超过30个字节。因为在过长
的属性上建立索引,索引所占的存储空间较大,
而且索引级数也随之增加,有诸多不利之处。如
果实在需要在其上建立索引,必须采取索引键压
缩措施。
⑥太小的表,例如小于六个物理块的表。因为采
用顺序扫描最多也不过六次I/O,不值得采用索
引。
凡符合下列条件之一,可考虑在有关属性上建立
索引,下面所指的查询都是常用的或重要的查询:
①主键和外键上一般都建有索引
l 有利于主键唯一性检查
l 有助于引用完整性约束检查
l 可以加速以主键和外键为连接属性的连接
操作
②对于以读为主或只读的表,只要需要,且存储
空间允许,可以多建索引。
③对于等值查询(即查询条件以等号为比较符),如
果满足条件的元组是少量的,例如小于5%,可以
考虑在有关属性上建立索引。
④对于范围查询(即查询条件以<、>、≤、
≥等为比较符),最好在有关的属性上建立
簇集索引。如果已在其它属性上建立族集索
引,且满足条件的元组数一般低于20%,可
以考虑在有关属性上建立非簇集索引。
⑤有些查询可以从索引直接得到结果,不必
访问数据块。对于这种查询,在有关属性上
建立索引是有利的。
11.5.3 分区设计
11.6 分布式数据库的设计
11.6.1 数据的分割设计
11.6.2 数据的分布设计