数据库系统概论
An Introduction to Database System
教材及参考书
教材
萨师煊,王珊,数据库系统概论 (第三版 ),
高等教育出版社,2000 中国人民大学教材及参考书 (2)
参考书
施伯乐,丁宝康,数据库系统教程,高教出版社,2003
学习方式
听课
(启发式、讨论式)
读书
(预习、复习)
评分标准:
平时表现 5%平时测试 15%个人研究报告 8%集体项目
12%期末考试 60%
研究报告(第 15周交)
题目自拟,与数据库有关,偏重理论而不是具体软件的操作。题目于五一节前定好。
包括以下要点:
1)从问题入手,该技术是解决什么问题
2)该技术的发展历史
3)该技术的要点是什么,如何一步一步做的
4)该技术的发展方向
5)个人对该技术的看法,比如新思想,建议算法的改变等等。
6)索引,reference,必须要有并且标记在文中。
7)准备 10分钟的 ppt文件。以便抽查演讲。
集体项目:
提供用 access或者 mysql为数据库,编程选用 c++,java,php,visual basic,
若用其他语言或数据库,请准备好演示环境。
5- 8人一组。自由分组。第六周组好
题目将于第七周公布。
上交时,软件,项目说明书,以及 20分钟
ppt。
内容安排 (1)
基础篇
第一章:绪论
第二章:关系数据库
第三章:关系数据库标准语言 SQL
第四章:关系系统及其查询优化
第五章:关系数据理论
设计篇
第六章:数据库设计内容安排 (2)
系统篇
第七章:数据库恢复技术
第八章:并发控制
第九章:数据库安全性
第十章:数据库完整性数据库系统概论
An Introduction to Database System
第一章 绪论第一章 绪论
1.1 数据库系统概述
1.2 数据模型
1.3 数据库系统结构
1.4 数据库系统的组成
1.5 数据库技术的研究领域
1.6 小结
1.1 数据库系统概述
1.1.1 数据库的地位
1.1.2 四个基本概念
1.1.3 数据管理技术的产生与发展数据库的地位
数据库技术产生于六十年代末,是数据管理的最新技术,是计算机科学的重要分支
数据库技术是信息系统的核心和基础,它的出现极大地促进了计算机应用向各行各业的渗透
数据库的建设规模、数据库信息量的大小和使用频度已成为衡量一个国家信息化程度的重要标志
1.1 数据库系统概述
1.1.1 数据库的地位
1.1.2 四个基本概念
1.1.3 数据管理技术的产生与发展
1.1.2 四个基本概念
数据 (Data)
数据库 (Database)
数据库管理系统 (DBMS)
数据库系统 (DBS)
一、数据
数据 (Data)是数据库中存储的基本对象
数据的定义
描述事物的符号记录
数据的种类
文字、图形、图象、声音
数据的特点
数据与其语义是不可分的数据举例
学生档案中的学生记录
(李明,男,1972,江苏,计算机系,1990)
数据的形式不能完全表达其内容
数据的解释
语义:学生姓名、性别、出生年月、籍贯、所在系别、入学时间
解释:李明是个大学生,1972年出生,江苏人,
1990年考入计算机系
请给出另一个解释和语义二、数据库(举例)
学生登记表学 号 姓 名 年 令 性 别 系 名 年 级
95004 王小明 19 女 社会学 95
95006 黄大鹏 20 男 商品学 95
95008 张文斌 18 女 法律学 95
… … … … … …
二、数据库 (续 )
人们收集并抽取出一个应用所需要的大量数据之后,应将其保存起来以供进一步加工处理,进一步抽取有用信息
数据库的定义
数据库 (Database,简称 DB)是 长期 储存在计算机内,有 组织 的,可 共享 的 大量 数据集合二、数据库 (续 )
数据库的特征
数据按一定的数据模型组织,描述和储存
可为各种用户共享
冗余度较小
数据独立性较高
易扩展三、数据库管理系统
什么是 DBMS
数据库管理系统 ( Database
Management System,简称 DBMS) 是位于用户与操作系统之间的一层数据管理软件 。
DBMS的用途
科学地组织和存储数据,高效地获取和维护数据
DBMS的主要功能
数据定义功能提供数据定义语言 (DDL)
定义数据库中的数据对象
数据操纵功能,提供数据操纵语言 (DML)
操纵数据实现对数据库的基本操作
(查询,插入,删除和修改 )
DBMS的主要功能
数据库的运行管理保证数据的安全性,完整性,
多用户对数据的并发使用发生故障后的系统恢复
数据库的建立和维护功能 (实用程序 )
数据库数据批量装载数据库转储介质故障恢复数据库的重组织性能监视等四、数据库系统
什么是数据库系统
数据库系统 ( Database System,简称 DBS) 是指在计算机系统中引入数据库后的系统构成 。
在不引起混淆的情况下常常把数据库系统简称为数据库 。
数据库系统的构成
由数据库,数据库管理系统 ( 及其开发工具 ),应用系统,数据库管理员 ( 和用户 ) 构成 。
数据库系统 (续 )
数据库系统构成图示
参看教材 page_5 图 1.1
数据库系统在计算机系统中的位置图示
参看教材 page_ 5 图 1.2
1.1 数据库系统概述
1.1.1 数据库的地位
1.1.2 四个基本概念
1.1.3 数据管理技术的产生与发展
1.1.3 数据管理技术的产生和发展
什么是数据管理
对数据进行分类,组织,编码,存储,检索和维护,是数据处理的中心问题
数据管理技术的发展过程
人工管理阶段 (40年代中 --50年代中 )
文件系统阶段 (50年代末 --60年代中 )
数据库系统阶段 (60年代末 --现在 )
数据管理技术的产生和发展 (续 )
数据管理技术的发展动力
应用需求的推动
计算机硬件的发展
计算机软件的发展一、人工管理
时期
40年代中 --50年代中
产生的背景
应用需求 科学计算
硬件水平 无直接存取存储设备
软件水平 没有操作系统
处理方式 批处理人工管理 (续 )
特点
数据的管理者:应用程序,数据不保存 。
数据面向的对象:某一应用程序
数据的共享程度:无共享、冗余度极大
数据的独立性:不独立,完全依赖于程序
数据的结构化:无结构
数据控制能力:应用程序自己控制应用程序与数据的对应关系 (人工管理 )
应用程序1 数据集1
应用程序2 数据集2
应用程序n 数据集 n
...…,..…
二、文件系统
时期
50年代末 --60年代中
产生的背景
应用需求 科学计算、管理
硬件水平 磁盘、磁鼓
软件水平 有文件系统
处理方式 联机实时处理、批处理文件系统 (续 )
特点数据的管理者:文件系统,数据可长期保存数据面向的对象:某一应用程序数据的共享程度:共享性差、冗余度大数据的结构化:记录内有结构,整体无结构数据的独立性:独立性差,数据的逻辑结构改变必须修改应用程序数据控制能力:应用程序自己控制应用程序与数据的对应关系 (文件系统 )
应用程序1 文件1
应用程序2 文件 2
应用程序n 文件 n
存取方法
...…,..…
文件系统中数据的结构
记录内有结构。
数据的结构是靠程序定义和解释的。
数据只能是定长的。
可以间接实现数据变长要求,但访问相应数据的应用程序复杂了。
文件间是独立的,因此数据整体无结构。
可以间接实现数据整体的有结构,但必须在应用程序中对描述数据间的联系 。
数据的最小存取单位是记录。
三、数据库系统
时期
60年代末以来
产生的背景
应用背景 大规模管理
硬件背景 大容量磁盘
软件背景 有数据库管理系统
处理方式 联机实时处理,分布处理,批处理
数据管理技术进入数据库阶段的标志是 20世纪 60
年代末的三件大事:
① 1968年美国 IBM公司推出层次模型的 IMS系统 。
② 1969年美国 CODASYL组织发布了 DBTG报告,总结了当时各式各样的数据库,提出网状模型。
③ 1970年美国 IBM公司的 E.F.Codd 连续发表论文,
提出关系模型,奠定了关系数据库的理论基础。
数据库系统 (续 )
特点
数据的管理者,DBMS
数据面向的对象:现实世界
数据的共享程度:共享性高
数据的独立性:高度的物理独立性和一定的逻辑独立性
数据的结构化:整体结构化
数据控制能力:由 DBMS统一管理和控制应用程序与数据的对应关系 (数据库系统 )
DBMS
应用程序 1
应用程序 2
数据库
…
数据的高共享性的好处
降低数据的冗余度,节省存储空间
避免数据间的不一致性
使系统易于扩充数据独立性
物理独立性
指用户的应用程序与存储在磁盘上的数据库中数据是相互独立的。当数据的物理存储改变了,应用程序不用改变 。
逻辑独立性
指用户的应用程序与数据库的逻辑结构是相互独立的 。 数据的逻辑结构改变了,用户程序也可以不变 。
数据结构化
整体 数据的结构化是数据库的主要特征之一。
数据库中实现的是数据的真正结构化
数据的结构用 数据模型 描述,无需程序定义和解释。
数据可以 变长 。
数据的最小存取单位是 数据项 。
DBMS对数据的控制功能
数据的安全性 ( Security) 保护
使每个用户只能按指定方式使用和处理指定数据,保护数据以防止不合法的使用造成的数据的泄密和破坏 。
数据的完整性 ( Integrity) 检查
将数据控制在有效的范围内,或保证数据之间满足一定的关系 。
DBMS对数据的控制功能
并发 ( Concurrency) 控制
对多用户的并发操作加以控制和协调,防止相互干扰而得到错误的结果 。
数据库恢复 ( Recovery)
将数据库从错误状态恢复到某一已知的正确状态 。
程序和数据间的联系
文件系统阶段信息处理的传统方式应用程序 n
应用程序 1
.
.
.
数据库管理系统 D BMS 数据库输入 程序 输出要求报表查询处理程序 报表生成程序数据库应用程序 应用程序输入输出输入输出联机终端数据库阶段信息处理方式的演变第一章 绪论
1.1 数据库系统概述
1.2 数据模型
1.3 数据库系统结构
1.4 数据库系统的组成
1.5 数据库技术的研究领域
1.6 小结数据模型
在数据库中用数据模型这个工具来 抽象、表示和处理 现实世界中的数据和信息。通俗地讲数据模型就是现实世界的模拟
数据模型应满足三方面要求
能比较 真实 地模拟现实世界
容 易 为人所 理解
便于在计算机上 实现数据模型 (续 )
数据模型分成两个不同的层次
(1) 概念模型 也称信息模型,它是按用户的观点来对数据和信息建模。
(2) 数据模型 主要包括网状模型、层次模型、关系模型等,它是按计算机系统的观点对数据建模 。
数据模型 (续 )
客观对象的抽象过程 ---两步抽象
现实世界中的客观对象抽象为概念模型;
把概念模型转换为某一 DBMS支持的数据模型 。
概念模型是现实世界到机器世界的一个中间层次 。
1.2 数据模型
1.2.1 数据模型的组成要素
1.2.2 概念模型
1.2.3 常用逻辑数据模型
1.2.4 层次模型
1.2.5 网状模型
1.2.6 关系模型
1.2.1 数据模型的组成要素
数据结构
数据操作
数据的约束条件
1,数据结构
什么是数据结构
对象类型的集合
两类对象
与数据类型,内容,性质有关的对象
与数据之间联系有关的对象
数据结构是对系统静态特性的描述
2.数据操作
数据操作
对数据库中各种对象 ( 型 ) 的实例 ( 值 ) 允许执行的 操作 及有关的 操作规则
数据操作的类型
检索
更新 ( 包括插入,删除,修改 )
数据操作 (续 )
数据模型对操作的定义
操作的确切含义
操作符号
操作规则 ( 如优先级 )
实现操作的语言
数据操作是对系统动态特性的描述 。
3.数据的约束条件
数据的约束条件
一组完整性规则的集合。
完整性规则是给定的数据模型中数据及其联系所具有的制约和储存规则,用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效、相容 。
数据的约束条件 (续 )
数据模型对约束条件的定义
反映和规定本 数据模型 必须遵守的基本的通用的完整性约束条件。例如在关系模型中,任何关系必须满足实体完整性和参照完整性两个条件。
提供定义完整性约束条件的机制,以反映 具体应用所涉及的数据必须遵守的特定的语义约束条件 。
1.2.2 概念模型
1,概念模型
2,信息世界中的基本概念
3,概念模型的表示方法
1,概念模型
概念模型的用途
概念模型用于信息世界的建模
是现实世界到机器世界的一个中间层次
是数据库设计的有力工具
数据库设计人员和用户之间进行交流的语言
对概念模型的基本要求
较强的语义表达能力,能够方便,直接地表达应用中的各种语义知识
简单,清晰,易于用户理解 。
2,信息世界中的基本概念
(1) 实体 ( Entity)
客观存在并可相互区别的事物称为实体 。
可以是具体的人,事,物或抽象的概念 。
(2) 属性 ( Attribute)
实体所具有的某一特性称为属性 。
一个实体可以由若干个属性来刻画 。
(3) 码 ( Key)
唯一标识实体的属性集称为码 。
信息世界中的基本概念 (续 )
(4) 域 ( Domain)
属性的取值范围称为该属性的域 。
(5) 实体型 ( Entity Type)
用实体名及其属性名集合来抽象和刻画同类实体称为实体型
(6) 实体集 ( Entity Set)
同型实体的集合称为实体集信息世界中的基本概念 (续 )
(7) 联系 ( Relationship)
现实世界中事物内部以及事物之间的联系在信息世界中反映为实体内部的联系和实体之间的联系实体型间联系两个实体型 一对一联系 ( 1:1)
三个实体型 一对多联系 ( 1:n)
一个实体型 多对多联系 ( m:n)
两个实体型间的联系实体型 1
联系名实体型 2
1
1
1:1联系实体型 1
联系名实体型 2
m
n
m:n联系实体型 1
联系名实体型 2
1
n
1:n联系数据联系的描述图 1,一对一联系图 1.9 一对多联系图 1.10 多对多联系两个实体型间的联系
一对一联系
如果对于实体集 A中的每一个实体,实体集 B中至多有一个实体与之联系,反之亦然,则称实体集 A
与实体集 B具有一对一联系 。 记为 1:1。
实例班级与班长之间的联系:
一个班级只有一个正班长一个班长只在一个班中任职两个实体型间的联系 (续 )
一对多联系
如果对于实体集 A中的每一个实体,实体集 B中有 n个实体 ( n≥0) 与之联系,反之,对于实体集 B中的每一个实体,实体集 A中至多只有一个实体与之联系,则称 实体集 A与实体集 B有一对多联系记为 1:n
实例班级与学生之间的联系:
一个班级中有若干名学生,
每个学生只在一个班级中学习两个实体型间的联系 (续 )
多对多联系 ( m:n)
如果对于实体集 A中的每一个实体,实体集 B中有 n个实体 ( n≥0) 与之联系,反之,对于实体集 B中的每一个实体,实体集 A中也有 m个实体
( m≥0) 与之联系,则称实体集 A与实体 B具有多对多联系 。 记为 m:n
实例课程与学生之间的联系:
一门课程同时有若干个学生选修一个学生可以同时选修多门课程多个实体型间的联系 (续 )
多个实体型间的一对多联系
若实体集 E1,E2,...,En存在联系,对于实体集 Ej( j=1,2,...,i-1,i+1,...,n)
中的给定实体,最多只和 Ei中的一个实体相联系,则我们说 Ei与 E1,E2,...,Ei-1,
Ei+1,...,En之间的联系是一对多的。
多个实体型间的联系 (续 )
实例课程、教师与参考书三个实体型如果一门课程可以有若干个教师讲授,使用若干本参考书,每一个教师只讲授一门课程,每一本参考书只供一门课程使用课程与教师、参考书之间的联系是一对多的
多个实体型间的一对一联系
多个实体型间的多对多联系同一实体集内各实体间的联系
一对多联系
实例职工实体集内部具有领导与被领导的联系某一职工(干部),领导,若干名职工一个职工仅被另外一个职工直接领导这是一对多的联系
一对一联系
多对多联系三元联系 一元联系
3,概念模型的表示方法
概念模型的表示方法很多
实体-联系方法 (E-R方法 )
用 E-R图来描述现实世界的概念模型
E-R方法也称为 E-R模型
E-R图
实体型
用矩形表示,矩形框内写明实体名。
学生 教师
E-R图 (续 )
属性
用椭圆形表示,并用无向边将其与相应的实体连接起来学生学号 年龄性别姓名
E-R图 (续 )
联系
联系本身,用菱形表示,菱形框内写明联系名,
并用无向边分别与有关实体连接起来,同时在无向边旁标上联系的类型( 1:1,1:n或 m:n)
联系的属性,联系本身也是一种实体型,也可以有属性。如果一个联系具有属性,则这些属性也要用无向边与该联系连接起来联系的表示方法实体型 1
联系名实体型 2
1
1
1:1联系实体型 1
联系名实体型 2
m
n
m:n联系实体型 1
联系名实体型 2
1
n
1:n联系联系的表示方法 (续 )
实体型 1
联系名
m n
同一实体型内部的 m:n联系实体型 1
联系名实体型 2
1
m
多个实体型间的 1:n联系实体型 3
n
联系的表示方法示例班级班级 -班长班长
1
1
1:1联系课程选修学生
m
n
m:n联系班级组成学生
1
n
1:n联系联系的表示方法示例 (续 )
职工领导
1 n
同一实体型内部的 1:n联系课程讲授教师
1
m
多个实体型间的 1:n联系参考书
n
联系属性的表示方法课程选修学生
m
n
成绩实体联系模型(实例)
为仓库管理设计一个 ER模型。仓库主要管理零件的采购和供应等事项。仓库根据需要向外面供应商订购零件,而许多工程项目需要仓库提供零件。
首先确定实体类型。本问题有三个实体类型:零件 PART,工程项目 PROJECT,零件供应商
SUPPLIER。
确定联系类型。 PROJECT和 PART之间是 M:N
联系,PART和 SUPPLIER之间也是 M:N联系,
分别命名为 P_P和 P_S.
把实体类型和联系类型组合成 ER图。
确定实体类型和联系类型的属性。
确定实体类型的键,在 ER图中属于码的属性名下画一条横线。
J #
P ROJ ECT
P _ P
JN A M E
DA T E
P #
P NA M E
COL OR
W EI G H T S #
S NA M E
S A DD R
T OT AL QU A NT I T Y
P _ S
P A R T P ROJ ECT
M M NN
图 1.14 ER图实例
1.2.3 常用数据模型
非关系模型
层次模型( Hierarchical Model)
网状模型 (Network Model )
数据结构:以基本层次联系为基本单位基本层次联系:两个记录以及它们之间的一对多
( 包括一对一 )的联系常用数据模型 (续 )
关系模型 (Relational Model)
数据结构:表
面向对象模型 (Object Oriented Model)
数据结构:对象
1.2 数据模型
1.2.1 数据模型的组成要素
1.2.2 概念模型
1.2.3 常用数据模型
1.2.4 层次模型
1.2.5 网状模型
1.2.6 关系模型
1.2.4 层次模型
1,层次数据模型的数据结构
2,层次数据模型的数据操纵
3,层次数据模型的与完整性约束
4,层次数据模型的存储结构
5,层次数据模型的优缺点
6,典型的层次数据库系统
1,层次数据模型的数据结构
层次模型满足下面两个条件的基本层次联系的集合为层次模型 。
1,有且只有一个结点没有双亲结点,这个结点称为根结点
2,根以外的其它结点有且只有一个双亲结点
层次模型中的几个术语
根结点,双亲结点,兄弟结点,叶结点层次数据模型的数据结构 (续)
R 1 根结点
R 2 兄弟结点 R 3
叶结点
R 4 兄弟结点 R 5
叶结点 叶结点层次数据模型的数据结构 (续)
表示方法实体型,用记录类型描述 。
每个结点表示一个记录类型 。
属性,用字段描述 。 每个记录类型可包含若干个字段 。
联系,用结点之间的连线表示记录 ( 类 ) 型之间的一对多的联系实例,教员 -学生数据模型( P23)
层次数据模型的数据结构 (续)
特点
结点的双亲是唯一的
只能直接处理一对多的实体联系
每个记录类型定义一个排序字段,也称为码字段
任何记录值只有按其路径查看时,才能显出它的全部意义
没有一个子女记录值能够脱离双亲记录值而独立存在层次数据模型的数据结构 (续)
多对多联系在层次模型中的表示
用层次模型 间接 表示多对多联系
方法将多对多联系 分解 成一对多联系
分解方法
冗余结点法
虚拟结点法
2,层次模型的数据操纵
查询
插入
删除
更新
3,层次模型的完整性约束
无相应的双亲结点值就不能插入子女结点值
如果删除双亲结点值,则相应的子女结点值也被同时删除
更新操作时,应更新所有相应记录,以保证数据的一致性
4.层次数据模型的存储结构
邻接法按照层次树前序遍历的顺序把所有记录值依次邻接存放,即通过物理空间的位置相邻来实现层次顺序
链接法用指引元来反映数据之间的层次联系
子女-兄弟链接法 P26
层次序列链接法 P26
5,层次模型的优缺点
优点
层次数据模型简单,对具有一对多的层次关系的部门描述自然,直观,容易理解
性能优于关系模型,不低于网状模型
层次数据模型提供了良好的完整性支持
缺点
多对多联系表示不自然
对插入和删除操作的限制多
查询子女结点必须通过双亲结点
层次命令趋于程序化
6,典型的层次数据库系统
IMS数据库管理系统
第一个大型商用 DBMS
1968年推出
IBM公司研制第一章 绪论
1.1 数据库系统概述
1.2 数据模型
1.3 数据库系统结构
1.4 数据库系统的组成
1.5 数据库技术的研究领域
1.6 小结
1.2 数据模型
1.2.1 概念模型
1.2.2 数据模型的组成要素
1.2.3 最常用的数据模型
1.2.4 层次模型
1.2.5 网状模型
1.2.6 关系模型
1.2.5 网状模型
1,网状数据模型的数据结构
2,网状数据模型的数据操纵
3,网状数据模型的完整性约束
4,网状数据模型的存储结构
5,网状数据模型的优缺点
6,典型的网状数据库系统
1.网状数据模型的数据结构
网状模型满足下面两个条件的基本层次联系的集合为网状模型 。
1,允许一个以上的结点无双亲;
2,一个结点可以有多于一个的双亲 。
网状数据模型的数据结构
R 1 R 2
R3
L1 L2
R1 R2
L3
L1 L2 R3
L4
R4 R5
网状数据模型的数据结构 (续)
表示方法 ( 与层次数据模型相同 )
实体型,用记录类型描述 。
每个结点表示一个记录类型 。
属性,用字段描述 。
每个记录类型可包含若干个字段 。
联系,用结点之间的连线表示记录 ( 类 ) 型之间的 一对多的父子联系 。
网状数据模型的数据结构 (续)
特点
只能直接处理一对多的实体联系
每个记录类型定义一个排序字段,也称为码字段
任何记录值只有按其路径查看时,才能显出它的全部意义网状数据模型的数据结构 (续)
网状模型与层次模型的区别
网状模型允许多个结点没有双亲结点
网状模型允许结点有多个双亲结点
网状模型允许两个结点之间有多种联系(复合联系)
网状模型可以更直接地去描述现实世界
层次模型实际上是网状模型的一个特例网状数据模型的数据结构 (续)
R 1 R 2
R3
L1 L2
R1 R2
L3
L1 L2 R3
L4
R4 R5
网状数据模型的数据结构 (续)
R 1
L1 L2
R2
网状数据模型的数据结构 (续)
学生宿舍学生 教研室系教师网状数据模型的数据结构 (续)
父母人子女树种植砍伐养育赡养网状数据模型的数据结构 (续)
多对多联系在网状模型中的表示
用网状模型 间接 表示多对多联系
方法将多对多联系 直接 分解成一对多联系
2,网状模型的数据操纵
查询
插入
删除
更新
3.网状数据模型的完整性约束网状数据库系统(如 DBTG)对数据操纵加了一些限制,提供了一定的完整性约束
码
双亲结点与子女结点之间是一对多联系
属籍类别
加入类别 (自动的,手工的 )
移出类别 (固定的,必须 的,随意的 )
3,网状数据模型的完整性约束
完整性约束条件
允许插入尚未确定双亲结点值的子女结点值
允许只删除双亲结点值
4.网状数据模型的存储结构
关键
实现记录之间的联系
常用方法
单向链接
双向链接
环状链接
向首链接例,P29
5.网状模型的优缺点
优点
能够更为直接地描述现实世界,如一个结点可以有多个双亲
具有良好的性能,存取效率较高
缺点
结构比较复杂,而且随着应用环境的扩大,数据库的结构就变得越来越复杂,不利于最终用户掌握
DDL,DML语言复杂,用户不容易使用
6,典型的网状数据库系统
DBTG系统,亦称 CODASYL系统
由 DBTG提出的一个系统方案
奠定了数据库系统的基本概念,方法和技术
70年代推出
实际系统
Cullinet Software Inc.公司的 IDMS
Univac公司的 DMS1100
Honeywell公司的 IDS/2
HP公司的 IMAGE
1.2 数据模型
1.2.1 概念模型
1.2.2 数据模型的组成要素
1.2.3 最常用的数据模型
1.2.4 层次模型
1.2.5 网状模型
1.2.6 关系模型
1.2.6 关系模型
1,关系数据模型的数据结构
2,关系数据模型的操纵
3,关系数据模型的完整性约束
4,关系数据模型的存储结构
5,关系数据模型的优缺点
6,典型的关系数据库系统关系模型
最重要的一种数据模型 。 也是目前主要采用的数据模型
1970年由美国 IBM公司 San Jose研究室的研究员 E.F.Codd提出
本课程的重点关系数据模型的数据结构
在 用户观点 下,关系模型中数据的逻辑结构是一张二维表,它由行和列组成 。
学生登记表学 号 姓 名 年 令 性 别 系 名 年 级
95004 王小明 19 女 社会学 95
95006 黄大鹏 20 男 商品学 95
95008 张文斌 18 女 法律学 95
… … … … … …
关系模型的基本概念
关系 ( Relation)
一个关系对应通常说的一张表 。
元组 ( Tuple)
表中的一行即为一个元组 。
属性 ( Attribute)
表中的一列即为一个属性,给每一个属性起一个名称即属性名 。
关系模型的基本概念
主码 ( Key)
表中的某个属性组,它可以唯一确定一个元组 。
域 ( Domain)
属性的取值范围 。
分量元组中的一个属性值 。
关系模式对关系的描述关系名(属性 1,属性 2,…,属性 n)
学生(学号,姓名,年龄,性别,系,年级)
关系数据模型的数据结构 (续)
实体及实体间的联系的表示方法
实体型,直接用关系(表)表示。
属性,用属性名表示。
一对一联系,隐含在实体对应的关系中。
一对多联系,隐含在实体对应的关系中。
多对多联系,直接用关系表示 。
关系数据模型的数据结构 (续)
例 1
学生,系,系与学生之间的一对多联系:
学生 ( 学号,姓名,年龄,性别,系号,年级 )
系 (系号,系名,办公地点 )
例 2
系,系主任,系与系主任间的一对一联系关系数据模型的数据结构 (续)
例 3
学生,课程,学生与课程之间的多对多联系:
学生 ( 学号,姓名,年龄,性别,系号,年级 )
课程 ( 课程号,课程名,学分 )
选修 ( 学号,课程号,成绩 )
关系数据模型的数据结构 (续)
关系必须是规范化的,满足一定的规范条件最基本的规范条件:关系的每一个分量必须是一个不可分的数据项 。
工 资 扣 除职 工号姓名职称 基 本 工 龄 职 务 房 租 水 电实发
86051 陈 平 讲 师 105 9,5 15 6 12 115,5
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2.关系模型的数据操纵
查询,插入,删除,更新
数据操作是集合操作,操作对象和操作结果都是关系,即若干元组的集合
存取路径对用户隐蔽,用户只要指出
,干什么,,不必详细说明,怎么干,
3.关系模型的完整性约束
实体完整性
参照完整性
用户定义的完整性
4.关系数据模型的存储结构
表以文件形式存储
有的 DBMS一个表对应一个操作系统文件
有的 DBMS自己设计文件结构图 关系模型的例子
PART模式 ( P#,PNAME,COLOR,WEIGHT)
PROJECT模式 ( J#,JNAME,DATE)
SUPPLIER模式 ( S#,SNAME,SADDR)
P_P模式 ( J#,P#,TOTAL)
P_S模式 ( P#,S#,QUANTITY)
100S2P4BEIJINGFADCS2
300S2P3SHANGHAIPICCS1
150S1P2SADDRSNAMES#
200S2P2SUPPLIER关系
100S1P191-3JCJ3
QUANTITYS#P#90.5JBJ2
P_S关系89.1JAJ1
18P3J1DATEJNAMEJ#
25P3J2PROJECT关系
65P2J119REDSCREWP4
6P3J312REDNUTP3
15P2J217GREENBOLTP2
50P1J114BLUESCREWP1
TOTALP#J#WEIGHTCOLORPNAMEP#
P_P关系PART关系关系关系关系
5.关系模型的优缺点
优点
建立在严格的数学概念的基础上
概念单一 。 数据结构简单,清晰,用户易懂易用
实体和各类联系都用关系来表示 。
对数据的检索结果也是关系 。
关系模型的存取路径对用户透明
具有更高的数据独立性,更好的安全保密性
简化了程序员的工作和数据库开发建立的工作关系模型的优缺点(续)
缺点存取路径对用户透明导致查询效率往往不如非关系数据模型为提高性能,必须对用户的 查询请求进行优化增加了开发数据库管理系统的难度
6,典型的关系数据库系统
ORACLE
SYBASE
INFORMIX
DB/2
COBASE
PBASE
EasyBase
DM/2
OpenBase
对象模型
对象( object)是现实世界中实体的模型化,与实体概念相仿,但远比实体复杂。
将属性集和方法集相同的所有对象组合在一起,构成了一个类( class)。
层次模型 网状模型 关系模型 面向对象模型创始 1968年 IBM公司的IMS系统 1969年 CODASYL的 DBTG报告 (71年通过 ) 1970年 F.Codd提出关系模型 20世纪 80年代数据结构 复杂(树结构) 复杂(有向图结构) 简单(二维表) 复杂(嵌套递归)
数据联系 通过指针 通过指针 通过表间的公共属性 通过对象标识查询语言 过程性语言 过程性语言 非过程性语言 面向对象语言典型产品 IMS
IDS/Ⅱ
IMAGE/3000
IDMS
TOTAL
Oracle
Sybase
DB2
SQL Server
Informix
ONTOS DB
盛行期 20世纪 70年代 70年代至 80年代中期 80年代至现在 90年代至现在图 四种逻辑数据模型的比较第一章 绪论
1.1 数据库系统概述
1.2 数据模型
1.3 数据库系统结构
1.4 数据库系统的组成
1.5 数据库技术的研究领域
1.6 小结
1.3 数据库系统结构
1.3.1数据库系统内部的 模式 结构从 数据库管理系统 角度看
1.3.2数据库系统外部的体系结构从 数据库最终用户 角度看
1.3.1 数据库系统的模式结构
数据库系统模式的概念
数据库系统的三级模式结构
数据库的二级映象功能与数据独立性
小结数据库系统模式的概念
―型,和,值,的概念
型 ( Type)
对某一类数据的结构和属性的说明
值 ( Value)
是型的一个具体赋值例如:学生记录记录 型,
( 学号,姓名,性别,系别,年龄,籍贯 )
该记录型的一个记录 值,
( 900201,李明,男,计算机,22,江苏 )
数据库系统模式的概念(续)
模式( Schema)- 型
数据库 逻辑结构和特征的描述
是型的描述
反映的是数据的结构及其联系
模式是相对稳定的
模式的一个实例( Instance)- 值
模式的一个具体值
反映数据库某一时刻的状态
同一个模式可以有很多实例
实例随数据库中的数据的更新而变动
1.3.1 数据库系统的模式结构
数据库系统模式的概念
数据库系统的三级模式结构
数据库的二级映象功能与数据独立性
小结数据库系统的三级模式结构应用 A 应用 B 应用 C 应用 D 应用 E
外模式 1 外模式 2 外模式 3
外模式 / 模式映象模式模式 / 内模式映象内模式数据库讲解
1、何为模式、外模式、内模式?
2、处在什么样的地位?
3、他有什么样的作用?
4、什么描述语言?
1.模式( Schema)
模式 ( 也称逻辑模式 )
数据库中 全体 数据的逻辑结构和特征的描述
所有用户 的公共数据视图,综合了 所有用户的需求
一个数据库只有 一 个模式
模式的地位:是数据库系统模式结构的 中间 层
与数据的物理存储细节和硬件环境 无关
与具体的应用程序,开发工具及高级程序设计语言 无关
模式的定义-内容
数据的逻辑结构 ( 数据项的名字,类型,
取值范围等 )
数据之间的联系
数据有关的安全性,完整性要求
模式描述语言 ( 模式 DDL)
2,外模式( External Schema)
外模式 ( 也称子模式或用户模式 )
数据库 用户 ( 包括应用程序员和最终用户 ) 使用的局部 数据的逻辑结构和特征的描述
数据库用户的数据视图,是与某一应用有关的数据的逻辑表示外模式(续)
外模式的 地位,介于模式与应用之间
模式与外模式的关系,一对多
外模式通常是模式的子集
一个数据库可以有多个外模式 。 反映了不同的用户的应用需求,看待数据的方式,
对数据保密的要求 。
对模式中同一数据,在外模式中的结构,
类型,长度,保密级别等都可以不同
外模式与应用的关系,一对多
同一外模式也可以为某一用户的多个应用系统所使用,
但一个应用程序只能使用一个外模式 。
外模式(续)
外模式的用途保证数据库 安全性 的一个有力措施 。
每个用户只能看见和访问所对应的外模式中的数据
子模式描述语言 ( 子模式 DDL)
3.内模式( Internal Schema)
内模式 ( 也称存储模式 )
是数据物理结构和存储方式的描述
是数据在数据库内部的表示方式
记录的存储方式 ( 顺序存储,按照 B树结构存储,
按 hash方法存储 )
索引的组织方式
数据是否压缩存储
数据是否加密
数据存储记录结构的规定
一个数据库只有 一 个内模式
注意:内部记录并不涉及到物理设备的约束。比内模式更接近物理存储和访问的那些软件机制是操作系统的一部分
(文件系统),例如从磁盘读数据或写数据到磁盘上的操作等。
内模式描述语言(内模式 DDL、存储 DDL)
数据按 外模式 的描述提供给 用户,
按 内模式 的描述 存储 在磁盘中,
而 模式 提供了连接这两级的相对稳定的中间 观点,并使得两级中任何一级的改变不受另一级的牵制。
1.3.1 数据库系统的模式结构
数据库系统模式的概念
数据库系统的三级模式结构
数据库的二级映象功能与数据独立性
小结三级模式与二级映象
三级模式是对数据的三个抽象级别
二级映象在 DBMS内部实现这三个抽象层次的联系和转换
数据独立性:是指应用程序和数据库的数据结构之间相互独立,不受影响 。
数据独立性 物理数据独立性
逻辑数据独立性数据库系统的三级模式结构应用 A 应用 B 应用 C 应用 D 应用 E
外模式 1 外模式 2 外模式 3
外模式 / 模式映象模式模式 / 内模式映象内模式数据库
1.外模式/模式映象
1,定义外模式与模式之间的对应关系
2,每一个外模式都对应一个外模式/模式映象
3,映象定义通常包含在各自外模式的描述中外模式/模式映象的用途
4,保证数据的 逻辑独立性
当 模式 改变时,数据库管理员修改有关的外模式/模式映象,使外模式保持不变
应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性 。
数据库系统的三级模式结构应用 A 应用 B 应用 C 应用 D 应用 E
外模式 1 外模式 2 外模式 3
外模式 / 模式映象模式模式 / 内模式映象内模式数据库
2.模式/内模式映象
模式/内模式映象定义了数据全局逻辑结构与存储结构之间的对应关系 。 例如,说明逻辑记录和字段在内部是如何表示的
数据库中模式/内模式映象是唯一的
该映象定义通常包含在模式描述中模式/内模式映象的用途保证数据的 物理独立性
当数据库的存储结构改变了 ( 例如选用了另一种存储结构 ),数据库管理员修改模式/
内模式映象,使模式保持不变
应用程序不受影响 。 保证了数据与程序的物理独立性,简称数据的物理独立性 。
数据库系统的三级模式结构应用 A 应用 B 应用 C 应用 D 应用 E
外模式 1 外模式 2 外模式 3
外模式 / 模式映象模式模式 / 内模式映象内模式数据库数据库的三级体系结构
1.3.1 数据库系统的模式结构
数据库系统模式的概念
数据库系统的三级模式结构
数据库的二级映象功能与数据独立性
小结小结
模式
是数据库的中心与关键
独立于数据库的其它层次
设计数据库模式结构时应首先确定数据库的逻辑模式小结(续)
内模式
依赖于全局逻辑结构,但独立于数据库的用户视图即外模式,也独立于具体的存储设备 。
它将全局逻辑结构中所定义的数据结构及其联系按照一定的物理存储策略进行组织,
以达到较好的时间与空间效率 。
小结(续)
外模式
面向具体的应用程序,定义在逻辑模式之上,但独立于存储模式和存储设备
设计外模式时应充分考虑到应用的扩充性 。
当应用需求发生较大变化,相应外模式不能满足其视图要求时,该外模式就得做相应改动小结(续)
应用程序
在外模式描述的数据结构上编制的,它依赖于特定的外模式,与数据库的模式和存储结构独立 。
不同的应用程序有时可以共用同一个外模式 。
小结(续)
二级映象
保证了数据库外模式的稳定性,从而从底层保证了应用程序的稳定性,除非应用需求本身发生变化,否则应用程序一般不需要修改 。
数据与程序之间的独立性,使得数据的定义和描述可以从应用程序中分离出去 。
1.3 数据库系统结构
1.3.1数据库系统内部的模式结构
从数据库管理系统角度看
1.3.2数据库系统外部的体系结构
从数据库最终用户角度看
1.3.2 数据库系统外部的体系结构
单用户结构
主从式结构
分布式结构
客户 /服务器结构
1,单用户数据库系统
整个数据库系统 (应用程序,DBMS,数据 )
装在一台计算机上,为一个用户独占,
不同机器之间不能共享数据 。
早期的最简单的数据库系统
2,主从式结构的数据库系统
一个主机带多个终端的多用户结构
数据库系统,包括应用程序,DBMS,数据,都集中存放在主机上,所有处理任务都由主机来完成
各个用户通过主机的终端并发地存取数据库,
共享数据资源主从式结构的数据库系统主机终端主从式结构的数据库系统 (续)
优点
易于管理,控制与维护 。
缺点
当终端用户数目增加到一定程度后,主机的任务会过分繁重,成为瓶颈,从而使系统性能下降 。
系统的可靠性依赖主机,当主机出现故障时,
整个系统都不能使用 。
3,分布式结构的数据库系统
数据库中的数据在 逻辑上是一个整体,
但 物理地分布 在计算机网络的不同结点上 。
网络中的每个结点都可以独立处理本地数据库中的数据,执行 局部应用
同时也可以同时存取和处理多个异地数据库中的数据,执行 全局应用分布式结构的数据库系统(续)
优点
适应了地理上分散的公司,团体和组织对于数据库应用的需求 。
缺点
数据的分布存放给数据的处理,管理与维护带来困难 。
当用户需要经常访问远程数据时,系统效率会明显地受到网络传输的制约 。
4.客户/服务器结构的数据库系统
把 DBMS功能和应用分开
网络中某个 ( 些 ) 结点上的计算机专门用于执行 DBMS功能,称为数据库服务器,
简称服务器
其他结点上的计算机安装 DBMS的外围应用开发工具,用户的应用系统,称为客户机客户/服务器数据库系统的种类
集中的服务器结构一台数据库服务器,多台客户机
分布的服务器结构
在网络中有多台数据库服务器
分布的服务器结构是客户/服务器与分布式数据库的结合客户/服务器结构的优点
客户端的用户请求被传送到数据库服务器,数据库服务器进行处理后,只将结果返回给用户,
从而显著减少了数据传输量
数据库更加开放
客户与服务器一般都能在多种不同的硬件和软件平台上运行
可以使用不同厂商的数据库应用开发工具第一章 绪论
1.1 数据库系统概述
1.2 数据模型
1.3 数据库系统结构
1.4 数据库系统的组成
1.5 数据库技术的研究领域
1.6 小结
1.4 数据库系统的组成
数据库- 仓库
数据库管理系统 ( 及其开发工具 ) - 管理制度,运行规则
应用系统- 使用仓库的公司
数据库管理员- 仓库管理员
( 用户 ) - 使用仓库的公司的人员一、硬件平台及数据库
数据库系统对硬件资源的要求
(1) 足够大的内存- 运行
操作系统
DBMS的核心模块
数据缓冲区
应用程序数据库系统对硬件资源的要求
(2) 足够大的外存- 存储
磁盘
操作系统
DBMS
应用程序
数据库及其备份
光盘,磁带,软盘
数据备份
(3) 较高的通道能力,提高数据传送率- 传输二、软件
DBMS
操作系统
与数据库接口的高级语言及其编译系统
以 DBMS为核心的应用开发工具
为特定应用环境开发的数据库应用系统三、人员
数据库管理员-运行中的管理人员
系统分析员
数据库设计人员 开发人员
应用程序员
(最终用户 )
1,数据库管理员 (DBA)
决定数据库中的信息内容和结构
决定数据库的存储结构和存取策略
定义数据的安全性要求和完整性约束条件数据库管理员 (续 )
监控数据库的使用和运行
周期性转储数据库
数据文件
日志文件
系统故障恢复
介质故障恢复
监视审计文件数据库管理员 (续 )
数据库的改进和重组
性能监控和调优
数据重组
数据库重构
2,系统分析员
负责应用系统的需求分析和规范说明
与用户及 DBA( 数据库管理员 ) 协商,
确定系统的硬软件配置
参与数据库系统的概要设计
3,数据库设计人员
参加用户需求调查和系统分析
确定数据库中的数据
设计数据库各级模式
4,应用程序员
设计和编写应用系统的程序模块
进行调试和安装
5,用户
偶然用户
企业或组织机构的高中级管理人员
简单用户
银行的职员,机票预定人员,旅馆总台服务员用户(续)
复杂用户
工程师,科学家,经济学家,科技工作者等
直接使用数据库语言访问数据库,甚至能够基于数据库管理系统的 API编制自己的应用程序第一章 绪论
1.1 数据库系统概述
1.2 数据模型
1.3 数据库系统结构
1.4 数据库系统的组成
1.5 数据库技术的研究领域
1.6 小结
1.5 数据库技术的研究领域
数据库管理系统软件的研制
数据库设计--我们的应用重点
数据库理论--需要掌握的知识数据库管理系统软件的研制
DBMS核心
一组相互联系的软件系统
工具软件
中间件数据库设计
数据库设计方法
设计工具
设计理论
数据模型和数据建模数据库理论
关系的规范化理论
关系数据理论第一章 绪论
1.1 数据库系统概述
1.2 数据模型
1.3 数据库系统结构
1.4 数据库系统的组成
1.5 数据库技术的研究领域
1.6 小结小结
数据库系统 概述
数据库的基本概念
数据管理的发展过程
数据模型
数据模型的三要素
概念模型,E-R 模型
三种主要数据模型小结 (续 )
数据库系统的 结构
数据库系统三级模式结构
数据库系统的体系结构
数据库系统的 组成作业
教材习题 P41:
第 12题
第 13题
参考教材 P19-20的例子第二章 关系数据库
2.1 关系模型概述
2.2 关系数据结构
2.3 关系的完整性
2.4 关系代数
2.5 关系演算
2.6 小结关系数据库简介
系统而严格地提出关系模型的是美国
IBM公司的 E.F.Codd
1970年提出关系数据模型
E.F.Codd,―A Relational Model of Data for Large
Shared Data Banks‖,,Communication of the
ACM》,1970
之后,提出了关系代数和关系演算的概念
1972年提出了关系的第一,第二,第三范式
1974年提出了关系的 BC范式关系数据库简介
关系数据库应用 数学方法 来处理数据库中的数据
80年代后,关系数据库系统成为最重要,
最流行的数据库系统数据库系统概论
An Introduction to Database System
第二章 关系数据库本章概要
本章先介绍关系模型的基本概念;
然后介绍关系运算的三种理论:关系代数、关系演算和关系逻辑。
第二章 关系数据库
2.1 关系模型概述
2.2 关系数据结构
2.3 关系的完整性
2.4 关系代数
2.5 关系演算
2.6 小结
2.1 关系模型概述
关系数据库系统
是支持关系模型的数据库系统
关系模型的组成
关系数据结构
关系操作集合
关系完整性约束
1,关系数据结构
单一的数据结构 ----关系
现实世界的实体以及实体间的各种联系均用关系来表示
数据的逻辑结构 ----二维表
从用户角度,关系模型中数据的逻辑结构是一张二维表 。
工 号 姓 名 年 龄 性 别 工 资
4001 zhang 50 M 2000
4002 li 40 F 1500
4124 liu 35 M 2000
5018 wang 25 M 1000
用二维表格表示实体集,用关键码进行数据导航的数据模型称为关系模型。这里数据导航是指从已知数据查找未知数据的过程和方法。
2,关系操作集合
1) 常用的关系操作
2) 关系操作的特点
3) 关系数据语言的种类
4) 关系数据语言的特点关系操作集合 (续)
1) 常用的关系操作
查询
选择,投影,连接,除,并,交,差
数据更新
插入,删除,修改
查询的表达能力是其中最主要的部分关系操作集合(续)
2) 关系操作的特点
集合操作方式,即操作的对象和结果都是集合 。
非关系数据模型的数据操作方式:一次一记录
文件系统的数据操作方式关系操作集合(续)
3) 关系数据语言的种类
1,关系代数语言
用对关系的运算来表达查询要求关系操作集合(续)
关系数据语言的种类 ( 续 )
2,关系演算语言:用谓词来表达查询要求
元组关系演算语言
谓词变元的基本对象是元组变量
典型代表,APLHA,QUEL
域关系演算语言
谓词变元的基本对象是域变量
典型代表,QBE
具有关系代数和关系演算 双重特点 的语言
典型代表,SQL
是关系数据库的 标准语言关系数据语言关系代数语言 ( ISBL)
关系演算语言具有关系代数和关系演算双重特点的语言 SQL
元组 关系演算语言
( ALPHA,QUEL)
域 关系演算语言
( QBE)
关系操作集合(续)
4) 关系数据语言的特点
关系语言是一种高度 非过程化 的语言
存取路径的选择由 DBMS的优化机制来完成
用户不必用循环结构就可以完成数据操作
能够 嵌入 高级语言中使用
关系代数,元组关系演算和域关系演算三种语言在表达能力上完全等价
3,关系的三类完整性约束
实体完整性
通常由关系系统自动支持
参照完整性
早期系统不支持,目前大型系统能自动支持
用户定义的完整性
反映应用领域需要遵循的约束条件,体现了具体领域中的语义约束
用户定义后由系统支持第二章 关系数据库
2.1 关系模型概述
2.2 关系数据结构
2.3 关系的完整性
2.4 关系代数
2.5 关系演算
2.6 小结
2.2 关系数据结构
关系模型建立在集合代数的基础上
关系数据结构的基本概念
关系
关系模式
关系数据库
2.2 关系数据结构
2.2.1 关系
2.2.2 关系模式
2.2.3 关系数据库
2.2.1 关系
⒈ 域 ( Domain)
2,笛卡尔积 ( Cartesian Product)
3,关系 ( Relation)
⒈ 域( Domain)
域 是一组具有相同数据类型的值的集合 。
例,
整数
实数
介于某个取值范围的整数
长度指定长度的字符串集合
{?男 ’,‘ 女 ’ }
介于某个取值范围的日期
{ 张清玫,刘逸 }
{ 计算机专业,信息专业 }
2,笛卡尔积( Cartesian Product)
1) 笛卡尔积给定一组域 D1,D2,…,Dn,这些域中可以有相同的 。 D1,D2,…,Dn的 笛卡尔积 为:
D1× D2× … × Dn= {( d1,d2,…,dn) |
di?Di,i= 1,2,…,n}
所有域的所有取值的一个组合
不能重复笛卡尔积(续 )
例 给出三个域:
D1=SUPERVISOR ={ 张清玫,刘逸 }
D2=SPECIALITY={计算机专业,信息专业 }
D3=POSTGRADUATE={李勇,刘晨,王敏 }
则 D1,D2,D3的笛卡尔积为:
D1× D2× D3=
{ (张清玫,计算机专业,李勇 ),(张清玫,计算机专业,刘晨 ),
(张清玫,计算机专业,王敏 ),(张清玫,信息专业,李勇 ),
(张清玫,信息专业,刘晨 ),(张清玫,信息专业,王敏 ),
(刘逸,计算机专业,李勇 ),(刘逸,计算机专业,刘晨 ),
(刘逸,计算机专业,王敏 ),(刘逸,信息专业,李勇 ),
(刘逸,信息专业,刘晨 ),(刘逸,信息专业,王敏 )}
D1域导师集合张清玫刘逸
D2域专业集合计算机专业信息专业
D3域研究生集合李勇刘晨王敏导师 专业 研究生张清玫 计算机专业 李勇张清玫 计算机专业 刘晨张清玫 计算机专业 王敏张清玫 信息专业 李勇张清玫 信息专业 刘晨张清玫 信息专业 王敏刘逸 计算机专业 李勇刘逸 计算机专业 刘晨刘逸 计算机专业 王敏刘逸 信息专业 李勇刘逸 信息专业 刘晨刘逸 信息专业 王敏笛卡尔积(续 )
2) 元组 ( Tuple)
笛卡尔积中每一个元素 ( d1,d2,…,dn)
叫作一个 n元组 ( n-tuple) 或简称 元组 。
3) 分量( Component)
笛卡尔积元素( d1,d2,…,dn)中的每一个值 di叫作一个 分量 。
笛卡尔积(续 )
4) 基数 ( Cardinal number)
若 Di( i= 1,2,…,n) 为有限集,其基数为 mi ( i = 1,2,…,n ),则
D1× D2× … × Dn的基数 M为:
在上例中,基数,2× 2× 3= 12,即
D1× D2× D3共有 2× 2× 3= 12个元组
mM i
n
1i?
笛卡尔积(续 )
5)笛卡尔积的表示方法
笛卡尔积可表示为一个二维表 。 表中的每行对应一个元组,表中的每列对应一个域 。
在上例中,12个元组可列成一张二维表表 2,1 D
1
,D
2
,D
3
的笛卡尔积
S U PE R V I S O R S PE C I A L IT Y PO S T G R A D U A T E
张清玫 计算机专业 李勇张清玫 计算机专业 刘晨张清玫 计算机专业 王敏张清玫 信息专业 李勇张清玫 信息专业 刘晨张清玫 信息专业 王敏刘逸 计算机专业 李勇刘逸 计算机专业 刘晨刘逸 计算机专业 王敏刘逸 信息专业 李勇刘逸 信息专业 刘晨刘逸 信息专业 王敏
3,关系( Relation)
1) 关系
D1× D2× … × Dn的子集叫作在域 D1,D2,…,
Dn上的 关系,表示为
R( D1,D2,…,Dn)
R,关系名
n,关系的 目 或 度 ( Degree)
关系(续)
注意:
关系是笛卡尔积的有限子集 。 无限关系在数据库系统中是无意义的 。
由于笛卡尔积不满足交换律,即
(d1,d2,…,dn)≠(d2,d1,…,dn )
但关系满足交换律,即
(d1,d2,…,di,dj,…,dn) =( d1,d2,…,dj,
di,…,dn) ( i,j = 1,2,…,n)
解决方法:为关系的每个列附加一个属性名以取消关系元组的有序性关系(续)
例 在表 2.1 的笛卡尔积中取出有实际意义的元组来构造关系关系,SAP(导师,专业,研究生 )
关系名,属性名假设,导师与专业,1:1,导师与研究生,1:n
于是,SAP关系可以包含三个元组
{ (张清玫,信息专业,李勇 ),
(张清玫,信息专业,刘晨 ),
(刘逸,信息专业,王敏 ) }
关系(续)
2) 元组关系中的每个元素是关系中的元组,通常用 t
表示 。
3) 单元关系与二元关系当 n=1时,称该关系为 单元 关系 ( Unary
relation) 。
当 n=2时,称该关系为 二元 关系 ( Binary
relation) 。
关系(续)
4) 关系的表示关系也是一个二维表,表的每行对应一个元组,
表的每列对应一个域 。 表 2,2 S A P 关系
S U P ER V I S O R S P EC I A LI TY P O S TG R A D U A TE
张清玫 信息专业 李勇张清玫 信息专业 刘晨刘逸 信息专业 王敏关系(续)
5) 属性关系中不同列可以对应相同的域,为了加以区分,必须对每列起一个名字,称为属性
( Attribute) 。
n目关系必有 n个属性 。
关系(续)
6) 码候选码 ( Candidate key)
若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码在最简单的情况下,候选码只包含一个属性。
在最极端的情况下,关系模式的所有属性组是这个关系模式的候选码,称为全码( All-
key)
关系(续)
码 (续 )
主码若一个关系有多个候选码,则选定其中一个为 主码 ( Primary key)
主码的诸属性称为 主属性 ( Prime attribute) 。
不包含在任何侯选码中的属性称为 非码属性
( Non-key attribute)
关系(续)
7) 三类关系基本关系 ( 基本表或基表 )
实际存在的表,是实际存储数据的逻辑表示查询表查询结果对应的表视图表由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据
8) 基本关系的性质
① 列是同质的( Homogeneous)
每一列中的分量是同一类型的数据,来自同一个域表 2,2 S A P 关系
S U P ER V I S O R S P EC I A LI TY P O S TG R A D U A TE
张清玫 信息专业 李勇张清玫 信息专业 刘晨刘逸 信息专业 王敏
② 不同的列可出自同一个域其中的每一列称为一个属性不同的属性要给予不同的属性名分清,属性,和,域,。
基本关系的性质 (续 )
上例中也可以只给出两个域:
人 ( PERSON) =张清玫,刘逸,李勇,刘晨,王敏专业 ( SPECIALITY) =计算机专业,信息专业
SAP关系的导师属性和研究生属性都从 PERSON域中取值为了避免混淆,必须给这两个属性取不同的属性名,而不能直接使用域名 。
例如定义,
导师属性名为 SUPERVISOR-PERSON( 或 SUPERVISOR)
研究生属性名为 POSTGRADUATE-PERSON( 或 POSTGRADUATE)
基本关系的性质 (续 )
③ 列的顺序无所谓,
列的次序可以任意交换
遵循这一性质的数据库产品 (如 ORACLE),增加新属性时,永远是插至最后一列
但也有许多关系数据库产品没有遵循这一性质,例如
FoxPro仍然区分了属性顺序基本关系的性质 (续 )
④ 任意两个元组不能完全相同由笛卡尔积的性质决定
但许多关系数据库产品没有遵循这一性质 。
例如,
Oracle,FoxPro等都允许关系表中存在两个完全相同的元组,除非用户特别定义了相应的约束条件 。
基本关系的性质 (续 )
⑤ 行的顺序无所谓行的次序可以任意交换
遵循这一性质的数据库产品 (如 ORACLE),插入一个元组时永远插至最后一行
但也有许多关系数据库产品没有遵循这一性质,例如 FoxPro仍然区分了元组的顺序基本关系的性质 (续 )
⑥ 分量必须取 原子值每一个分量都必须是不可分的数据项。
这是规范条件中最基本的一条表 2,3 非规范化关系
P O S T G RA D UA T E
S U P E R V I S O R
S P E C I A L I T Y
P G 1 P G 2
张清玫 信息专业 李勇 刘晨刘逸 信息专业 王敏
小结
域- >笛卡尔积- >关系(有限子集)-
>关系的目、元组 t、二维表、属性、码、
三种关系、基本关系的六个特点
2.2 关系数据结构
2.2.1 关系
2.2.2 关系模式
2.2.3 关系数据库
2.2.2 关系模式
1,什么是关系模式
2.定义关系模式
3,关系模式与关系
1.什么是关系模式关系模式 ( Relation Schema) 是型关系是值关系模式是对关系的描述元组集合的结构属性构成属性来自的域属性与域之间的映象关系元组语义以及完整性约束条件属性间的数据依赖关系集合
2.定义关系模式关系模式可以形式化地表示为:
R( U,D,dom,F)
R 关系名
U 组成该关系的属性名集合
D 属性组 U中属性所来自的域
dom 属性向域的映象集合
F 属性间的数据依赖关系集合定义关系模式 (续 )
例,
导师和研究生出自同一个域 ——人,
取不同的属性名,并在模式中定义属性向域的映象,即说明它们分别出自哪个域:
dom(导师 -人)
= dom(研究生 -人)
=PERSON
定义关系模式 (续 )
关系模式通常可以简记为
R (U) 或 R (A1,A2,…,An)
R 关系名
A1,A2,…,An 属性名注:域名及属性向域的映象常常直接说明为属性的类型、长度
3,关系模式与关系关系模式对关系的描述静态的,稳定的关系关系模式在某一时刻的状态或内容动态的,随时间不断变化的关系模式和关系往往 统称 为关系通过上下文加以区别
2.2 关系数据结构
2.2.1 关系
2.2.2 关系模式
2.2.3 关系数据库
2.2.3 关系数据库
1,关系数据库
2,关系数据库的型与值
1,关系数据库在一个给定的应用领域中,所有实体及实体之间联系的关系的集合构成一个关系数据库 。
2,关系数据库的型与值关系数据库也有型和值之分关系数据库的型 称为关系数据库模式,是对关系数据库的描述若干域的定义在这些域上定义的若干关系模式关系数据库的值 是这些关系模式在某一时刻对应的关系的集合,通常简称为关系数据库第二章 关系数据库
2.1 关系模型概述
2.2 关系数据结构
2.3 关系的完整性
2.4 关系代数
2.5 关系演算
2.6 小结
2.3 关系的完整性关系模型的完整性规则是对关系的某种 约束条件 。
关系模型中三类完整性约束:
实体完整性参照完整性用户定义的完整性实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个 不变性,应该由关系系统自动支持 。
关系的完整性 (续 )
2.3.1 实体完整性
2.3.2,参照完整性
2.3.3,用户定义的完整性
2.3.1 实体完整性实体完整性规则 ( Entity Integrity)
若属性 A是基本关系 R的主属性,则属性
A不能取空值例
SAP(导师,专业,研究生 )
研究生属性为主码
( 假设研究生不会重名 ),则其不能取空值实体完整性 (续 )
关系模型必须遵守实体完整性规则的原因
(1) 实体完整性规则是针对基本关系而言的 。 一个基本表通常对应现实世界的一个实体集或多对多联系 。
(2) 现实世界中的实体和实体间的联系都是可区分的,即它们具有某种唯一性标识 。
(3) 相应地,关系模型中以主码作为唯一性标识 。
实体完整性 (续 )
(4) 主码中的属性即主属性不能取空值 。
空值就是,不知道,或,无意义,的值 。
反证法:
主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第 ( 2) 点相矛盾,因此这个规则称为实体完整性 。
基本关系?--? 现实世界的实体集
主码为关系的唯一标识?--? 现实世界实体是可区分
(没有相同的指纹、
我爱的你是唯一的)
所以:主码中的属性(主属性不能取空值)
实体完整性 (续 )
注意实体完整性规则规定基本关系的所有主属性都不能取空值例选修(学号,课程号,成绩)
,学号、课程号,为主码,则两个属性都不能取空值。
关系的完整性
2.3.1 实体完整性
2.3.2,参照完整性
2.3.3,用户定义的完整性
2.3.2 参照完整性
1,关系间的引用
2,外码
3,参照完整性规则
1,关系间的引用在关系模型中实体及实体间的联系都是用关系来描述的,因此可能存在着关系与关系间的引用 。
两个关系之间例 1 学生实体,专业实体以及专业与学生间的一对多联系学生 ( 学号,姓名,性别,专业号,年龄 )
专业 ( 专业号,专业名 )
学号 姓名 性别 专业号 年龄
801 张三 女 01 19
802 李四 男 01 20
803 王五 男 01 20
804 赵六 女 02 20
805 钱七 男 02 19
专业号 专业名
01 信息
02 数学
03 计算机学生( 学号,姓名,性别,专业号,年龄)
专业( 专业号,专业名)
三个关系例 2 学生,课程,学生与课程之间的多对多联系学生 ( 学号,姓名,性别,专业号,年龄 )
课程 ( 课程号,课程名,学分 )
选修 ( 学号,课程号,成绩 )
课程号 课程名 学分
01 数据库 4
02 数据结构 4
03 编译 4
04 P ASC AL 2
学号 姓名 性别 专业号 年龄
801 张三 女 01 19
802 李四 男 01 20
803 王五 男 01 20
804 赵六 女 02 20
805 钱七 男 02 19
学号 课程号 成绩
801 04 92
801 03 78
801 02 85
802 03 82
802 04 90
803 04 88
学生学生选课课程同一个关系例 3 学生实体及其内部的领导联系 (一对多 )
学生 ( 学号,姓名,性别,专业号,年龄,班长 )
学号 姓名 性别 专业号 年龄 班长
801 张三 女 01 19 802
802 李四 男 01 20
803 王五 男 01 20 802
804 赵六 女 02 20 805
805 钱七 男 02 19
2.外码( Foreign Key)
设 F是基本关系 R的一个或一组属性,但不是关系 R的码 。 如果 F与基本关系 S的主码
Ks相对应,则称 F是基本关系 R的 外码基本关系 R称 为 参照关系 ( Referencing
Relation)
基本关系 S称 为 被参照关系 ( Referenced
Relation) 或 目标关系 ( Target Relation) 。
例子 1:
学生 ( 学号,姓名,性别,专业号,年龄 )
专业 ( 专业号,专业名 )
学生关系 ----------?专业关系专业号被参照的关系参照的关系例子 2:学生 ( 学号,姓名,性别,专业号,年龄 )
课程 ( 课程号,课程名,学分 )
选修 ( 学号,课程号,成绩 )
学生关系 <---------选修关系-- -?课程关系参照的关系被参照的关系 被参照的关系
例 3 学生实体及其内部的领导联系 (一对多 )
学生( 学号,姓名,性别,专业号,年龄,班长 )
学生关系参照的关系 被参照的关系外码 (续 )
说明
1、关系 R和 S不一定是不同的关系
2、目标关系 S的主码 Ks 和参照关系的外码 F必须定义在同一个(或一组)域上
3、外码并不一定要与相应的主码同名。
通常:当外码与相应的主码属于不同关系时,往往 取相同的名字,以便于识别
3,参照完整性规则若属性 ( 或属性组 ) F是基本关系 R的 外码它与基本关系 S的主码 Ks相对应 ( 基本关系 R和 S不一定是不同的关系 ),则对于 R中每个元组在 F上的值必须为:
或者取空值 ( F的每个属性值均为空值 )
或者等于 S中某个元组的主码值 。
参照完整性规则 (续 )
例子 1:学生关系中每个元组的,专业号,
属性只取下面两类值:
( 1) 空值,表示尚未给该学生分配专业
( 2) 非空值,这时该值必须 是专业关系中某个元组的,专业号,值,表示该学生不可能分配到一个不存在的专业中参照完整性规则 (续 )
例子 2:选修( 学号,课程号,成绩)
,学号,和,课程号,是选修关系中的主属性按照实体完整性和参照完整性规则,它们只能取相应被参照关系中已经存在的主码值参照完整性规则 (续 )
例子 3:学生( 学号,姓名,性别,专业号,年龄,
班长 )
,班长,属性值可以取两类值:
( 1)空值,表示该学生所在班级尚未选出班长,
或该学生本人即是班长;
( 2)非空值,这时该值必须是本关系中某个元组的学号值
参照完整性小结:
关系和关系之间有引用(三个关系、二个关系、单个关系)
外码
参照完整性规则关系的完整性 (续 )
2.3.1 实体完整性
2.3.2,参照完整性
2.3.3,用户定义的完整性
2.3.3 用户定义的完整性
用户定义的完整性是针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求 。
关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,
而不要由应用程序承担这一功能 。
用户定义的完整性 (续 )
例,
课程 (课程号,课程名,学分 )
―课程名,属性必须取唯一值
非主属性,课程名,也不能取空值
,学分,属性只能取值 {1,2,3,4}
小结
关系数据结构
关系
域
笛卡尔积
关系
关系,属性,元组
候选码,主码,主属性
基本关系的性质
关系模式
关系数据库
关系的数据操作集合
查询
选择、投影、连接、除、并、交、差
数据更新
插入、删除、修改
关系的完整性约束
实体完整性
参照完整性
外码
用户定义的完整性
4 关系模型的操作
4.1 关系代数
Operation 运算,操作
Operator 算子
Operand 操作数第二章 关系数据库
2.1 关系模型概述
2.2 关系数据结构
2.3 关系的完整性
2.4 关系代数
2.5 关系演算
2.6 小结
2.4 关系代数
概述
传统的集合运算
专门的关系运算概述
1,关系代数
2,运算的三要素
3,关系代数运算的三个要素
4,关系代数运算的分类
5,表示记号概述
1.关系代数一种抽象的查询语言用对关系的运算来表达查询概述 (续 )
2,关系代数运算的三个要素运算对象:关系运算结果:关系运算符:四类概述 (续 )
集合运算符
将关系看成元组的集合
运算是从关系的,水平,方向即行的角度来进行
专门的关系运算符
不仅涉及行而且涉及列
算术比较符
辅助专门的关系运算符进行操作
逻辑运算符
辅助专门的关系运算符进行操作集合运算符
∪
-
∩
×
并差交广义笛卡尔积比较运算符
>
≥
<
≤
= ≠
大于大于等于小于小于等于等于不等于运算符 含义 运算符 含义表 2.4 关系代数运算符概述 (续 )
专门的关系运算符
σ
π
÷
选择投影除连接逻辑运算符
∧
∨
非与或概述 (续 )
4.关系代数运算的分类传统的集合运算并,差,交,广义笛卡尔积专门的关系运算选择,投影,连接,除概述 (续 )
5.表示记号
( 1) R,t?R,t[Ai]
设关系模式为 R(A1,A2,…,An)
它的一个关系设为 R。 t?R表示 t是 R的一个元组
t[Ai]则表示元组 t中相应于属性 Ai的一个分量概述 (续 )
( 2) A,t[A],A
若 A={Ai1,Ai2,…,Aik},其中 Ai1,Ai2,…,
Aik是 A1,A2,…,An中的一部分,则 A称为属性列或域列。 t[A]=(t[Ai1],t[Ai2],…,
t[Aik])表示元组 t在属性列 A上诸分量的集合。
A则表示 {A1,A2,…,An}中去掉 {Ai1,
Ai2,…,Aik}后剩余的属性组。
概述 (续 )
( 3) tr ts
R为 n目关系,S为 m目关系。 tr?R,
ts?S,tr ts称为元组的连接。它是一个 n
+ m列的元组,前 n个分量为 R中的一个 n
元组,后 m个分量为 S中的一个 m元组。
概述 (续 )
4) 象集 Zx
给定一个关系 R( X,Z),X和 Z为属性组 。 当
t[X]=x时,x在 R中的 象集 ( Images Set) 为:
Zx={t[Z]|t?R,t[X]=x}
它表示 R中属性组 X上值为 x的诸元组在 Z上分量的集合。
除 (续 )
A B C
a1 b1 c2
a2 b3 c7
a3 b4 c6
a1 b2 c3
a4 b6 c6
a2 b2 c3
a1 b2 c1
R
B C
b1 c2
b2 C3
b2 c1
分析:
在关系 R中,A可以取四个值
{a1,a2,a3,a4}
a1的象集为 {(b1,c2),(b2,c3),(b2,c1)}
a2的象集为 {(b3,c7),(b2,c3)}
a3的象集为 {(b4,c6)}
a4的象集为 {(b6,c6)}
2.4 关系代数
概述
传统的集合运算
专门的关系运算
2.4.1 传统的集合运算
并
差
交
广义笛卡尔积
1,并( Union)
R和 S
具有相同的目 n( 即两个关系都有 n个属性 )
相应的属性取自同一个域
R∪ S
仍为 n目关系,由属于 R或属于 S的元组组成
R∪ S = { t|t? R∨ t?S }
并 (续 )
A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1
A B C
a1 b1 c1
a1 b2 c2
a1 b3 c2
a2 b2 c1
A B C
a1 b2 c2
a1 b3 c2
a2 b2 c1
R
S
R∪ S
R RUSS
2,差( Difference)
R和 S
具有相同的目 n
相应的属性取自同一个域
R - S
仍为 n目关系,由属于 R而不属于 S的所有元组组成
R -S = { t|t?R∧ t?S }
差 (续 )
A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1 A B C
a1 b1 c1
A B C
a1 b2 c2
a1 b3 c2
a2 b2 c1
R
S
R-S
S-R?
R R- SS
3,交( Intersection)
R和 S
具有相同的目 n
相应的属性取自同一个域
R∩ S
仍为 n目关系,由既属于 R又属于 S的元组组成
R∩ S = { t|t? R∧ t?S }
R∩ S = R –(R-S)
交 (续 )
A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1
A B C
a1 b2 c2
a2 b2 c1
A B C
a1 b2 c2
a1 b3 c2
a2 b2 c1
R
S
R ∩S
R R∩SS
4,广义笛卡尔积( Extended
Cartesian Product)
R
n目关系,k1个元组
S
m目关系,k2个元组
R× S
列,( n+m) 列的元组的集合
元组的前 n列是关系 R的一个元组
后 m列是关系 S的一个元组
行,k1× k2个元组
R× S = {tr ts |tr?R ∧ ts?S }
广义笛卡尔积 (续 )
A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1
R.A R.B R.C
a1 b1 c1
a1 b1 c1
a1 b1 c1
a1 b2 c2
a1 b2 c2
a1 b2 c2
a2 b2 c1
a2 b2 c1
a2 b2 c1
A B C
a1 b2 c2
a1 b3 c2
a2 b2 c1
R
S
R × S
S.A S.B S.C
a1 b2 c2
a1 b3 c2
a2 b2 c1
a1 b2 c2
a1 b3 c2
a2 b2 c1
a1 b2 c2
a1 b3 c2
a2 b2 c1
2.4 关系代数
概述
传统的集合运算
专门的关系运算
2.4.2 专门的关系运算
选择
投影
连接
除
1,选择( Selection)
1) 选择又称为限制 ( Restriction)
2)选择操作是根据某些条件对关系做 水平分割,即选取符合条件的 元组 。
3) 选择运算符的含义
在关系 R中选择满足给定条件的诸元组
σF(R) = {t|t?R∧ F(t)= '真 '}
F称为条件表达式 。 包括:
运算对象,常数 ( 用引号括起来 ),元组分量
( 属性名或列的序号 )
运算符,算术比较运算符 ( θ),逻辑运算符
( ∧ 或 ∨,? )
F:选择条件,是一个逻辑表达式,基本形式为:
[?( ] X1θY1 [ )][φ [?( ] X2θY2 [ )]]…
θ:比较运算符 ( >,≥,<,≤,=或 <>)
X1,Y1等:属性名,常量,简单函数;属性名也可以用它的序号来代替;
φ:逻辑运算符 ( ∧ 或 ∨ )
[ ]:表示任选项
…,表示上述格式可以重复下去
[?( ] X1θY1 [ )][φ [?( ] X2θY2 [ )]]…
分解:
X1θY1 例子,Sdept = ‘CS'
( X1θY1 ) 例子,?( Sdept = ‘CS')
X2θY2 例子,Sage>20
( X1θY1) φ( X2θY2 ) 例子,(Sdept = ‘CS’) ∧ ( Sage>20)
选择(续)
4) 选择运算是从行的角度进行的运算
5) 举例设有一个学生 -课程数据库,包括学生关系
Student,课程关系 Course和选修关系 SC。
σ
选择(续)
学 号
Sno
姓 名
Sname
性 别
Ssex
年 龄
Sage
所 在系
Sdept95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
(a)
Student
例 1 例 2 例 4例 3 例 9
选择(续)
(b)
Course
课程号 课程名 先行课 学分
Cno Cname Cpno Ccredit
1 数据库 5 4
2 数学 2
3 信息系统 1 4
4 操作系统 6 3
5 数据结构 7 4
6 数据处理 2
7 PASCAL语言 6 4
例 9
选择(续)
(c)
SC
学 号 课 程 号 成 绩
Sno Cno Grade
95001 1 92
95001 2 85
95001 3 88
95002 2 90
95002 3 80
例 7 例 9
选择(续)
[例 1] 查询信息系 ( IS系 ) 全体学生
σSdept = 'IS' (Student)
或 σ5 ='IS' (Student)
结果:
Sno Sname Ssex Sage Sdept
95002 刘晨 女 19 IS
95004 张立 男 19 IS
选择(续)
[例 2] 查询年龄小于 20岁的学生
σSage < 20(Student)
或 σ4 < 20(Student)
结果:
Sno Sname Ssex Sage Sdept
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
2,投影( Projection)
1) 投影运算符的含义
从 R中选择出若干属性列组成新的关系
πA(R) = { t[A] | t?R }
A,R中的属性列
这个操作是对一个关系进行垂直分割,消去某些列,并重新安排列的顺序 。
2,投影( Projection)
2) 投影操作主要是从列的角度进行运算
但投影之后不仅取消了原关系中的某些列,
而且还可能取消某些元组 ( 避免重复行 )
π
投影(续)
3) 举例
[例 3] 查询学生的姓名和所在系即求 Student关系上学生姓名和所在系两个属性上的投影
πSname,Sdept(Student)
或 π2,5(Student)
结果:
投影(续)
Sname Sdept
李勇 CS
刘晨 IS
王敏 MA
张立 IS
投影(续)
[例 4] 查询学生关系 Student中都有哪些系
πSdept(Student)
结果,Sdept
CS
IS
MA
3,连接( Join)
1) 连接也称为 θ连接
2) 连接运算的含义
从两个关系的笛卡尔积中选取属性间满足一定条件的元组
R S = { | tr? R∧ ts
S∧ tr[A]θts[B] }
A和 B,分别为 R和 S上度数相等且可比的属性组
θ:比较运算符
AθB tr ts
连接运算:
从 R和 S的广义笛卡尔积 R× S中选取( R关系)
在 A属性组上的值与( S关系)在 B属性组上值满足比较关系的元组。
连接 (续 )
3)两类常用连接运算
等值连接( equijoin)
什么是等值连接
θ为,=,的连接运算称为等值连接
等值连接的含义
从关系 R与 S的广义笛卡尔积中选取 A,B
属性值相等的那些元组,即等值连接为:
R S = { | tr?R∧ ts?S∧ tr[A] =
ts[B] }
A=B tr ts
连接 (续 )
自然连接 ( Natural join)
什么是自然连接
自然连接是一种特殊的等值连接
两个关系中进行比较的分量必须是相同的属性组
在结果中把重复的属性列去掉
自然连接的含义
R和 S具有相同的属性组 B
R S = { | tr?R∧ ts?S∧ tr[B] =
ts[B] }
tr ts
连接 (续 )
4) 一般的连接操作是从行的角度进行运算 。
自然连接还需要取消重复列,所以是同时从行和列的角度进行运算。
AθB
R
S
连接 (续 )
5)举例
[例 5]
A B C
a1 b1 5
a1 b2 6
a2 b3 8
a2 b4 12
B E
b1 3
b2 7
b3 10
b3 2
b5 2
R S
连接 (续 )
R S
A R.B C S.B E
a1 b1 5 b2 7
a1 b1 5 b3 10
a1 b2 6 b2 7
a1 b2 6 b3 10
a2 b3 8 b3 10
C< E
连接 (续 )
等值连接 R SR.B=S.B
A R.B C S.B E
a1 b1 5 b1 3
a1 b2 6 b2 7
a2 b3 8 b3 10
a2 b3 8 b3 2
连接 (续 )
自然连接 R S
A B C E
a1 b1 5 3
a1 b2 6 7
a2 b3 8 10
a2 b3 8 2
笛卡尔积,R× S = {tr ts |tr?R ∧ ts?S }
连接 ( θ),R S = { | tr? R∧ ts?S∧ tr[A]θts[B] }
等值连接,R S = { | tr?R∧ ts?S∧ tr[A] =
ts[B] }
自然连接,R S = { | tr?R∧ ts?S∧ tr[B] =
ts[B] }
AθB
tr ts
A=B tr ts
tr ts
4)象集 Z
给定一个关系 R( X,Z),X和 Z为属性组 。 当 t[X]=x 时,x 在 R 中的 象集
( Images Set) 为:
Zx={t[Z]|t?R,t[X]=x}
它表示 R中属性组 X上值为 x的诸元组在
Z上分量的集合。
象集 Z
A B C
a1 b1 c2
a2 b3 c7
a3 b4 c6
a1 b2 c3
a4 b6 c6
a2 b2 c3
a1 b2 c1
B C D
b1 c2 d1
b2 c1 d1
b2 c3 d2
R÷ S
A
a1
R
S
4,除( Division)
给定关系 R (X,Y) 和 S (Y,Z),其中 X,Y,Z为属性组 。
R中的 Y与 S中的 Y可以有不同的属性名,但必须出自相同的域集 。 R与 S的除运算得到一个新的关系 P(X),P是 R中满足下列条件的元组在 X属性列上的投影:元组在 X上分量值 x的 象集 Yx包含 S在 Y上投影 的集合 。
R÷ S = {tr [X] | tr? R∧ πY (S)? Yx }
Yx,x在 R中的象集,x = tr[X]
分析:
1、前提:两个关系 R( X,Y)和 S( Y,Z)
应该有公共属性列。
2、运算的结果:为 P( X),元组来自于 R关系,只包含 X属性列
3,R关系中的哪些元组呢?
对于 t[X]的象集 包含 πY (S)
除 (续 )
2) 除操作是同时从行和列角度进行运算
3) 举例
[例 6] (p62)
÷
R
S
除 (续 )
A B C
a1 b1 c2
a2 b3 c7
a3 b4 c6
a1 b2 c3
a4 b6 c6
a2 b2 c3
a1 b2 c1
B C D
b1 c2 d1
b2 c1 d1
b2 c3 d2
R÷ S
A
a1
R
S
分析:
在关系 R中,A可以取四个值 {a1,a2,a3,a4}
a1的象集为 {(b1,c2),(b2,c3),(b2,c1)}
a2的象集为 {(b3,c7),(b2,c3)}
a3的象集为 {(b4,c6)}
a4的象集为 {(b6,c6)}
S在 (B,C)上的投影为
{(b1,c2),(b2,c1),(b2,c3) }
只有 a1的象集包含了 S在 (B,C)属性组上的投影所以 R÷ S ={a1}
除 (续 )
A B C
a1 b1 c2
a2 b3 c7
a3 b4 c6
a1 b2 c3
a4 b6 c6
a2 b2 c3
a1 b2 c1
B C
b1 c2
b2 c1
b2 c3
R÷ S
A
a1
R
S
分析:
在关系 R中,A可以取四个值 {a1,a2,a3,a4}
a1的象集为 {(b1,c2),(b2,c3),(b2,c1)}
a2的象集为 {(b3,c7),(b2,c3)}
a3的象集为 {(b4,c6)}
a4的象集为 {(b6,c6)}
S在 (B,C)上的投影为
{(b1,c2),(b2,c1),(b2,c3) }
只有 a1的象集包含了 S在 (B,C)属性组上的投影所以 R÷ S ={a1}
SNO SNAME CNO CNAME
S1 BAO C1 DB
S1 BAO C2 OS
S1 BAO C3 DS
S1 BAO C4 MIS
S2 GU C1 DB
S2 GU C2 OS
S3 AN C2 OS
S4 LI C2 OS
S4 LI C4 MIS
CNO CNAME
C2 OS
CNO CNAME
C2 OS
C4 MIS
CNO CNAME
C1 DB
C2 OS
C4 MIS
S1
S2
S3
R R÷ S 1
SNO SNAME
S1 BAO
S2 GU
S3 AN
S4 LI
SNO SNAME
S1 BAO
S4 LI
SNO SNAME
S1 BAO
R÷ S 2
R÷ S 3
S1,S2,S3表示课程情况R表示选修课程?
除法的含义,R÷ S 1表示至少选修 S1关系中列出课程的学生的学号和姓名
除法的含义,R÷ S 2表示至少选修 S2关系中列出课程的学生的学号和姓名类似
)(
).(
).(
XP
ZYS
YXR
X中谁的象集包含 Y这张表
A B C D
a b c d
a b e f
a b h k
b d e f
b d d l
c K c d
c k e f
R
C D
c d
e f
R÷ S
A B
a b
c k
S
总结:
一共 八 种运算:
五 种基本运算:并、差、笛卡尔积、选择、投影
三 种组合运算:交、连接、除关系代数表达式:
关系代数运算经有限次复合后形成的式子举例,
学 号
Sno
姓 名
Sname
性 别
Ssex
年 龄
Sage
所 在系
Sdept95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
Student
Course
课程号 课程名 先行课 学分
Cno Cname Cpno Ccredit
1 数据库 5 4
2 数学 2
3 信息系统 1 4
4 操作系统 6 3
5 数据结构 7 4
6 数据处理 2
7 PASCAL语言 6 4
SC
学 号 课 程 号 成 绩
Sno Cno Grade
95001 1 92
95001 2 85
95001 3 88
95002 2 90
95002 3 80
5.综合举例以学生 -课程数据库为例 (P.59)
[例 7] 查询至少选修 1号课程和 3号课程的学生号码首先建立一个临时关系 K:
然后求,πSno.Cno(SC)÷ K
Cno
1
3
综合举例 (续 )
例 7续 πSno.Cno(SC)
95001象集 {1,2,3}
95002象集 {2,3}
πCno(K)={1,3}
于是,πSno.Cno(SC)÷ K={95001}
Sno Cno
95001 1
95001 2
95001 3
95002 2
95002 3
综合举例 (续 )
[例 8] 查询选修了 2号课程的学生的学号 。
πSno( σCno='2'( SC))
= { 95001,95002}
综合举例 (续 )
[例 9] 查询至少选修了一门其直接先行课为 5
号课程的课程的学生姓名 。
πSname(σCpno='5'(Course SC Student))
或
πSname(σCpno='5'(Course) SC πSno,Sname(Student))
或
πSname (πSno (σCpno='5' (Course) SC) πSno,Sname (Student))
综合举例 (续 )
[例 10] 查询选修了全部课程的学生号码和姓名 。
πSno,Cno( SC) ÷ πCno( Course) πSno,Sname( Student)
两种题型:
给出具体数据库和关系代数表达式,求出结果。
给出数据库的关系模式和查询要求,要求写出关系代数表达式。
应用实例:
设教学数据库中有三个关系:
学生关系 S( S#,SNAME,AGE,SEX)
课程关系 C( C#,CNAME,TEACHER)
选课关系 SC( S#,C#,GRADE)
要求用关系表达式表达查询语句。
举例,
S
学号 姓名 性别 年龄
S# SNAME SEX AGE
95001 李勇 男 20
95002 刘晨 女 19
95003 王敏 女 18
95004 张立 男 19
选择(续)
C
课程号 课程名 教师
C# CNAME TEACHER
C1 数据库 张清玫
C2 数学 刘逸
C3 信息系统 丁宝康
C4 操作系统 孙钟秀
C5 数据结构 殷人昆
C6 数据处理 王珊
C7 PASCAL语言 施伯乐选择(续)
SC
学号 课程号 成绩
S# C# GRADE
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
(1)检索学习课程号为 C2的学生学号与成绩
∏S#,GRADE(σC#=‘C2’(SC))
先找出 学习课程号为 C2的学生
然后再列出其 学号与成绩
σC#=?C2‘(SC)
SC
学 号 课 程 号 成 绩
S# C# Grade
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
σC#=?C2‘(SC)
学 号 课 程 号 成 绩
S# C# Grade
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
∏S#,GRADE(σC#=‘C2’(SC))
学 号 成 绩
S# Grade
95001 85
95002 90
(2)检索学习课程号为 C2的学生学号与 姓名
此时的 课程 与 姓名 属性不在一张表内 S SC
后找出 学习课程号为 C2的学生
然后再列出其 学号与姓名
∏S#,SNAME(σC#=‘C2’(S SC))
σC#=?C2‘(S SC)
举例,
S# Snam
e
Ssex Sage Sdept
95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
S SC
学 号 课 程 号 成 绩
S# C# Grade
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
S SC
S# Sname Ssex Sage Sdept C# Grade
95001 李勇 男 20 CS C1 92
95001 李勇 男 20 CS C2 85
95001 李勇 男 20 CS C3 88
95002 刘晨 女 19 IS C2 90
95002 刘晨 女 19 IS C3 80
S# Sname Ssex Sage Sdept C# Grade
95001 李勇 男 20 CS C1 92
95001 李勇 男 20 CS C2 85
95001 李勇 男 20 CS C3 88
95002 刘晨 女 19 IS C2 90
95002 刘晨 女 19 IS C3 80
σC#=?C2‘(S SC)
∏S#,SNAME(σC#=‘C2’(S SC))
S# Sname Ssex Sage Sdept C# Grade
95001 李勇 男 20 CS C2 85
95002 刘晨 女 19 IS C2 90
S# Sname
95001 李勇
95002 刘晨学习 C2课程的学生学号与 姓名
(3)检索选修课程名为数学的学生学号与姓名
选修、课程名、姓名 ( S SC C)
选修课程名为数学的学生
最后 取出学生的学号与姓名
σCNAME=?数学’ (S SC C))
∏S#,SNAME(σCNAME=?数学’ (S SC C))
学号 课程号 成绩
S# C# GRADE
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
学号 姓名 性别 年龄
S# SNAME SEX AGE
95001 李勇 男 20
95002 刘晨 女 19
95003 王敏 女 18
95004 张立 男 19
课程号 课程名 教师
C# CNAME TEACHER
C1 数据库 张清玫
C2 数学 刘逸
C3 信息系统 丁宝康
C4 操作系统 孙钟秀
C5 数据结构 殷人昆
C6 数据处理 王珊
C7 PASCAL语言 施伯乐
检索选修课程名为数学的学生学号与姓名
S# Sna
me
Ssex Sage Sdep
t
C# Grade
95001 李勇 男 20 CS C1 92
95001 李勇 男 20 CS C2 85
95001 李勇 男 20 CS C3 88
95002 刘晨 女 19 IS C2 90
95002 刘晨 女 19 IS C3 80
S SC
课程号 课程名 教师
C# CNAME TEACHER
C1 数据库 张清玫
C2 数学 刘逸
C3 信息系统 丁宝康
C4 操作系统 孙钟秀
C5 数据结构 殷人昆
C6 数据处理 王珊
C7 PASCAL语言 施伯乐
C
S# Sname Ssex Sage Sdept C# Grade CNAME TEACHE
R
95001 李勇 男 20 CS C1 92 数据库 张清玫
95001 李勇 男 20 CS C2 85 数学 刘逸
95001 李勇 男 20 CS C3 88 信息系统 丁宝康
95002 刘晨 女 19 IS C2 90 数学 刘逸
95002 刘晨 女 19 IS C3 80 信息系统 丁宝康
S SC C
σCNAME=?数学’ (S SC C))
S# Sname Ssex Sage Sdept C# Grade CNAME TEACHE
R
95001 李勇 男 20 CS C1 92 数据库 张清玫
95001 李勇 男 20 CS C2 85 数学 刘逸
95001 李勇 男 20 CS C3 88 信息系统丁宝康
95002 刘晨 女 19 IS C2 90 数学 刘逸
95002 刘晨 女 19 IS C3 80 信息系统丁宝康
选修课程名为数学的学生
最后 取出学生的学号与姓名
∏S#,SNAME(σCNAME=?数学’ (S SC C))
(4)检索选修课程号为 C2或 C4的学生学号
只涉及到一个 表 SC
选修课程号为 C2或 C4的 学生
最后 取出学生的学号
σC#=?C2‘ ∨ C#=?C4‘(SC)
∏S#(σC#=?C2‘ ∨ C#=?C4‘(SC) )
学号 课程号 成绩
S# C# GRADE
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
选修课程号为 C2或 C4的 学生
σC#=?C2‘ ∨ C#=?C4‘(SC)
最后 取出学生的学号
∏S#(σC#=?C2‘ ∨ C#=?C4‘(SC) )
(5)检索至少选修课程号为 C2和 C3的学生学号学号 课程号 成绩
S# C# GRADE
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
方法 1
只涉及到一个 表,但不能直接用 ∧
学号 课程号 成绩
S# C# GRADE
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
SC
σC#=?C2‘ ∧ C#=?C3‘ (SC)
SC× SC
笛卡尔积 将 垂直 的条件展开为 水平 的条件。
学号 课程号 成绩 学号 课程号 成绩
S# C# GRADE S# C# GRADE
95001 C1 92 95001 C1 92
95001 C1 92 95001 C2 85
95001 C1 92 95001 C3 88
95001 C1 92 95002 C2 90
95001 C1 92 95002 C3 80
95001 C2 85 95001 C1 92
95001 C2 85 95001 C2 85
95001 C2 85 95001 C3 88
95001 C2 85 95002 C2 90
95001 C2 85 95002 C3 80
…
SC1 SC2
选修课程号为 C2和 C3的 学生
最后 取出学生的学号
σ1=4 ∧ 2=?C2‘ ∧ 5=?C3‘ (SC× SC)
∏1(σ1=4 ∧ 2=?C2‘ ∧ 5=?C3‘ (SC× SC) )
方法 2
至少 选修课程号为,C2‖和,C3‖的关系(表)
课程号 课程名 教师
C# CNAME TEACHER
C1 数据库 张清玫
C2 数学 刘逸
C3 信息系统 丁宝康
C4 操作系统 孙钟秀
C5 数据结构 殷人昆
C6 数据处理 王珊
C7 PASCAL语言 施伯乐
K= ∏C#(σC#=?C2‘ ∨ C#=?C3‘ (C) )
构造一个临时表
考虑用 除法 来做
C#
C2
C3
学号 课程号 成绩
S# C# GRADE
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
∏ S#,C#(SC)
C#
C2
C3
K
∏ S#,C#(SC) ÷ K
S#
95001
95002
(6)检索不学 C2课的学生姓名与年龄
首先考虑,差,的问题
先求出 全体学生 的姓名和年龄,
再求出 学了 C2课的学生的姓名和年龄,
最后执行两个集合的 差 操作。
全体学生的姓名和年龄 ∏ SNAME,AGE(S)
学了 C2课的学生的姓名和年龄-第二题
最后 求差
∏SNAME,AGE(σC#=‘C2’(S SC))
∏ SNAME,AGE(S) - ∏SNAME,AGE(σC#=?C2‘(S SC))
(7)检索学习全部课程的学生姓名
A、学生选课情况可用,∏S#,C#(SC)
学号 课程号 成绩
S# C# GRADE
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
B、全部课程,∏ C#(C)
课程号 课程名 教师
C# CNAME TEACHER
C1 数据库 张清玫
C2 数学 刘逸
C3 信息系统 丁宝康
C#
C1
C2
C3
C、学习全部课程的学生学号可用除法表示,
操作结果是学号 S#集。
∏S#,C#(SC) ÷ ∏C#(C)
S#
95001
D、从 S#求学生姓名 SNAME,可以用自然连接和投影操作组合而成:
∏SNAME( S ( ∏S#,C#(SC) ÷ ∏C#(C) ))
本例中只有一个学生的学号,好像可以从 S表中直接查询,其实不行,因为在其他的例子中可能不只一个学生,而是多个学生的学号,
仍然必须要做连接操作
( 8)检索所学课程包含学生 S3所学课程的学生学号
A、学生选课情况可用操作 ∏S#,C#(SC)
B、学生 S3所学课程可用操作
∏C#(σs#=‘ s3’( SC)
C、所学课程包含学生 S3所学课程的学生学号,用除法操作求得:
∏S#,C#(SC) ÷ ∏C#(σs#=‘ s3’( SC)
总结:
查询语句的关系表达式一般形式是:
∏…( σ…( R× S))或者
∏…( σ…( R S))
解释:首先涉及到的关系取来,执行笛卡尔积或自然连接操作得到一张大的表格,
然后对大表格执行水平分割(选择操作)
和垂直分割(投影操作)。
但是当查询涉及到否定或全部值时,上述形式就不能表达了,就要用到差操作或除操作。
作业
1,教材习题 5
2,设有三个关系,S( S#,SNAME,AGE,SEX),
SC(S#,C#,CNAME),C(C#,CNAME,TEACHER),试用关系代数表达式表示下列查询语句:
1)检索 LIU老师所授课程的课程号和课程名
2)检索年龄大于 23岁的男学生的学号和姓名
3)检索学号为 S3学生所学课程的课程名与任课教师名
4)检索至少选修 LIU老师所授课程中一门课的女学生姓名
5)检索 WANG同学不学的课程的课程号
6)检索至少选修两门课的学生学号
7)检索全部学生都选修的课程的课程号与课程名
8)检索选修课程包含 LIU老师所授全部课程的学生学号小结
关系代数运算
关系代数运算并,差,交,笛卡尔积,投影,选择,连接,除
基本运算并,差,笛卡尔积,投影,选择
交,连接,除可以用 5种基本运算来表达引进它们并不增加语言的能力,但可以简化表达小结 (续 )
关系代数表达式
关系代数运算经有限次复合后形成的式子
典型关系代数语言
ISBL( Information System Base Language)
由 IBM United Kingdom研究中心研制
用于 PRTV( Peterlee Relational Test Vehicle)
实验系统
( 2),检索不学 C2课的学生姓名,,决不能用下式表示:
πSNAME,AGE( σC#≠'C2'( S?SC))
一定要用,差,的形式:
πSNAME,AGE( S) - πSNAME,AGE( σC#='C2'( S?SC))
( 3),检索学习全部课程的学生学号,,要用
πS#,C#( SC) ÷ πC#( C) 表示,
而不能写成 πS# ( SC÷ πC#( C))形式。 这是因为一个学生学的课程的成绩可能是不一样的。
关系代数的几个扩充操作
改名,ρ s( R)
广义投影,∏S#,Grade*1.05(σC#=?C4‘(SC))
外连接( outer join)
A B C
a b c
b b f
c a d
R
B C D
b c d
b c e
a d b
e f g
S
A B C D
a b c d
a b c e
c a d b
A B C D
a b c d
a b c e
c a d b
b b f null
A B C D
a b c d
a b c e
c a d b
null e f g
SR
R RS S
A B C D
a b c d
a b c e
c a d b
b b f null
null e f g
SR
外部并( outer union)
A B C D
a b c null
b b f null
c a d null
null b c d
null b c e
null a d b
null e f g
第二章 关系数据库
2.1 关系模型概述
2.2 关系数据结构
2.3 关系的完整性
2.4 关系代数
2.5 关系演算
2.6 小结
2.5 关系演算
关系演算以数理 逻辑 中的谓词演算为基础
种类:按谓词变元不同分类
1.元组关系演算:
以 元组变量 作为谓词变元的基本对象元组关系演算语言 ALPHA
2.域关系演算:
以 域变量 作为谓词变元的基本对象域关系演算语言 QBE
在元组关系演算 ( Tuple Relational Calculus) 中,元组关系演算表达式简称为元组表达式,其一般形式为
{ t | P( t) }
其中,t是元组变量,表示一个元数固定的元组; P是公式,在数理逻辑中也称为谓词,也就是计算机语言中的条件表达式。
{ t | P( t) }表示:满足公式 P的所有元组 t的集合。
元组 关系演算元组关系演算 (4)
( a)、( b)是关系 R和 S,( c)~( g)分别是下面五个元组表达式的值
A B C A B C A B C A B C
1 2 3 1 2 3 3 4 6 4 5 6
4 5 6 3 4 6 5 6 9 7 8 9
7 8 9 5 6 9
( a )关系 R ( b )关系 S ( c ) R1 ( d ) R2
A B C A B C R.B S,C R.A
1 2 3 4 5 6 5 3 4
3 4 6 7 8 9 8 3 7
8 6 7
8 9 7
( e ) R3 ( f ) R4 ( g ) R5
元组关系演算的例子
R1 = { t | S( t) ∧ t[1]>2 }
R2 = { t | R( t) ∧┐ S( t) }
R3 = { t |(?u) ( S( t) ∧ R( u) ∧ t[3]<u[2]}}
R4 = { t |(?u) ( R( t) ∧ S( u) ∧ t[3]>u[1]) }
R5 = { t |(?u)(?v)( R
( u) ∧ S( v)
∧ u[1]>v[2]∧t[1]=u[2]∧t
[2]=v[3]∧t[3]=u[1] ) }
元组关系演算
关系代数表达式到元组表达式的转换例
R∪ S可用 { t | R( t) ∨ S( t) }表示;
R-S可用 { t | R( t) ∧┐ S( t) }表示;
R× S可用 { t |(?u) (?v) ( R( u) ∧ S(V) ∧ t[1]=u[1]
∧ t[2]=u[2]∧ t[3]=u[3]∧ t[4]=v[1] ∧ t[5]=v[2] ∧ t[6]=v[3]) }
表示 。
设 投影 操作是 π2,3( R),那么元组表达式可写成:
{ t |(?u)( R( u) ∧ t[l]=u[2]∧ t[2]=u[3]) }
选择 σF( R)可用 { t |R(t)∧ F'}表示,F'是 F的等价表示形式。譬如
σ2='d'( R)可写成 { t |( R( t) ∧ t[2]='d')。
2.5.1 元组关系演算语言 ALPHA
由 E.F.Codd提出
INGRES所用的 QUEL语言是参照 ALPHA语言研制的
语句检索语句
GET
更新语句
PUT,HOLD,UPDATE,DELETE,DROP
一、检索操作
语句格式:
GET 工作空间名 [( 定额 ) ]( 表达式 1)
[,操作条件 ] [DOWN/UP 表达式 2]
定额:规定检索的元组个数
格式,数字表达式 1:指定语句的操作对象
格式:
关系名 | 关系名,属性名 | 元组变量,属性名 | 集函数 [,… ]
操作条件:将操作结果限定在满足条件的元组中
格式,逻辑表达式表达式 2:指定排序方式
格式,关系名,属性名 | 元组变量,属性名 [,… ]
检索操作 (续 )
(1) 简单检索 (即不带条件的检索 )
(2) 限定的检索 (即带条件的检索 )
(3) 带排序的检索
(4) 带定额的检索
(5) 用元组变量的检索
(6) 用存在量词的检索检索操作 (续 )
(7) 带有多个关系的表达式的检索
(8) 用全称量词的检索
(9) 用两种量词的检索
(10) 用蕴函 ( Implication) 的检索
(11) 集函数
( 1)简单检索
GET 工作空间名 ( 表达式 1)
[例 1] 查询所有被选修的课程号码 。
GET W (SC.Cno)
[例 2] 查询所有学生的数据 。
GET W (Student)
( 2)限定的检索格式
GET 工作空间名 ( 表达式 1),操作条件
[例 3] 查询信息系 (IS)中年龄小于 20岁的学生的学号和年龄 。
GET W (Student.Sno,Student.Sage):
Student.Sdept='IS'∧ Student.Sage<20
( 3)带排序的检索格式
GET 工作空间名 ( 表达式 1) [,操作条件 ]
DOWN/UP 表达式 2
[例 4] 查询计算机科学系 (CS)学生的学号,年龄,结果按年龄降序排序 。
GET W (Student.Sno,Student.Sage):
Student.Sdept='CS?DOWN Student.Sage
( 4)带定额的检索格式,GET 工作空间名 ( 定额 ) ( 表达式 1)
[,操作条件 ] [DOWN/UP 表达式 2]
[例 5] 取出一个信息系学生的学号。
GET W (1) (Student.Sno):
Student.Sdept='IS'
[例 6] 查询信息系年龄最大的三个学生的学号及其年龄,结果按年龄降序排序。
GET W (3) (Student.Sno,Student.Sage):
Student.Sdept='IS' DOWN Student.Sage
( 5)用 元组变量 的检索
元组变量的含义
表示可以在某一关系范围内变化 ( 也称为范围变量 Range Variable)
元组变量的用途
① 简化关系名:设一个较短名字的元组变量来代替较长的关系名 。
② 操作条件中使用 量词 时 必须 用元组变量 。
定义元组变量
格式,RANGE 关系名 变量名
一个关系可以设多个元组变量
(6) 用 存在量词 的检索
[例 8] 查询选修 2号课程的学生名字 。
RANGE SC X
GET W (Student.Sname),
X(X.Sno=Student.Sno∧ X.Cno='2')
[例 9] 查询选修了这样课程的学生学号,其直接先行课是 6号课程 。
RANGE Course CX
GET W (SC.Sno),
CX (CX.Cno=SC.Cno∧ CX.Pcno='6')
用存在量词的检索 (续 )
[例 10]查询至少选修一门其先行课为 6号课程的学生名字
RANGE Course CX
SC SCX
GET W (Student.Sname),?SCX
(SCX.Sno=Student.Sno∧
CX
(CX.Cno=SCX.Cno∧ CX.Pcno='6'))
前束范式形式:
GET W (Student.Sname),
SCX?CX (SCX.Sno=Student.Sno∧
CX.Cno=SCX.Cno∧ CX.Pcno='6')
( 7)带有多个关系的表达式的检索
[例 11] 查询成绩为 90分以上的学生名字与课程名字 。
RANGE SC SCX
GET W(Student.Sname,Course.Cname):
SCX (SCX.Grade≥90∧
SCX.Sno=Student.Sno∧
Course.Cno=SCX.Cno)
( 8)用全称量词的检索
[例 12] 查询不选 1号课程的学生名字 。
RANGE SC SCX
GET W (Student.Sname),SCX
(SCX.Sno≠Student.Sno∨ SCX.Cno≠'1')
用存在量词表示:
RANGE SC SCX
GET W (Student.Sname),SCX
(SCX.Sno=Student.Sno∧ SCX.Cno='1')
( 9)用两种量词的检索
[例 13] 查询选修了全部课程的学生姓名 。
RANGE Course CX
SC SCX
GET W (Student.Sname):
CX?SCX
(SCX.Sno=Student.Sno∧
SCX.Cno=CX.Cno)
( 10)用蕴函( Implication)的检索
[例 14] 查询最少选修了 95002学生所选课程的学生学号 。
RANGE Couse CX
SC SCX
SC SCY
GET W (Student.Sno),CX(?SCX
(SCX.Sno='95002'∧ SCX.Cno=CX.Cno)
SCY(SCY.Sno=Student.Sno∧
SCY.Cno= CX.Cno))
( 11)集函数常用集函数( Aggregation function)或内部函数( Build-in function)
函 数 名 功 能
COUNT 对元组计数
TOTAL 求 总 和
MAX 求最大值
MIN 求最小值
AVG 求平均值集函数 (续 )
[例 15] 查询学生所在系的数目 。
GET W ( COUNT(Student.Sdept) )
COUNT函数在计数时会自动排除重复值 。
[例 16] 查询信息系学生的平均年龄
GET W (AVG(Student.Sage),
Student.Sdept='IS‘ )
二、更新操作
(1) 修改操作
(2) 插入操作
(3) 删除操作
( 1)修改操作 步骤
① 用 HOLD语句将要修改的元组从数据库中读到工作空间中
HOLD 工作空间名 ( 表达式 1) [,操作条件 ]
HOLD语句是带上并发控制的 GET语句
② 用宿主语言修改工作空间中元组的属性
③ 用 UPDATE语句将修改后的元组送回数据库中
UPDATE 工作空间名修改操作 (续 )
[例 17] 把 95007学生从计算机科学系转到信息系 。
HOLD W (Student.Sno,Student.Sdetp):
Student.Sno='95007'
( 从 Student关系中读出 95007学生的数据 )
MOVE 'IS' TO W.Sdept
( 用宿主语言进行修改 )
UPDATE W
( 把修改后的元组送回 Student关系 )
( 2)插入操作步骤
① 用宿主语言在工作空间中建立新元组
② 用 PUT语句把该元组存入指定关系中
PUT 工作空间名 ( 关系名 )
PUT语句只对一个关系操作插入操作 (续 )
[例 18] 学校新开设了一门 2学分的课程,计算机组织与结构,,其课程号为 8,直接先行课为 6
号课程 。 插入该课程元组
MOVE '8' TO W.Cno
MOVE '计算机组织与结构 ' TO W.Cname
MOVE '6' TO W.Cpno
MOVE '2' TO W.Ccredit
PUT W (Course)
( 3)删除操作
① 用 HOLD语句把要删除的元组从数据库中读到工作空间中
② 用 DELETE语句删除该元组
DELETE 工作空间名删除操作 (续 )
[例 19] 95110学生因故退学,删除该学生元组 。
HOLD W (Student),Student.Sno='95110'
DELETE W
删除操作 (续 )
[例 20] 将学号 95001改为 95102。
HOLD W (Student),Student.Sno='95001'
DELETE W
MOVE '95102' TO W.Sno
MOVE '李勇 ' TO W.Sname
MOVE '男 ' O W.Ssex
MOVE '20' TO W.Sage
MOVE 'CS' TO W.Sdept
PUT W (Student)
删除操作 (续 )
[例 21] 删除全部学生 。
HOLD W (SC)
DELETE W
HOLD W (Student)
DELETE W
在删除操作中保持参照完整性小结:元组关系演算语言 ALPHA
检索操作 GET
GET 工作空间名 [( 定额 ) ]( 表达式 1)
[,操作条件 ] [DOWN/UP 表达式 2]
插入操作
建立新元组 --PUT
修改操作
HOLD--修改 --UPDATE
删除操作
HOLD--DELETE
2.5 关 系 演 算
2.5.1 元组关系演算语言 ALPHA
2.5.2 域关系演算语言 QBE
域关系演算 (1)
域演算表达式是形为
{ t1… tk∣P ( t1,…,tk)}
的表达式,其中 P( t1,…,tk) 是关于自由域变量 t1,…,tk 的公式 。
原子公式有两种形式:
⑴ R( x1… xk) ;
⑵ xθ y。
公式中也可使用 ∧,∨,┐ 和?等逻辑运算符,(?x)和 (?x),但变量 x是域变量,不是元组变量 。
域关系演算 (2)
例 2.20 图 2.21的 ( a),( b),( c) 是三个关系 R,S,W,
( d),( e),( f) 分别表示下面三个域表达式的值 。
( a) 关系 R ( b) 关系 S ( c) 关系 W ( d) R1 ( e) R2 ( f) R3
图 2.21 域关系演算的例子
A B C A B C D E A B C A B C B D A
1 2 3 1 2 3 7 5 4 5 6 1 2 3 5 7 4
4 5 6 3 4 6 4 8 4 5 6 8 7 7
7 8 9 5 6 9 7 8 9 8 4 7
3 4 6
R1={ xyz| R( xyz) ∧ x<5 ∧ y>3 }
R2={ xyz| R( xyz) ∨ ( S( xyz) ∧ y = 4)
}
R3={ xyz|(?u)(?v)( R( zxu) ∧ w( yv
) ∧ u>v ) }
2.5.2 域关系演算语言 QBE
一种典型的域关系演算 语言
由 M.M.Zloof提出
1978年在 IBM370上得以实现
QBE也指 此关系数据库管理 系统
QBE,Query By Example
基于屏幕表格的查询语言
查询要求:以填写表格的方式构造查询
用示例元素 (域变量 )来表示查询结果可能的情况
查询结果:以表格形式显示
QBE操作框架关系名 属性名操作命令 元组属性值或查询条件或操作命令一、检索操作
( 1) 用户提出要求;
( 2) 屏幕显示空白表格;
( 3) 用户在最左边一栏输入要查询的关系名,
例如 Student;
Student
检索操作(续)
( 4)系统显示该关系的属性名
( 5)用户在上面构造查询要求
Student Sno Sname Ssex Sage Sdept
P,T C
Student Sno Sname Ssex Sage Sdept
检索操作(续)
( 6)屏幕显示查询结果
Student Sno Sname Ssex Sage Sdept
李勇张立
C
构造查询的几个要素
示例元素 即域变量 一定要加下划线示例元素是这个域中可能的一个值,它不必是查询结果中的元素
打印操作符 P,指定查询结果所含属性列
查询条件 不用加下划线可使用比较运算符>,≥,<,≤,=和 ≠
其中=可以省略
排序要求
1,简单查询
[例 1] 查询全体学生的全部数据 。
Student Sno Sname Ssex Sage Sdept
P.95001 P,李勇 P.男 P.20 P.CS
简单查询(续)
显示全部数据也可以简单地把 P.操作符作用在关系名上 。
Student Sno Sname Ssex Sage Sdept
P.
2,条件查询
(1) 简单条件
[例 2] 求信息系全体学生的姓名 。
Student Sno Sname Ssex Sage Sdept
P,李勇 IS
条件查询(续)
[例 3] 求年龄大于 19岁的学生的学号 。
Student Sno Sname Ssex Sage Sdept
P.95001 >19
条件查询(与条件)
[例 4] 求计算机科学系年龄大于 19岁的学生的学号 。
方法 ( 1),把两个条件写在同一行上
Student Sno Sname Ssex Sage Sdept
P.95001 >19 CS
条件查询(续)
方法 ( 2),把两个条件写在不同行上,但使用相同的示例元素值
Student Sno Sname Ssex Sage Sdept
P.95001
P.95001 >19
CS
条件查询(续)
[例 5] 查询既选修了 1号课程又选修了 2号课程的学生的学号 。
SC Sno Cno Grade
P.95001
P.95001
1
2
条件查询(续)
[例 6] 查询计算机科学系或者年龄大于 19岁的学生的学号 。
Student Sno Sname Ssex Sage Sdept
P.95001
P.95002 >19
CS
多表连接
[例 7] 查询选修 1号课程的学生姓名 。
注意:示例元素 Sno是连接属性,其值在两个表中要 相同 。
SC Sno Cno Grade
95001 1
Student Sno Sname Ssex Sage Sdept
95001 P.李勇条件查询(非条件)
[例 8] 查询未选修 1号课程的学生姓名思路:显示学号为 95001的学生名字,而该学生选修 1
号课程的情况为假
SC Sno Cno Grade
95001 1?
Student Sno Sname Ssex Sage Sdept
95001 P.李勇条件查询(续)
[例 9] 查询有两个人以上选修的课程号思路:查询这样的课程 1,它不仅被 95001选修而且也被另一个学生 (?95001) 选修了
SC Sno Cno Grade
95001
.95001
P.1
1
3,集函数常用集函数:
函 数 名 功 能
CNT 对元组计数
SUM 求 总 和
AVG 求平均值
MAX 求最大值
MIN 求最小值集函数(续)
[例 10] 查询信息系学生的平均年龄 。
Student Sno Sname Ssex Sage Sdept
P.AVG.ALL,IS
4.对查询结果排序 (续)
[例 11] 查全体男生的姓名,要求查询结果按所在系升序排序,对相同系的学生按年龄降序排序 。
Student Sno Sname Ssex Sage Sdept
P.李勇 男 DO( 2),AO( 1),
二、修改操作
[例 12] 把 95001学生的年龄改为 18岁 。
方法 (1),将操作符,U.‖放在值上
Student Sno Sname Ssex Sage Sdept
95001 U,18
修改操作 (续 )
方法 (2),将操作符,U.‖放在关系上码 95001标明要修改的元组 。,U.‖标明所在的行是修改后的新值 。
由于主码是不能修改的,所以系统不会混淆要修改的属性 。
Student Sno Sname Ssex Sage Sdept
U,95001 18
修改操作 (续 )
[例 13]将计算机系所有学生的年龄都改为 18岁
Student Sno Sname Ssex Sage Sdept
95008 U.18 CS
修改操作 (续 )
[例 14] 把 95001学生的年龄增加 1岁分两行分别表示改前和改后的示例元素必须将操作符,U.‖放在关系上
Student Sno Sname Ssex Sage Sdept
U.
95001
95001
17
17+1
修改操作 (续 )
[例 15] 将计算机系所有学生的年龄都增加 1岁
Student Sno Sname Ssex Sage Sdept
U.
95008
95008
18
18+1
CS
2.插入操作
[例 16] 把信息系女生 95701,姓名张三,年龄 17
岁存入数据库中 。
Student Sno Sname Ssex Sage Sdept
I,95701 张三 女 17 IS
3,删除操作
[例 17] 删除学生 95089
为保证参照完整性,删除 95089学生前,先删除 95089学生选修的全部课程
Student Sno Sname Ssex Sage Sdept
D,95089
SC Sno Cno Grade
D,95089
本章小结
2.1 关系模型概述
2.2 关系数据结构
2.3 关系的完整性
2.4 关系代数
2.5 关系演算
2.6 小结数据库系统概论
An Introduction to Database System
第三章 关系数据库标准语言 SQL
第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7 嵌入式 SQL
3.8 小结
SQL的产生与发展
1970年,美国 IBM研究中心的 E.F.Codd连续发表多篇论文,提出关系模型。
1972年,IBM公司开始研制实验型关系数据库管理系统 SYSTEM R,配制的查询语言称为 SQUARE
(Specifying Queries As Relational Expression )语言,在语言中使用了较多的数学符号。
1974年,Boyce和 Chamberlin把 SQUARE修改为
SEQUEL (Structured English QUEry Language )语言。
后来 SEQUEL简称为 SQL (Structured Query Language ),
即,结构式查询语言,,SQL的发音仍为,sequel‖。
现在 SQL已经成为一个标准 。
SQL数据库的体系结构用户 1 用户 2 用户 3 用户 4
视图 1 视图 1
基本表 1 基本表 2 基本表 3 基本表 4
存储文件 1 存储文件 2 存储文件 3 存储文件 4
图 3.1 SQL数据库的体系结构
SQL用户
View
Base
table
Stored
file
3.1 SQL概述
SQL的特点
1,综合统一
2,高度非过程化
3,面向集合的操作方式
4,以同一种语法结构提供两种使用方法
5,语言简洁,易学易用
1,综合统一,
SQL语言综合:数据定义语言 DDL、数据操纵语言 DML、数据控制语言 DCL
2、高度非过程化
,怎么做,
,做什么,
减轻了用户的负担,有利于提高数据独立性
3、面向集合的操作方式
非关系数据模型:面向记录
SQL:集合操作
4、以同一种语法结构提供两种使用方式
既可 联机交互 操作,
也可以嵌入到 高级语言 中去
5,语言简捷,易学易用表 3,1 S Q L 语言的动词
S Q L 功 能 动 词数 据 定 义 C R E A T E,D R O P,A L T E R
数 据 查 询 S E L E C T
数 据 操 纵 I N S E R T,U P D A T E
D E L E T E
数 据 控 制 G R A N T,R E V O K E
第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7 嵌入式 SQL
3.8 小结
SQL模式(数据库)的创建和撤销
SQL模式的创建可用 CREATE SCHEMA语句定义,其基本句法如下:
CREATE SCHEMA〈 模式名 〉
AUTHORIZATION〈 用户名 〉
删除,DROP语句的句法如下:
DROP SCHEMA〈 模式名 〉
[ CASCADE│RESTRICT]
其方式有两种:
CASCADE (级联式 )方式 。
RESTRICT (约束式 )方式。
3.2 数 据 定 义表 3,2 S Q L 的数据定义语句操 作 方 式操 作 对象创 建 删 除 修 改表 C R E A T E
T A B L E
D R O P
T A B L E
A L T E R
T A B L E
视 图 C R E A T E
V I E W
D R O P V I E W
索 引 C R E A T E
I N D E X
D R O P
I N D E X
3.2.1 定义 语句格式
CREATE TABLE <表名 >
( <列名 > <数据类型 >[ <列级完整性约束条件 > ]
[,<列名 > <数据类型 >[ <列级完整性约束条件 >] ] …
[,<表级完整性约束条件 > ] ) ;
<表名 >:所要定义的基本表的名字
<列名 >:组成该表的各个属性 ( 列 )
<列级完整性约束条件 >:涉及相应属性列的完整性约束条件
<表级完整性约束条件 >:涉及一个或多个属性列的完整性约束条件例题
[例 1] 建立一个,学生,表 Student,它由学号
Sno,姓名 Sname,性别 Ssex,年龄 Sage,所在系 Sdept五个属性组成 。 其中学号不能为空,
值是唯一的,并且姓名取值也唯一 。
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE,
Sname CHAR(20) UNIQUE,
Ssex CHAR(1),
Sage INT,
Sdept CHAR(15));
例题 (续)
Sno S n a m e S s e x S a g e S d e p t
↑ ↑ ↑ ↑ ↑
字符型 字符型 字符型 整数 字符型长度为 5 长度为 20 长度为 1 长度为 15
不能为空值定义基本表(续)
常用完整性约束
主码约束,PRIMARY KEY
唯一性约束,UNIQUE
非空值约束,NOT NULL
参照完整性约束,FOREIGN KEY
PRIMARY KEY与 UNIQUE的区别?
Primary key在建立的时候会默认地建立此 field的索引,且此 primary key可以作为作为另外的表的 foreign key,
再者 primary key跟 unique得 区别 是
Primary key 一定是 not null,而
unique则没有此限制
[例 2] 建立一个,课程,表 C,它由课程号 Cno,课程名称 Cname,教师 Teacher
组成,其中 Cno为主码。
CREATE TABLE C(
Cno CHAR(5),
Cname CHAR(10),
Teacher CHAR(10),
Primary key (Cno));
例题 (续)
[例 3] 建立一个,学生选课,表 SC,它由学号
Sno、课程号 Cno,修课成绩 Grade组成,其中
(Sno,Cno)为主码。
CREATE TABLE SC(
Sno CHAR(5),
Cno CHAR(3),
Grade int,
Primary key (Sno,Cno),
FOREIGN KEY(Sno) REFERENCES S(Sno),
FOREIGN KEY(Cno) REFERENCES C(Cno)
);
基本数据类型
(1)数值型( DB2)
SMALLINT 半字长二进制整数
INTEGER 全字长二进制整数
DECIMAL(P[,q])或者 DEC( p[,q])
压缩十进制数,共 p位,其中小数点后 q位
FLOAT 双字长浮点数
( 2)字符串型
CHARTER(n)或 CHAR(n)
VARCHAR(n)
(3)时间型
DATE
TIME
(4)位串型
BIT( n)
回顾
CREATE TABLE <表名 >
( <列名 > <数据类型 >[ <列级完整性约束条件 > ]
[,<列名 > <数据类型 >[ <列级完整性约束条件 >] ] …
[,<表级完整性约束条件 > ] ) ;
<表名 >:所要定义的基本表的名字
<列名 >:组成该表的各个属性 ( 列 )
<列级完整性约束条件 >:涉及相应属性列的完整性约束条件
<表级完整性约束条件 >:涉及一个或多个属性列的完整性约束条件表 3,2 S Q L 的数据定义语句操 作 方 式操 作 对象创 建 删 除 修 改表 C R E A T E
T A B L E
D R O P
T A B L E
A L T E R
T A B L E
视 图 C R E A T E
V I E W
D R O P V I E W
索 引 C R E A T E
I N D E X
D R O P
I N D E X
二、修改基本表
ALTER TABLE <表名 >
[ ADD <新列名 > <数据类型 > [ 完整性约束 ] ]
[ DROP <完整性约束名 > ]
[ MODIFY <列名 > <数据类型 > ];
<表名 >,要修改的基本表
ADD子句,增加新列和新的完整性约束条件
DROP子句,删除指定的完整性约束条件
MODIFY子句,用于修改列名和数据类型例题
[例 2] 向 Student表增加,入学时间,列,其数据类型为日期型 。
ALTER TABLE Student ADD Scome DATE;
不论基本表中原来是否已有数据,新增加的列一律为空值 。
[例 3] 将年龄的数据类型改为半字长整数。
ALTER TABLE Student MODIFY Sage SMALLINT;
注:修改原有的列定义有可能会破坏已有数据例题
[例 4] 删除学生姓名必须取唯一值的约束 。
ALTER TABLE Student DROP UNIQUE(Sname);
语句格式(续)
删除属性列直接 /间接删除
把表中要保留的列及其内容复制到一个新表中
删除原表
再将新表重命名为原表名直接删除属性列,(新 )
例,ALTER TABLE Student Drop Scome;
ALTER TABLE Student Drop COLUMN Sdept ;(sql server)
3.2 数 据 定 义表 3,2 S Q L 的数据定义语句操 作 方 式操 作 对象创 建 删 除 修 改表 C R E A T E
T A B L E
D R O P
T A B L E
A L T E R
T A B L E
视 图 C R E A T E
V I E W
D R O P V I E W
索 引 C R E A T E
I N D E X
D R O P
I N D E X
三、删除基本表
DROP TABLE <表名 >;
基本表删除后,数据,表上的视图,索引都删除 。
有的系统如 ORACLE,基本表删除后,在表上的视图往往仍然保留,但无法引用 。
例题
[例 5] 删除 Student表
DROP TABLE Student ;
3.2.2 建立与删除索引
建立索引是加快查询速度的有效手段
建立索引
DBA或表的属主 ( 即建立表的人 ) 根据需要建立
有些 DBMS自动建立以下列上的索引
PRIMARY KEY
UNIQUE
维护索引
DBMS自动完成
使用索引
DBMS自动选择是否使用索引以及使用哪些索引
在 SQL86和 SQL89标准中,基本表没有关键码概念,可以用 索引 机制来弥补。
索引属于物理存储的路径概念,而不是逻辑的概念。
在定义基本表时,还要定义索引,就把数据库的物理结构和逻辑结构混在一块了。
因此在 SQL2中引入了主码(主键)的概念,用户在创建基本表时用主码子句
Primary key直接定义主码。
但至今大多数 DBMS仍使用索引机制,有索引创建和撤销语句,其功能仅限于查询时起作用。
一、建立索引
语句格式
CREATE [UNIQUE] [CLUSTER] INDEX <索引名 > ON
<表名 >(<列名 >[<次序 >][,<列名 >[<次序 >] ]…);
用 <表名 >指定要建索引的基本表名字
索引可以建立在该表的一 列 或多列上,各列名之间用逗号分隔
用 <次序 >指定索引值的排列次序,升序,ASC,降序:
DESC。 缺省值,ASC
UNIQUE表明此索引的每一个索引值只对应唯一的数据记录
CLUSTER表示要建立的索引是聚簇索引
CREATE [UNIQUE] [CLUSTER]
INDEX <索引名 >
ON <表名 >
(<列名 >[<次序 >]
[,<列名 >[<次序 >] ]…);
例题
[例 6] 为学生 -课程数据库中的 Student,Course,SC
三个表建立索引 。 其中 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);
建立索引 (续)
唯一值索引
对于已含重复值的属性列不能建 UNIQUE索引
对某个列建立 UNIQUE索引后,插入新记录时
DBMS会自动检查新记录在该列上是否取了重复值 。 这相当于增加了一个 UNIQUE约束建立索引 (续)
聚簇索引
建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放 。 也即聚簇索引的索引项顺序与表中记录的物理顺序一致例:
CREATE CLUSTER INDEX Stusname ON
Student(Sname);
在 Student表的 Sname( 姓名 ) 列上建立一个聚簇索引,而且 Student表中的记录将按照 Sname值的升序存放建立索引 (续)
在一个基本表上最多只能建立一个聚簇索引
聚簇索引的用途:对于某些类型的查询,可以提高查询效率
聚簇索引的适用范围
很少对基表进行增删操作
很少对其中的变长列进行修改操作二、删除索引
DROP INDEX <索引名 >;
删除索引时,系统会从数据字典中删去有关该索引的描述。
[例 7] 删除 Student表的 Stusname索引。
DROP INDEX Stusname;
索引一经建立,就由系统来维护它,不需要用户干预。建立索引减少查询操作的时间,但如果数据增加删改频繁,系统会花费许多时间来维护索引。所以,这时需要删除一些不必要的索引。
3.3 查 询
3.3.1 概述
3.3.2 单表查询
3.3.3 连接查询
3.3.4 嵌套查询
3.3.5 集合查询
3.3.6 小结
3.3.1 概述
语句格式
SELECT [ALL|DISTINCT] <目标列表达式 >
[,<目标列表达式
>] …
FROM <表名或视图名 >[,<表名或视图名 > ] …
[ WHERE <条件表达式 > ]
[ GROUP BY <列名 1> [ HAVING <条件表达式 > ] ]
[ ORDER BY <列名 2> [ ASC|DESC ] ];
语句格式
SELECT子句,指定要显示的属性列
FROM子句,指定查询对象 (基本表或视图 )
WHERE子句,指定查询条件
GROUP BY子句,对查询结果按指定列的值分组,
该属性列值相等的元组为一个组 。 通常会在每组中作用集函数 。
HAVING短语,筛选出只有满足指定条件的组
ORDER BY子句,对查询结果表按指定列值的升序或降序排序
SELECT查询语句 (1)
SELECT—FROM—WHERE句型在关系代数中最常用的式子是下列表达式:
πA1,…,An(σF(R1× … × Rm))
这里 R1,…,Rm为关系,F是公式,A1,…,An为属性 。
针对上述表达式,SQL为此设计了 SELECT—FROM—
WHERE句型:
SELECT A1,…,An
FROM R1,…,Rm
WHERE F
这个句型是从关系代数表达式演变来的,但 WHERE子句中的条件表达式 F要比关系代数中公式更灵活 。
示例数据库学生 -课程数据库
学生表,Student(Sno,Sname,Ssex,Sage,Sdept)
课程表,Course(Cno,Cname,Cpno,Ccredit)
学生选课表,SC(Sno,Cno,Grade)
5,语言简捷,易学易用表 3,1 S Q L 语言的动词
S Q L 功 能 动 词数 据 定 义 C R E A T E,D R O P,A L T E R
数 据 查 询 S E L E C T
数 据 操 纵 I N S E R T,U P D A T E
D E L E T E
数 据 控 制 G R A N T,R E V O K E
3.3 查 询
3.3.1 概述
3.3.2 单表查询
3.3.3 连接查询
3.3.4 嵌套查询
3.3.5 集合查询
3.3.6 小结
SELECT查询语句 (1)
SELECT—FROM—WHERE句型在关系代数中最常用的式子是下列表达式:
πA1,…,An(σF(R1× … × Rm))
这里 R1,…,Rm为关系,F是公式,A1,…,An为属性 。
针对上述表达式,SQL为此设计了 SELECT—FROM—
WHERE句型:
SELECT A1,…,An
FROM R1,…,Rm
WHERE F
这个句型是从关系代数表达式演变来的,但 WHERE子句中的条件表达式 F要比关系代数中公式更灵活 。
SELECT语句完整的句法 (1)
语句格式
SELECT [ALL|DISTINCT] <目标列表达式 >
[,<目标列表达式 >] …
FROM <表名或视图名 >[,<表名或视图名 > ] …
[ WHERE <条件表达式 > ]
[ GROUP BY <列名 1> [ HAVING <条件表达式 > ] ]
[ ORDER BY <列名 2> [ ASC|DESC ] ];
语句格式
SELECT子句,指定要显示的属性列
FROM子句,指定查询对象 (基本表或视图 )
WHERE子句,指定查询条件
GROUP BY子句,对查询结果按指定列的值分组,
该属性列值相等的元组为一个组 。 通常会在每组中作用集函数 。
HAVING短语,筛选出只有满足指定条件的组
ORDER BY子句,对查询结果表按指定列值的升序或降序排序示例数据库学生 -课程数据库
学生表,Student(Sno,Sname,Ssex,Sage,Sdept)
课程表,Course(Cno,Cname,Cpno,Ccredit)
学生选课表,SC(Sno,Cno,Grade)
3.3.2 单表查询查询仅涉及一个表,是一种最简单的查询操作一,选择表中的若干列二,选择表中的若干元组三,对查询结果排序四,使用集函数五、对查询结果分组
SELECT语句完整的句法
语句格式
SELECT [ALL|DISTINCT] <目标列表达式 >
[,<目标列表达式 >] …
FROM <表名或视图名 >[,<表名或视图名 > ] …
[ WHERE <条件表达式 > ]
[ GROUP BY <列名 1> [ HAVING <条件表达式 > ] ]
[ ORDER BY <列名 2> [ ASC|DESC ] ];
查询指定列
[例 1] 查询全体学生的学号与姓名 。
SELECT Sno,Sname
FROM Student;
[例 2] 查询全体学生的姓名,学号,所在系 。
SELECT Sname,Sno,Sdept
FROM Student;
查询全部列
[例 3] 查询全体学生的详细记录 。
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
或
SELECT *
FROM Student;
3,查询经过计算的值
SELECT子句的 <目标列表达式 >为表达式
算术表达式
字符串常量
函数,
列别名
等
3,查询经过计算的值
[例 4] 查全体学生的姓名及其出生年份 。
SELECT Sname,2000-Sage
FROM Student;
输出结果:
Sname 2000-Sage
--------- -------------
李勇 1976
刘晨 1977
王名 1978
张立 1978
3,查询经过计算的值
[例 5] 查询全体学生的姓名,出生年份和所有系,要求用小写字母表示所有系名 。
SELECT Sname,'Year of Birth,',2000-Sage,
ISLOWER(Sdept)
FROM Student;
例题(续)
输出结果:
Sname 'Year of Birth:' 2000-Sage ISLOWER(Sdept)
------- ---------------- --------- --------------
李勇 Year of Birth,1976 cs
刘晨 Year of Birth,1977 is
王名 Year of Birth,1978 ma
张立 Year of Birth,1977 is
[例 5.1] 使用列 别名 改变查询结果的列标题
SELECT Sname NAME,'Year of Birth,’ BIRTH,
2000-Sage BIRTHDAY,ISLOWER(Sdept) DEPARTMENT
FROM Student;
输出结果:
NAME BIRTH BIRTHDAY DEPARTMENT------- ---------------- ------------- ------------------
李勇 Year of Birth,1976 cs
刘晨 Year of Birth,1977 is
王名 Year of Birth,1978 ma
张立 Year of Birth,1977 is
二、选择表中的若干元组 –投影
消除取值重复的行
查询满足条件的元组
1,消除取值重复的行
在 SELECT子句中使用 DISTINCT短语假设 SC表中有下列数据
Sno Cno Grade
------- ------- -------
95001 1 92
95001 2 85
95001 3 88
95002 2 90
95002 3 80
ALL 与 DISTINCT
[例 6] 查询选修了课程的学生学号 。
(1) SELECT Sno
FROM SC;
或 (默认 ALL)
SELECT ALL Sno
FROM SC;
结果,Sno
-------
95001
95001
95001
95002
95002
例题(续)
(2) SELECT DISTINCT Sno
FROM SC;
结果:
Sno
-------
95001
95002
例题(续)
注意 DISTINCT短语的作用范围是所有目标列例:查询选修课程的各种成绩错误的写法
SELECT DISTINCT Cno,DISTINCT Grade
FROM SC;
正确的写法
SELECT DISTINCT Cno,Grade
FROM SC;
2.查询满足条件的元组表 3.3 常用的查询条件查 询 条 件 谓 词比 较
=,>,<,>=,<=,!=,<>,!>,!< ;
N O T + 上述比较运算符确定范围 B E T W E E N A N D,N O T B E T W E E N A N D
确定集合 IN,N O T I N
字符匹配 L I K E,N O T L I K E
空 值 I S N U L L,I S N O T N U L L
多重条件 AND,OR
WHERE子句常用的查询条件
(1) 比较大小在 WHERE子句的 <比较条件 >中使用比较运算符
=,>,<,>=,<=,!= 或 <>,!>,!<,
逻辑运算符 NOT + 比较运算符
[例 8] 查询所有年龄在 20岁以下的学生姓名及其年龄。
SELECT Sname,Sage
FROM Student
WHERE Sage < 20; 或
SELECT Sname,Sage
FROM Student
WHERE NOT Sage >= 20;
(2) 确定范围
使用谓词 BETWEEN … AND …
NOT BETWEEN … AND …
[例 10] 查询年龄在 20~23岁(包括 20岁和 23岁)之间的学生的姓名、系别和年龄 。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
例题(续)
[例 11] 查询年龄不在 20~23岁之间的学生姓名,
系别和年龄 。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
(3) 确定集合使用谓词 IN <值表 >,NOT IN <值表 >
<值表 >,用逗号分隔的一组取值
[例 12]查询信息系( IS)、数学系( MA)和计算机科学系( CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( 'IS','MA','CS' );
(3) 确定集合
[例 13]查询既不是信息系,数学系,也不是计算机科学系的学生的姓名和性别 。
SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN ( 'IS','MA','CS' );
(4) 字符串匹配
[NOT] LIKE?<匹配串 >‘ [ESCAPE? <换码字符 >‘]
<匹配串 >:指定匹配模板匹配模板:固定字符串或含通配符的字符串当匹配模板为固定字符串时,
可以用 = 运算符取代 LIKE 谓词用 != 或 < >运算符取代 NOT LIKE 谓词通配符
% (百分号 ) 代表任意长度(长度可以为 0)的字符串
例,a%b表示以 a开头,以 b结尾的任意长度的字符串。如 acb,addgb,ab 等都满足该匹配串
_ (下横线 ) 代表任意单个字符
例,a_b表示以 a开头,以 b结尾的长度为 3的任意字符串。如 acb,afb等都满足该匹配串
ESCAPE 短语:
当用户要查询的字符串本身就含有 %
或 _ 时,要使用 ESCAPE '<换码字符 >'
短语对通配符进行转义。
例题
1) 匹配模板为固定字符串
[例 14] 查询学号为 95001的学生的详细情况 。
SELECT *
FROM Student
WHERE Sno LIKE '95001';
等价于:
SELECT *
FROM Student
WHERE Sno = '95001';
例题(续)
2) 匹配模板为含通配符的字符串
[例 15] 查询所有姓刘学生的姓名、学号和性别。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE?刘 %‘;
例题(续)
匹配模板为含通配符的字符串(续)
[例 16] 查询姓 "欧阳 "且全名为三个汉字的学生的姓名。
SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳 __';
例题(续)
匹配模板为含通配符的字符串(续)
[例 17] 查询名字中第 2个字为 "阳 "字的学生的姓名和学号。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '__阳 %';
例题(续)
匹配模板为含通配符的字符串(续)
[例 18] 查询所有不姓刘的学生姓名。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE '刘 %';
例题(续)
3) 使用换码字符将通配符转义为普通字符
[例 19] 查询 DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design'
ESCAPE '\'
例题(续)
使用换码字符将通配符转义为普通字符 (续 )
[例 20] 查询以 "DB_"开头,且倒数第 3个字符为 i
的课程的详细情况。
SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i_ _' ESCAPE ' \ ';
(5) 涉及空值的查询
使用谓词 IS NULL 或 IS NOT NULL
―IS NULL‖ 不能用,= NULL‖ 代替
[例 21] 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;
例题 (续 )
[例 22] 查所有有成绩的学生学号和课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
(6) 多重条件查询用逻辑运算符 AND和 OR来联结多个查询条件
AND的优先级高于 OR
可以用括号改变优先级可用来实现多种其他谓词
[NOT] IN
[NOT] BETWEEN … AND …
例题
[例 23] 查询计算机系年龄在 20岁以下的学生姓名。
SELECT Sname
FROM Student
WHERE Sdept= 'CS' AND Sage<20;
改写 [例 12]
[例 12] 查询信息系( IS)、数学系( MA)和计算机科学系
( CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( 'IS','MA','CS' )
可改写为:
SELECT Sname,Ssex
FROM Student
WHERE Sdept= ' IS ' OR Sdept= ' MA' OR Sdept= ' CS ';
改写 [例 10]
[例 10] 查询年龄在 20~23岁(包括 20岁和 23岁)
之间的学生的姓名、系别和年龄 。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
可改写为:
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage>=20 AND Sage<=23;
SELECT语句完整的句法
SELECT [ALL|DISTINCT] <目标列表达式 >
[,<目标列表达式 >] …
FROM <表名或视图名 >[,<表名或视图名 > ] …
[ WHERE <条件表达式 > ]
[ ORDER BY <列名 1> [ ASC|DESC ] ];
[ GROUP BY <列名 2> [ HAVING <条件表达式 > ] ]
表 3.3 常用的查询条件查 询 条 件 谓 词比 较
=,>,<,>=,<=,!=,<>,!>,!< ;
N O T + 上述比较运算符确定范围 B E T W E E N A N D,N O T B E T W E E N A N D
确定集合 IN,N O T I N
字符匹配 L I K E,N O T L I K E
空 值 I S N U L L,I S N O T N U L L
多重条件 AND,OR
三、对查询结果排序使用 ORDER BY子句
可以按一个或多个属性列排序
升序,ASC;降序,DESC;缺省值为升序当排序列含空值时
ASC:排序列为空值的元组最后显示
DESC:排序列为空值的元组最先显示对查询结果排序(续)
[例 24] 查询选修了 3号课程的学生的学号及其成绩,查询结果按分数降序排列 。
SELECT Sno,Grade
FROM SC
WHERE Cno= ' 3 '
ORDER BY Grade DESC;
查询结果
Sno Grade
------- -------
95010
95024
95007 92
95003 82
95010 82
95009 75
95014 61
95002 55
对查询结果排序(续)
[例 25] 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列 。
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;
四、使用集函数
5类主要集函数
计数
COUNT( [DISTINCT|ALL] *)
COUNT( [DISTINCT|ALL] <列名 >)
计算总和
SUM( [DISTINCT|ALL] <列名 >)
计算平均值
AVG( [DISTINCT|ALL] <列名 >)
使用集函数(续)
求最大值
MAX( [DISTINCT|ALL] <列名 >)
求最小值
MIN( [DISTINCT|ALL] <列名 >)
– DISTINCT短语:在计算时要取消指定列中的重复值
– ALL短语:不取消重复值
– ALL为缺省值使用集函数 (续)
[例 26] 查询学生总人数 。
SELECT COUNT(*)
FROM Student;
[例 27] 查询选修了课程的学生人数 。
SELECT COUNT(DISTINCT Sno)
FROM SC;
注:用 DISTINCT以避免重复计算学生人数使用集函数 (续)
[例 28] 计算 1号课程的学生平均成绩 。
SELECT AVG(Grade)
FROM SC
WHERE Cno= ' 1 ';
[例 29] 查询选修 1号课程的学生最高分数 。
SELECT MAX(Grade)
FROM SC
WHER Cno= ' 1 ';
五、对查询结果分组使用 GROUP BY子句分组细化集函数的作用对象
未对查询结果分组,集函数将作用于整个查询结果
对查询结果分组后,集函数将分别作用于每个组使用 GROUP BY子句分组
[例 30] 求各个课程号及相应的选课人数 。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
结果
Cno COUNT(Sno)
1 22
2 34
3 44
4 33
5 48
对查询结果分组 (续)
GROUP BY子句的作用对象是查询的中间结果表
分组方法:按指定的一列或多列值分组,值相等的为一组
使用 GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数使用 HAVING短语筛选最终输出结果
[例 31] 查询选修了 3门以上课程的学生学号 。
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >3;
例题
[例 32] 查询有 3门以上课程是 90分以上的学生的学号及 ( 90分以上的 ) 课程数
SELECT Sno,COUNT(*)
FROM SC
WHERE Grade>=90
GROUP BY Sno
HAVING COUNT(*)>=3;
使用 HAVING短语筛选最终输出结果
只有满足 HAVING短语指定条件的组才输出
HAVING短语与 WHERE子句的区别:作用对象不同
WHERE子句作用于基表或视图,从中选择满足条件的元组 。
HAVING短语作用于组,从中选择满足条件的组 。
SELECT语句完整的句法 (1)
SELECT语句完整的句法如下:
SELECT 目标表的列名或列表达式序列
FROM 基本表名和 ( 或 ) 视图序列
[ WHERE 行条件表达式 ]
[ GROUP BY 列名序列
[ HAVING 组条件表达式 ]]
[ ORDER BY 列名 [ ASC|DESC ],… ]
SELECT语句完整的句法 (2)
整个语句的执行过程如下:
( 1) 读取 FROM子句中基本表,视图的数据,执行笛卡尔积操作 。
( 2) 选取满足 WHERE子句中给出的条件表达式的元组 。
( 3) 按 GROUP子句中指定列的值分组,同时提取满足
HAVING子句中组条件表达式的那些组 。
( 4) 按 SELECT子句中给出的列名或列表达式求值输出 。
( 5) ORDER子句对输出的目标表进行排序,按附加说明
ASC升序排列,或按 DESC降序排列 。
SELECT语句完整的句法 (3)
例 3.11 对教学数据库的基本表 S,SC,C中数据进行查询和计算 。
① 统计每一年龄选修课程的学生人数
SELECT AGE,COUNT( DISTINCT S.S#)
FROM S,SC
WHERE S.S#=SC.S#
GROUP BY AGE;
由于要统计每一个年龄的学生人数,因此要把满足 WHERE
子句中条件的查询结果按年龄分组,在每一组中的学生年龄相同 。 此时的 SELECT子句应对每一组分开进行操作,在每一组中,年龄只有一个值,统计的人数是这一组中的学生人数 。
SELECT语句完整的句法 (4)
② 求基本表 S中男同学的每一年龄组 ( 超过 50人 ) 有多少人? 要求查询结果按人数升序排列,人数相同按年龄降序排列 。
SELECT AGE,COUNT( S#)
FROM S
WHERE SEX='M'
GROUP BY AGE
HAVING COUNT( *) > 50
ORDER BY 2,AGE DESC;
返回
SELECT语句中的限定 (1)
SELECT子句中的规定
SELECT子句描述查询输出的表格结构,即输出值的列名或表达式 。 其形式如下:
SELECT [ ALL|DISTINCT ] <列名或列表达式序列 > | *
条件表达式中的算术比较操作条件表达式中可出现算术比较运算符 ( <,<=,>,
>=,=,!= ),也可以用,BETWEEN … AND … ‖
比较运算符限定一个值的范围 。
列和基本表的改名操作
SELECT语句中的限定 (2)
字符串的匹配操作条件表达式中字符串匹配操作符是,LIKE‖。 在表达式中可使用两个通配符:
百分号 ( %),与零个或多个字符组成的字符串匹配 。
下划线 ( _),与单个字符匹配 。
集合的并,交,差操作当两个子查询结果的结构完全一致时,可以让这两个子查询执行并、交、差操作。并、交、差的运算符为
UNION,INTERSECT和 EXCEPT。
空值的比较操作
SQL中允许列值为空,空值用保留字 NULL表示。
SELECT语句中的限定 (3)
集合的比较操作
SQL提供 SELECT语句的嵌套子查询机制。子查询是嵌套在另一个查询中的 SELECT语句。
( 1) 集合成员资格的比较
( 2) 集合成员的算术比较
( 3) 空关系的测试
( 4) 重复元组的测试
导出表的使用
SQL2允许在 FROM子句中使用子查询。如果在 FROM
子句中使用了子查询,那么要给子查询的结果起个表名和相应的列名。
返回下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第三章 关系数据库标准语言 SQL
3.3 查 询
3.3.1 概述
3.3.2 单表查询
3.3.3 连接查询
3.3.4 嵌套查询
3.3.5 集合查询
3.3.6 小结
3.3.3 连接查询同时涉及多个表的查询称为连接查询用来连接两个表的条件称为连接条件或连接谓词一般格式:
[<表名 1>.]<列名 1> <比较运算符 > [<表名 2>.]<列名 2>
比较运算符,=,>,<,>=,<=,!=
[<表名 1>.]<列名 1> BETWEEN [<表名 2>.]<列名 2>
AND [<表名 2>.]<列名 3>
连接查询 (续)
连接字段
连接谓词中的列名称为连接字段
连接条件中的各连接字段类型必须是可比的,
但不必是相同的连接操作的执行过程
嵌套循环法 (NESTED-LOOP)
首先在表 1中找到第一个元组,然后从头开始扫描表 2,
逐一查找满足连接件的元组,找到后就将表 1中的第一个元组与该元组拼接起来,形成结果表中一个元组 。
表 2全部查找完后,再找表 1中第二个元组,然后再从头开始扫描表 2,逐一查找满足连接条件的元组,找到后就将表 1中的第二个元组与该元组拼接起来,形成结果表中一个元组 。
重复上述操作,直到表 1中的全部元组都处理完毕排序合并法 (SORT-MERGE)
常用于 =连接
首先按连接属性对表 1和表 2排序
对表 1的第一个元组,从头开始扫描表 2,顺序查找满足连接条件的元组,找到后就将表 1中的第一个元组与该元组拼接起来,形成结果表中一个元组 。
当遇到表 2中第一条大于表 1连接字段值的元组时,
对表 2的查询不再继续排序合并法
找到表 1的第二条元组,然后从刚才的中断点处继续顺序扫描表 2,查找满足连接条件的元组,找到后就将表 1中的第一个元组与该元组拼接起来,形成结果表中一个元组 。 直接遇到表 2中大于表 1连接字段值的元组时,对表 2的查询不再继续
重复上述操作,直到表 1或表 2中的全部元组都处理完毕为止索引连接 (INDEX-JOIN)
对表 2按连接字段建立索引
对表 1中的每个元组,依次根据其连接字段值查询表 2的索引,从中找到满足条件的元组,找到后就将表 1中的第一个元组与该元组拼接起来,形成结果表中一个元组连接查询 (续)
SQL中连接查询的主要类型
广义笛卡尔积
等值连接 (含自然连接 )
非等值连接查询
自身连接查询
外连接查询
复合条件连接查询一、广义笛卡尔积
不带连接谓词的连接
很少使用例:
SELECT Student.*,SC.*
FROM Student,SC
二、等值与非等值连接查询等值连接,自然连接,非等值连接
[例 32] 查询每个学生及其选修课程的情况。
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno = SC.Sno;
等值连接
连接运算符为 = 的连接操作
[<表名 1>.]<列名 1> = [<表名 2>.]<列名 2>
任何子句中引用表 1和表 2中同名属性时,都必须加表名前缀 。 引用唯一属性名时可以加也可以省略表名前缀 。
等值连接假设 Student表,SC表分别有下列数据:
Student表
Sno Sname Ssex Sage Sdept
95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
等值连接
SC表
Sno Cno Grade
95001 1 92
95001 2 85
95001
95002
95002
3
2
3
88
90
80
等值连接结果表
Student.Sno Sname Ssex Sage Sdept SC.Sno Cno Grade
95001 李勇 男 20 CS 95001 1 92
95001 李勇 男 20 CS 95001 2 85
95001 李勇 男 20 CS 95001 3 88
95002 刘晨 女 19 IS 95002 2 90
95002 刘晨 女 19 IS 95002 3 80
自然连接
等值连接的一种特殊情况,把目标列中重复的属性列去掉 。
[例 33] 对 [例 32]用自然连接完成。
SELECT Student.Sno,Sname,Ssex,Sage,
Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno;
非等值连接查询连接运算符 不是 = 的连接操作
[<表名 1>.]<列名 1><比较运算符 >[<表名 2>.]<列名 2>
比较运算符,>,<,>=,<=,!=
[<表名 1>.]<列名 1> BETWEEN [<表名 2>.]<列名 2>
AND [<表名 2>.]<列名 3>
三、自身连接
一个表与其自己进行连接,称为表的 自身连接
需要给表起别名以示区别
由于所有属性名都是同名属性,因此必须使用别名前缀自身连接(续)
[例 34] 查询每一门课的间接先修课 ( 即先修课的先修课 )
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno = SECOND.Cno;
SELECT
FIRST.C#,first.CNAME,SECOND.C#,second.CNAME
FROM C FIRST,C SECOND
WHERE FIRST.C# = SECOND.CPno;
自身连接(续)
FIRST表 ( Course表 )
Cno Cname Cpno Ccredit
1 数据库 5 4
2 数学 2
3 信息系统 1 4
4 操作系统 6 3
5 数据结构 7 4
6 数据处理 2
7 PASCAL语言 6 4
自身连接(续)
SECOND表 ( Course表 )
Cno Cname Cpno Ccredit
1 数据库 5 4
2 数学 2
3 信息系统 1 4
4 操作系统 6 3
5 数据结构 7 4
6 数据处理 2
7 PASCAL语言 6 4
自身连接(续)
查询结果
1 7
3 5
5 6
cno cpno
四、外连接( Outer Join)
外连接与普通连接的区别
普通连接操作只输出满足连接条件的元组
外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出外连接( outer join)
A B C
a b c
b b f
c a d
R
B C D
b c d
b c e
a d b
e f g
S
A B C D
a b c d
a b c e
c a d b
A B C D
a b c d
a b c e
c a d b
b b f null
A B C D
a b c d
a b c e
c a d b
null e f g
SR
R RS S
A B C D
a b c d
a b c e
c a d b
b b f null
null e f g
SR
外连接(续)
[例 33] 查询每个学生及其选修课程的情况包括没有选修课程的学生 ----用外连接操作
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
95001 李勇 男 20 CS 1 92
95001 李勇 男 20 CS 2 85
95001 李勇 男 20 CS 3 88
95002 刘晨 女 19 IS 2 90
95002 刘晨 女 19 IS 3 80
95003 王敏 女 18 MA
95004 张立 男 19 IS
外连接(续)
在表名后面加外连接操作符 (*)或 (+)指定非主体表
非主体表有一,万能,的虚行,该行全部由空值组成
虚行可以和主体表中所有不满足连接条件的元组进行连接
由于虚行各列全部是空值,因此与虚行连接的结果中,来自非主体表的属性值全部是空值外连接(续)
左外连接
外连接符出现在连接条件的左边
右外连接
外连接符出现在连接条件的右边
select S.S#,SNAME,SEX,C#
from S right outer join SC on S.S# = SC.S#
select S.S#,SNAME,SEX,C#
from S,SC
on S.S# *= SC.S#
五、复合条件连接
WHERE子句中含多个连接条件时,称为复合条件连接
[例 35]查询选修 2号课程且成绩在 90分以上的所有学生的学号、姓名
SELECT Student.Sno,student.Sname
FROM Student,SC
WHERE Student.Sno = SC.Sno AND
/* 连接谓词 */
SC.Cno= ' 2 ' AND /* 其他限定条件 */
SC.Grade > 90; /* 其他限定条件 */
多表连接
[例 36] 查询每个学生的学号,姓名,选修的课程名及成绩 。
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno
and SC.Cno = Course.Cno;
结果:
Student.Sno Sname Cname Grade
95001 李勇 数据库 92
95001 李勇 数学 85
95001 李勇 信息系统 88
95002 刘晨 数学 90
95002 刘晨 信息系统 80
3.3 查 询
3.3.1 概述
3.3.2 单表查询
3.3.3 连接查询
3.3.4 嵌套查询
3.3.5 集合查询
3.3.6 小结
3.3.4 嵌套查询
嵌套查询概述
嵌套查询分类
嵌套查询求解方法
引出子查询的谓词嵌套查询 (续 )
嵌套查询概述
一个 SELECT-FROM-WHERE语句称为一个查询块
将一个查询块嵌套在另一个查询块的
WHERE子句或 HAVING短语的条件中的查询称为嵌套查询嵌套查询 (续 )
SELECT Sname 外层查询 /父查询
FROM Student
WHERE Sno IN
( SELECT Sno 内层查询 /子查询
FROM SC
WHERE Cno= ' 2 ');
嵌套查询 (续 )
子查询的限制
不能使用 ORDER BY子句
层层嵌套方式反映了 SQL语言的结构化
有些嵌套查询可以用连接运算替代嵌套查询分类
不相关子查询子查询的查询条件不依赖于父查询
相关子查询子查询的查询条件依赖于父查询嵌套查询求解方法
不相关子查询是由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。
嵌套查询求解方法(续)
相关子查询
首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若
WHERE子句返回值为真,则取此元组放入结果表;
然后再取外层表的下一个元组;
重复这一过程,直至外层表全部检查完为止。
引出子查询的谓词
带有 IN谓词的子查询
带有比较运算符的子查询
带有 ANY或 ALL谓词的子查询
带有 EXISTS谓词的子查询一、带有 IN谓词的子查询
[例 37] 查询与,刘晨,在同一个系学习的学生。
此查询要求可以分步来完成
① 确定,刘晨,所在系名
SELECT Sdept
FROM Student
WHERE Sname= ' 刘晨 ';
结果为:
Sdept
IS
带有 IN谓词的子查询(续)
② 查找所有在 IS系学习的学生。
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept= ' IS ';
结果为:
Sno Sname Sdept
95001 刘晨 IS
95004 张立 IS
构造嵌套查询将第一步查询嵌入到第二步查询的条件中
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname=? 刘晨 ’ );
此查询为不相关子查询。 DBMS求解该查询时也是分步去做的。
带有 IN谓词的子查询(续)
用自身连接完成本查询要求
SELECT S1.Sno,S1.Sname,
S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sdept = S2.Sdept AND
S2.Sname = '刘晨 ';
带有 IN谓词的子查询(续)
父查询和子查询中的表均可以定义别名
SELECT Sno,Sname,Sdept
FROM Student S1
WHERE S1.Sdept IN
(SELECT Sdept
FROM Student S2
WHERE S2.Sname=? 刘晨 ’ );
带有 IN谓词的子查询(续)
[例 38]查询选修了课程名为,信息系统,的学生学号和姓名
SELECT Sno,Sname ③ 最后在 Student关系中
FROM Student 取出 Sno和 Sname
WHERE Sno IN
(SELECT Sno ② 然后在 SC关系中找出选
FROM SC 修了 3号课程的学生学号
WHERE Cno IN
(SELECT Cno ① 首先在 Course关系中找出
,信
FROM Course 息系统,的课程号,结果为 3
号
WHERE Cname=?信息系统 ’ ));
带有 IN谓词的子查询(续)
结果:
Sno Sname
---- -----
95001 李勇
95002 刘晨带有 IN谓词的子查询(续)
用连接查询
SELECT Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno AND
SC.Cno = Course.Cno AND
Course.Cname=?信息系统 ’ ;
二、带有比较运算符的子查询
● 当能确切知道内层查询返回单值时,可用比较运算符( >,<,=,>=,
<=,!=或 < >)。
与 ANY或 ALL谓词配合使用带有比较运算符的子查询(续)
例:假设一个学生只可能在一个系学习,并且必须属于一个系,则在 [例 37]可以 用 = 代替 IN,
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept =
SELECT Sdept
FROM Student
WHERE Sname= ' 刘晨 ';
带有比较运算符的子查询(续)
子查询一定要跟在比较符之后错误 的例子:
SELECT Sno,Sname,Sdept
FROM Student
WHERE ( SELECT Sdept
FROM Student
WHERE Sname=? 刘晨 ’ )
= Sdept;
三、带有 ANY或 ALL谓词的子查询谓词语义
ANY:任意一个值
ALL:所有值带有 ANY或 ALL谓词的子查询(续)
需要配合使用比较运算符
> ANY 大于子查询结果中的某个值
> ALL 大于子查询结果中的所有值
< ANY 小于子查询结果中的某个值
< ALL 小于子查询结果中的所有值
>= ANY 大于等于子查询结果中的某个值
>= ALL 大于等于子查询结果中的所有值
<= ANY 小于等于子查询结果中的某个值
<= ALL 小于等于子查询结果中的所有值
= ANY 等于子查询结果中的某个值
=ALL 等于子查询结果中的所有值(通常没有实际意义)
!=(或 <>) ANY 不等于子查询结果中的某个值
!=(或 <>) ALL 不等于子查询结果中的任何一个值带有 ANY或 ALL谓词的子查询(续)
[例 39] 查询其他系中比信息系任意 一 个 (其中某一 个 )学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage < ANY (SELECT Sage
FROM Student
WHERE Sdept= ' IS ')
AND Sdept <> ' IS ' ;
/* 注意这是父查询块中的条件 */
带有 ANY或 ALL谓词的子查询(续)
结果
Sname Sage
王敏 18
执行过程
1.DBMS执行此查询时,首先处理子查询,找出
IS系中所有学生的年龄,构成一个集合 (19,18)
2,处理父查询,找所有不是 IS系且年龄小于
19 或 18的学生带有 ANY或 ALL谓词的子查询(续)
● ANY和 ALL谓词有时可以用集函数实现
– ANY与 ALL与集函数的对应关系
= <>或 != < <= > >=
ANY IN -- <MAX <=MAX >MIN >= MIN
ALL -- NOT IN <MIN <= MIN >MAX >= MAX
带有 ANY或 ALL谓词的子查询(续)
– 用集函数实现子查询通常比直接用 ANY或
ALL查询效率要高,因为前者通常能够减少比较次数
– 原因:集函数首先把需要比较的集合计算出来(通常情况下是变小的),缩小了和父查询比较的次数带有 ANY或 ALL谓词的子查询(续)
[例 39']:用集函数实现 [例 39]
SELECT Sname,Sage
FROM Student
WHERE Sage <
(SELECT MAX(Sage)
FROM Student
WHERE Sdept= ' IS ')
AND Sdept <> ' IS ‘;
带有 ANY或 ALL谓词的子查询(续)
[例 40] 查询其他系中比信息系 所有 学生年龄 都小的学生姓名及年龄。
方法一:用 ALL谓词
SELECT Sname,Sage
FROM Student
WHERE Sage < ALL
(SELECT Sage
FROM Student
WHERE Sdept= ' IS ')
AND Sdept <> ' IS ‘;
查询结果为空表。
带有 ANY或 ALL谓词的子查询(续)
方法二:用集函数
SELECT Sname,Sage
FROM Student
WHERE Sage <
(SELECT MIN(Sage)
FROM Student
WHERE Sdept= ' IS ')
AND Sdept <>' IS ‘;
四、带有 EXISTS谓词的子查询
1,EXISTS谓词
2,NOT EXISTS谓词
3,不同形式的查询间的替换
4,相关子查询的效率
5,用 EXISTS/NOT EXISTS实现全称量词
6,用 EXISTS/NOT EXISTS实现逻辑蕴函带有 EXISTS谓词的子查询 (续)
● 1,EXISTS谓词
– 存在量词?
– 带有 EXISTS谓词的子查询不返回任何数据,只产生逻辑真值,true‖或逻辑假值,false‖。
● 若内层查询结果非空,则返回真值
● 若内层查询结果为空,则返回假值
– 由 EXISTS引出的子查询,其目标列表达式通常都用
*,因为带 EXISTS的子查询只返回真值或假值,给出列名无实际意义
● 2,NOT EXISTS谓词带有 EXISTS谓词的子查询 (续)
[例 41] 查询所有选修了 1号课程的学生姓名。
– 用嵌套查询
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC /*相关子查询 */
WHERE Sno=Student.Sno AND
Cno= ' 1 ');
求解过程带有 EXISTS谓词的子查询 (续)
思路分析:
● 本查询涉及 Student和 SC关系。
● 在 Student中依次取每个元组的 Sno值,用此值去检查 SC关系。
● 若 SC中存在这样的元组,其 Sno值等于此
Student.Sno值,并且其 Cno= '1',则取此
Student.Sname送入结果关系。
相关子查询
子查询的查询条件依赖于外层父查询的某个属性值,称为相关子查询。
不能一次将子查询求解出来,然后求解父查询。
内层查询由于和外层查询有关,因此必须反复求值。
相关子查询的一般处理过程
首先取外层查询中( Student)表的第 1
个元组,根据它与内层查询相关的属性值( Sno)处理内层查询,若 Where子句返回值为真,则取此元组放入结果表;
然后再取( Student)表的下一个元组;
重复这一个过程,直至外层( Student)
表全部检查完为止。
带有 EXISTS谓词的子查询 (续)
用连接运算
SELECT Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno AND
SC.Cno= '1';
带有 EXISTS谓词的子查询 (续)
[例 42] 查询没有选修 1号课程的学生姓名 。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno = Student.Sno
AND Cno='1');
此例用连接运算难于实现
∏ SNAME(S) - ∏SNAMEE(σC#=?C2‘(S SC))
带有 EXISTS谓词的子查询 (续)
3,不同形式的查询间的替换一些 带 EXISTS或 NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换所有 带 IN谓词、比较运算符,ANY和 ALL谓词的子查询都能用带 EXISTS谓词的子查询等价替换。
EXISTS 带 IN谓词、比较运算符,ANY和 ALL谓词带有 EXISTS谓词的子查询 (续)
例,[例 37]查询与,刘晨,在同一个系学习的学生。 可以用带 EXISTS谓词的子查询替换:
SELECT Sno,Sname,Sdept
FROM Student S1
WHERE EXISTS
SELECT *
FROM Student S2
WHERE S2.Sdept = S1.Sdept AND
S2.Sname = ' 刘晨 ';
带有 EXISTS谓词的子查询 (续)
5.用 EXISTS/NOT EXISTS实现全称量词 (难点 )
SQL语言中没有全称量词? ( For all)
可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:
(?x)P ≡? (? x(? P))
带有 EXISTS谓词的子查询 (续)
[例 43] 查询选修了全部课程的学生姓名 。
=,没有一门课是他不选修的 。
SELECT Sname
FROM Student
WHERE NOT EXISTS
( SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno= Student.Sno
AND Cno= Course.Cno) ;
∏ SNAME( S ( ∏ S#,C#(SC) ÷ ∏ C#(C) ))
带有 EXISTS谓词的子查询 (续)
6,用 EXISTS/NOT EXISTS实现逻辑蕴函 (难点 )
SQL语言中没有蕴函 (Implication)逻辑运算
可以利用谓词演算将逻辑蕴函谓词等价转换为:
p? q ≡? p∨ q
带有 EXISTS谓词的子查询 (续)
[例 44] 查询至少选修了学生 95002选修的全部课程的学生号码。
解题思路:
● 用逻辑蕴函表达:查询学号为 x的学生,对所有的课程
y,只要 95002学生选修了课程 y,则 x也选修了 y。
● 形式化表示:
用 P表示谓词,学生 95002选修了课程 y‖
用 q表示谓词,学生 x选修了课程 y‖
则上述查询为,(?y) p? q
带有 EXISTS谓词的子查询 (续)
● 等价变换:
(?y)p? q ≡? (?y (?(p? q ))
≡? (?y (?(? p∨ q)
≡y(p∧?q)
● 变换后语义:不存在这样的课程 y,学生 95002
选修了 y,而学生 x没有选。
带有 EXISTS谓词的子查询 (续)
● 用 NOT EXISTS谓词表示,
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 查 询
3.3.1 概述
3.3.2 单表查询
3.3.3 连接查询
3.3.4 嵌套查询
3.3.5 集合查询
3.3.6 小结
3.3.5 集合查询标准 SQL直接支持的集合操作种类并操作 (UNION)
一般商用数据库支持的集合操作种类并操作 (UNION)
交操作 (INTERSECT)
差操作 (MINUS)
1,并操作
形式
<查询块 >
UNION
<查询块 >
参加 UNION操作的各结果表的列数必须相同;
对应项的数据类型也必须相同
A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1
A B C
a1 b2 c2
a1 b3 c2
a2 b2 c1
R
S
并操作(续)
[例 45] 查询计算机科学系的学生及年龄不大于
19岁的学生。
方法一:
SELECT *
FROM Student
WHERE Sdept= 'CS'
UNION
SELECT *
FROM Student
WHERE Sage<=19;
并操作(续)
方法二:
SELECT DISTINCT *
FROM Student
WHERE Sdept= 'CS' OR Sage<=19;
并操作(续)
[例 46] 查询选修了课程 1或者选修了课程 2的学生。
方法一:
SELECT Sno
FROM SC
WHERE Cno=' 1 '
UNION
SELECT Sno
FROM SC
WHERE Cno= ' 2 ';
并操作(续)
方法二:
SELECT DISTINCT Sno
FROM SC
WHERE Cno=' 1 ' OR Cno= ' 2 ';
并操作(续)
[例 47] 设数据库中有一教师表 Teacher(Tno,
Tname,...)。查询学校中所有师生的姓名。
SELECT Sname
FROM Student
UNION
SELECT Tname
FROM Teacher;
new
2,交操作标准 SQL中没有提供集合交操作,但可用其他方法间接实现。
现在已经提供。
A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1
A B C
a1 b2 c2
a1 b3 c2
a2 b2 c1
R
S
2,交操作
[例 48] 查询计算机科学系的学生与年龄不大于
19岁的学生的交集本例实际上就是查询计算机科学系中年龄不大于
19岁的学生
SELECT *
FROM Student
WHERE Sdept= 'CS' AND
Sage<=19;
交操作(续)
[例 49] 查询选修课程 1的学生集合与选修课程 2
的学生集合的交集本例实际上是查询既选修了课程 1又选修了课程 2
的学生
SELECT Sno
FROM SC
WHERE Cno=' 1 ' AND Sno IN
(SELECT Sno
FROM SC
WHERE Cno=' 2 ');
交操作(续)
[例 50] 查询学生姓名与教师姓名的交集本例实际上是查询学校中与教师同名的学生姓名
SELECT DISTINCT Sname
FROM Student
WHERE Sname IN
(SELECT Tname
FROM Teacher);
new
3,差操作标准 SQL中没有提供集合差操作,但可用其他方法间接实现。
现在已经提供。
A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1
A B C
a1 b2 c2
a1 b3 c2
a2 b2 c1
R
S
3,差操作
[例 51] 查询计算机科学系的学生与年龄不大于
19岁的学生的差集。
本例实际上是查询计算机科学系中年龄大于 19
岁的学生
SELECT *
FROM Student
WHERE Sdept= 'CS' AND
Sage>19;
差操作(续)
[例 52] 查询学生姓名与教师姓名的差集本例实际上是查询学校中未与教师同名的学生姓名
SELECT DISTINCT Sname
FROM Student
WHERE Sname NOT IN
(SELECT Tname
FROM Teacher); new
4,对集合操作结果的排序
ORDER BY子句只能用于对最终查询结果排序,不能对中间结果排序
任何情况下,ORDER BY子句只能出现在最后
对集合操作结果排序时,ORDER BY子句中用数字指定排序属性
new
对集合操作结果的排序(续)
[例 53] 错误 写法
SELECT *
FROM Student
WHERE Sdept= 'CS'
ORDER BY Sno
UNION
SELECT *
FROM Student
WHERE Sage<=19
ORDER BY Sno; new
对集合操作结果的排序(续)
正确写法
SELECT *
FROM Student
WHERE Sdept= 'CS'
UNION
SELECT *
FROM Student
WHERE Sage<=19
ORDER BY 1;
new
3.3.6 SELECT语句的一般格式
SELECT [ALL|DISTINCT]
<目标列表达式 > [别名 ] [,<目标列表达式 > [别名 ]] …
FROM <表名或视图名 > [别名 ]
[,<表名或视图名 > [别名 ]] …
[WHERE <条件表达式 >]
[GROUP BY <列名 1>[,<列名 1‘>],..[HAVING <条件表达式 >]]
[ORDER BY <列名 2> [ASC|DESC]
[,<列名 2‘> [ASC|DESC] ] … ];
整条语句的含义:
根据 WHERE子句的条件表达式,从 FROM子句指定的基本表或视图中找出满足条件的元组,再按
SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。
如果有 GROUP子句,则将结果按 <列名 1>的值进行分组,该属性列值相等的元组为一个组,每个组产生结果表中的一条记录,通常会在每组中使用集函数。如果 GROUP子句带 HAVING短语,则只有满足指定条件的组才输出。如果有 ORDER子句,则结果表还要按 <列名 2>的值的升序或降序排列。
1、子句基本应用形式
( 1)SELECT 子句的形式
① SELECT Sno,Sname
② SELECT DISTINCT Sno
③ SELECT *
④ SELECT ‘My name is’,Sname,2003 -
Sage,ISLOWER(Sdept) Dept
⑤ SELECT AVG(Grade),MAX(Grade),COUNT(*)
(2)FROM
① FROM Student
② FROM Student,SC,Course
(3)WHERE
① WHERE Sage>=18
等价于 WHERE NOT ( Sage<18)
② WHERE Sage BETWEEN 19 AND 22
等价于 WHERE Sage>=19 AND Sage<=22
③ WHERE Sdept In(‘IS’,’MA’)
等价于 WHERE Sdept=’ IS’ OR Sdept=‘MA’
④ WHERE Sdept NOT in (‘IS’,’MA’)
等价于 WHERE Sdept<>’IS’AND Sdept<>’MA’
⑤ WHERE Sname NOT LIKE ‘_ 宇%’
⑥ WHERE Cname LIKE ‘DB \_%i_’ESCAPE ‘ \’
⑦ WHERE Grade IS NOT Null
(4) GROUP
① GROUP BY CNO
② GROUP BY Sno HAVING
COUNT(*)>=3
(5)ORDER
① ORDER BY Grade DESC
② ORDER BY Sdept,Sage DESC
2,连接查询
非等值连接( <,>)
等值连接(=)
自身连接(别名)
外连接( *)
复合条件连接:多个表的连接(多表连接)、多个条件的连接(复合条件连接)
3、嵌套查询
带有 IN谓词的子查询
带有比较运算符的子查询(单值比较)
带有 ANY或 ALL的子查询
带有 EXISTS谓词的子查询
4、集合查询
每一个 SELECT语句都能获得一个或一组元组。若要把多个 SELECT语句的结果合并为一个结果,可用集合操作来完成。
集合操作用 UNION(并),INTERSECT
(交)和 MINUS(差)。
作业
将上次作业的两道题目的 关系代数表达式 改写成 SQL查询语句 。
表 3,1 S Q L 语言的动词
S Q L 功 能 动 词数 据 定 义 C R E A T E,D R O P,A L T E R
数 据 查 询 S E L E C T
数 据 操 纵 I N S E R T,U P D A T E
D E L E T E
数 据 控 制 G R A N T,R E V O K E
表 3,2 S Q L 的数据定义语句操 作 方 式操 作 对象创 建 删 除 修 改表 C R E A T E
T A B L E
D R O P
T A B L E
A L T E R
T A B L E
视 图 C R E A T E
V I E W
D R O P V I E W
索 引 C R E A T E
I N D E X
D R O P
I N D E X
数据库系统概论
An Introduction to Database System
第三章 关系数据库标准语言 SQL
第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7 嵌入式 SQL
3.8 小结
3.4 数 据 更 新
3.4.1 插入数据
3.4.2 修改数据
3.4.3 删除数据
3.4.1 插入数据
两种插入数据方式
插入单个元组
插入子查询结果
c1b2a2
c2b3a1
c2b2a1
CBA
S
c1b2a2
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 ');
新插入的记录在 Grade列上取空值
INTO子句
指定要插入数据的表名及属性列
属性列的顺序可与表定义中的顺序不一致
没有指定属性列:表示要插入的是一条完整的元组,
且属性列属性与表定义中的顺序一致
指定部分属性列:插入的元组在其余属性列上取空值
VALUES子句
提供的值必须与 INTO子句匹配
> 值的个数
> 值的类型
INSERT
INTO SC(Sno,Cno)
VALUES (' 95020 ',' 1 ');
2,插入子查询结果
语句格式
INSERT
INTO <表名 > [(<属性列 1> [,<属性列 2>… )]
子查询 ;
功能将子查询结果插入指定表中插入子查询结果(续)
[例 3] 对每一个系,求学生的平均年龄,
并把结果存入数据库。
第一步:建表
CREATE TABLE Deptage
(Sdept CHAR(15) /* 系名 */
Avgage SMALLINT); /*学生平均年龄 */
插入子查询结果(续)
第二步:插入数据
INSERT
INTO Deptage(Sdept,Avgage)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;
插入子查询结果(续)
INTO子句 (与 插入单条元组类似 )
指定要插入数据的表名及属性列
属性列的顺序可与表定义中的顺序不一致
没有指定属性列:表示要插入的是一条完整的元组
指定部分属性列:插入的元组在其余属性列上取空值
子查询
SELECT子句目标列必须与 INTO子句匹配
值的个数
值的类型插入子查询结果(续)
DBMS在执行插入语句时会检查所插元组是否破坏表上已定义的 完整性规则
实体完整性
参照完整性
用户定义的完整性
NOT NULL约束
UNIQUE约束
值域约束
3.4 数 据 更 新
3.4.1 插入数据
3.4.2 修改数据
3.4.3 删除数据
3.4.2 修改数据
语句格式
UPDATE <表名 >
SET <列名 >=<表达式 >[,<列名 >=<表达式 >]…
[WHERE <条件 >];
功能修改指定表中满足 WHERE子句条件的元组
c1b2a2
c2b3a1
c2b2a1
CBA
S
修改数据(续)
三种修改方式
修改某一个元组的值
修改多个元组的值
带子查询的修改语句
Sno Sname Ssex Sage Sdept
95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
Student
1,修改某一个元组的值
[例 4] 将学生 95001的年龄改为 22岁 。
UPDATE Student
SET Sage=22
WHERE Sno=' 95001 ';
Sno Sname Ssex Sage Sdept
95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
Student
2,修改多个元组的值
[例 5] 将所有学生的年龄增加 1岁 。
UPDATE Student
SET Sage= Sage+1;
修改多个元组的值 (续 )
[例 6] 将信息系所有学生的年龄增加 1岁 。
UPDATE Student
SET Sage= Sage+1
WHERE Sdept=' IS ';
3,带子查询的修改语句
[例 7] 将计算机科学系全体学生的成绩置零 。
UPDATE SC
SET Grade=0
WHERE 'CS'=
(SELETE Sdept
FROM Student
WHERE Student.Sno = SC.Sno);
修改数据(续)
SET子句指定修改方式要修改的列修改后取值
WHERE子句指定要修改的元组缺省表示要修改表中的所有元组
SET Sage= Sage+1
WHERE 'CS'=
(SELETE Sdept
FROM Student
WHERE Student.Sno = SC.Sno);
修改数据(续)
DBMS在执行修改语句时会检查修改操作是否破坏表上已定义的 完整性规则
实体完整性
用户定义的完整性
NOT NULL约束
UNIQUE约束
值域约束
3.4 数 据 更 新
3.4.1 插入数据
3.4.2 修改数据
3.4.3 删除数据
3.4.3 删除数据
DELETE
FROM <表名 >
[WHERE <条件 >];
– 功能
删除指定表中满足 WHERE子句条件的 元组
– WHERE子句
指定要删除的元组
缺省表示要修改表中的所有元组
c1b2a2
c2b3a1
c2b2a1
CBA
S
删除数据(续)
三种删除方式
删除某一个元组的值
删除多个元组的值
带子查询的删除语句
1,删除某一个元组的值
[例 8] 删除学号为 95019的学生记录。
DELETE
FROM Student
WHERE Sno='95019';
Sno Sname Ssex Sage Sdept
95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
Student
2,删除多个元组的值
[例 9] 删除 2号课程的所有选课记录。
DELETE
FROM SC;
WHERE Cno='2';
[例 10] 删除所有的学生选课记录。
DELETE
FROM SC;
3,带子查询的删除语句
[例 11] 删除计算机科学系所有学生的选课记录。
DELETE
FROM SC
WHERE 'CS'=
(SELETE Sdept
FROM Student
WHERE Student.Sno=SC.Sno);
删除数据 (续 )
DBMS在执行插入语句时会检查所插元组是否破坏表上已定义的 完整性规则
– 参照完整性
不允许删除
级联删除表 3,1 S Q L 语言的动词
S Q L 功 能 动 词数 据 定 义 C R E A T E,D R O P,A L T E R
数 据 查 询 S E L E C T
数 据 操 纵 I N S E R T,U P D A T E
D E L E T E
数 据 控 制 G R A N T,R E V O K E
第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7 嵌入式 SQL
3.8 小结
SQL数据库的体系结构用户 1 用户 2 用户 3 用户 4
视图 1 视图 1
基本表 1 基本表 2 基本表 3 基本表 4
存储文件 1 存储文件 2 存储文件 3 存储文件 4
图 3.1 SQL数据库的体系结构
SQL用户
View
Base
table
Stored
file
3.5 视 图视图的特点
虚表,是从一个或几个基本表(或视图)
导出的表
只存放视图的定义,不会出现数据冗余
基表中的数据发生变化,从视图中查询出的数据也随之改变
3.5 视 图基于视图的操作
查询
删除
更新 (受限 )
定义基于该视图的新视图
3.5 视 图
3.5.1 定义视图
3.5.2 查询视图
3.5.3 更新视图
3.5.4 视图的作用
1,建立视图
语句格式
CREATE VIEW
<视图名 > [(<列名 > [,<列名 >]… )]
AS <子查询 >
[WITH CHECK OPTION];
建立视图(续)
DBMS执行 CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的 SELECT语句。
在对视图查询时,按视图的定义从基本表中将数据查出。
组成视图的属性列名全部省略或全部指定
省略,
由子查询中 SELECT目标列中的诸字段组成
明确指定视图的所有列名,
(1) 某个目标列是集函数或列表达式
(2) 目标列为 *
(3) 多表连接时选出了几个同名列作为视图的字段
(4) 需要在视图中为某个列启用新的更合适的名字常见的视图形式
行列子集视图
WITH CHECK OPTION的视图
基于多个基表的视图
基于视图的视图
带表达式的视图
分组视图行列子集视图
[例 1] 建立信息系学生的视图。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS';
从单个基本表导出只是去掉了基本表的某些行和某些列保留了码建立视图(续)
WITH CHECK OPTION
透过视图进行增删改操作时,不得破坏视图定义中的谓词条件
(即子查询中的条件表达式)
WITH CHECK OPTION的视图
[例 2] 建立信息系学生的视图,并要求透过该视图进行的更新操作只涉及信息系学生。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS'
WITH CHECK OPTION;
对 IS_Student视图的更新操作
修改操作,DBMS自动加上 Sdept= 'IS'的条件
删除操作,DBMS自动加上 Sdept= 'IS'的条件
插入操作,DBMS自动检查 Sdept属性值是否为 'IS'
如果不是,则拒绝该插入操作
如果没有提供 Sdept属性值,则自动定义 Sdept
为 'IS'
基于多个基表的视图
[例 4] 建立信息系选修了 1号课程的学生视图。
CREATE VIEW IS_S1(Sno,Sname,Grade)
AS
SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERE Sdept= 'IS' AND
Student.Sno=SC.Sno AND
SC.Cno= '1';
基于视图的视图
[例 5] 建立信息系选修了 1号课程且成绩在 90
分以上的学生的视图。
CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS_S1
WHERE Grade>=90;
带表达式的视图
[例 6] 定义一个反映学生出生年份的视图。
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2000-Sage
FROM Student
设置一些派生属性列,也 称为虚拟列 --Sbirth
带表达式的视图必须明确定义组成视图的各个属性列名建立分组视图
[例 7] 将学生的学号及他的平均成绩定义为一个视图假设 SC表中,成绩,列 Grade为数字型
CREAT VIEW S_G(Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
建立视图(续)
一类不易扩充的视图
以 SELECT * 方式创建的视图可扩充性差,
应尽可能避免建立视图(续)
[例 8]将 Student表中所有女生记录定义为一个视图
CREATE VIEW
F_Student1(stdnum,name,sex,age,dept)
AS SELECT *
FROM Student
WHERE Ssex='女 ';
缺点:修改基表 Student的结构后,Student表与 F_Student1视图的映象关系被破坏,
导致该视图不能正确工作。
建立视图(续)
CREATE VIEW
F_Student2 (stdnum,name,sex,age,dept)
AS SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student
WHERE Ssex='女 ';
为基表 Student增加属性列不会破坏 Student表与 F_Student2视图的映象关系。
常见的视图形式
行列子集视图
WITH CHECK OPTION的视图
基于多个基表的视图
基于视图的视图
带表达式的视图
分组视图
2,删除视图
DROP VIEW <视图名 >;
该语句从数据字典中删除指定的视图定义
由该视图导出的其他视图定义仍在数据字典中,但已不能使用,必须显式删除
删除基表时,由该基表导出的所有视图定义都必须显式删除删除视图 (续)
[例 9] 删除视图 IS_S1
DROP VIEW IS_S1;
3.5.2 查询视图
从用户角度:查询视图与查询基本表相同
DBMS实现 视图查询的方法
实体化视图 ( View Materialization)
有效性检查:检查所查询的视图是否存在
执行视图定义,将视图临时实体化,生成临时表
查询视图转换为查询临时表
查询完毕删除被实体化的视图 (临时表 ) new
查询视图(续)
视图消解法 ( View Resolution)
进行有效性检查,检查查询的表、视图等是否存在。
如果存在,则从数据字典中取出视图的定义
把视图定义中的 子查询 与用户的 查询 结合起来,转换成等价的对基本表的查询
对基本表执行 修正 后的查询查询视图(续)
[例 1] 在信息系学生的视图中找出年龄小于 20岁的学生。
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
IS_Student视图的定义 (视图定义例 1):
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS?;
查询视图(续)
视图实体化法
视图消解法转换后的查询语句为:
SELECT Sno,Sage
FROM Student
WHERE Sdept= 'IS' AND Sage<20;
查询视图(续)
[例 2] 查询信息系选修了 1号课程的学生
SELECT Sno,Sname
FROM IS_Student,SC
WHERE IS_Student.Sno =SC.Sno AND
SC.Cno= '1';
查询视图(续)
视图消解法的局限
有些情况下,视图消解法不能生成正确查询。
采用视图消解法的 DBMS会限制这类查询。
查询视图(续)
[例 3]在 S_G视图中查询平均成绩在 90分以上的学生学号和平均成绩
SELECT *
FROM S_G
WHERE Gavg>=90;
S_G视图定义:
CREATE VIEW S_G (Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
查询转换错误:
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90
GROUP BY Sno;
正确:
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;
3.5 视 图
3.5.1 定义视图
3.5.2 查询视图
3.5.3 更新视图
3.5.4 视图的作用
3.5.3 更新视图
用户角度:更新视图与更新基本表相同
DBMS实现视图更新的方法
视图实体化法( View Materialization)
视图消解法( View Resolution)
指定 WITH CHECK OPTION子句后
DBMS在更新视图时会进行检查,防止用户通过视图对 不属于视图范围内 的基本表数据进行更新更新视图(续)
[例 1] 将信息系学生视图 IS_Student中学号 95002
的学生姓名改为,刘辰,。
UPDATE IS_Student
SET Sname= '刘辰 '
WHERE Sno= '95002';
转换后的语句:
UPDATE Student
SET Sname= '刘辰 '
WHERE Sno= '95002' AND Sdept= 'IS';
更新视图(续)
[例 2] 向信息系学生视图 IS_S中插入一个新的学生记录,95029,赵新,20岁
INSERT
INTO IS_Student
VALUES(?95029‘,‘ 赵新 ’,20);
转换为对基本表的更新:
INSERT
INTO Student(Sno,Sname,Sage,Sdept)
VALUES('95029','赵新 ',20,'IS' );
更新视图(续)
[例 3] 删除视图 CS_S中学号为 95029的记录
DELETE
FROM IS_Student
WHERE Sno= '95029';
转换为对基本表的更新:
DELETE
FROM Student
WHERE Sno= '95029' AND Sdept= 'IS';
更新视图的限制
一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新 (对两类方法均如此 )
例:视图 S_G为不可更新视图。
CREATE VIEW S_G (Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
更新视图(续)
对于如下更新语句:
UPDATE S_G
SET Gavg=90
WHERE Sno= '95001';
无论实体化法还是消解法都无法将其转换成对基本表 SC的更新实际系统对视图更新的限制
允许对行列子集视图进行更新
对其他类型视图的更新不同系统有不同限制
3.5 视 图
3.5.1 定义视图
3.5.2 查询视图
3.5.3 更新视图
3.5.4 视图的作用
1,视图能够 简化 用户的操作当视图中数据不是直接来自基本表时,定义视图能够简化用户的操作
基于多张表连接形成的视图
基于复杂嵌套查询的视图
含导出属性的视图
2,视图使用户能以 多种角度 看待同一数据
视图机制能使不同用户以不同方式看待同一数据,适应数据库共享的需要
3.视图对重构数据库提供了一定程度的逻辑独立性例:数据库逻辑结构发生改变学生关系 Student(Sno,Sname,Ssex,Sage,Sdept)
―垂直,地分成两个基本表:
SX(Sno,Sname,Sage)
SY(Sno,Ssex,Sdept)
3.视图对重构数据库提供了一定程度的逻辑独立性通过建立一个视图 Student:
CREATE VIEW Student(Sno,Sname,Ssex,Sage,Sdept)
AS
SELECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept
FROM SX,SY
WHERE SX.Sno=SY.Sno;
使用户的外模式保持不变,从而对原 Student表的查询程序不必修改
3,视图对重构数据库提供了一定程度的 逻辑独立性
物理独立性与逻辑独立性的概念
视图在一定程度上保证了数据的逻辑独立性
视图只能在一定程度上提供数据的逻辑独立性
由于对视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因基本表结构的改变而改变。
SQL数据库的体系结构用户 1 用户 2 用户 3 用户 4
视图 1 视图 1
基本表 1 基本表 2 基本表 3 基本表 4
存储文件 1 存储文件 2 存储文件 3 存储文件 4
图 3.1 SQL数据库的体系结构
SQL用户
View
Base
table
Stored
file
4,视图能够对机密数据提供安全保护
对不同用户定义不同视图,使每个用户只能看到他有权看到的数据
通过 WITH CHECK OPTION对关键数据定义操作时间限制建立视图(续)
[例 3 ] 建立 1号课程的选课视图,并要求透过该视图进行的更新操作只涉及 1号课程,同时对该视图的任何操作只能在工作时间进行。
CREATE VIEW IS_SC
AS
SELECT Sno,Cno,Grade
FROM SC
WHERE Cno= '1'
AND TO_CHAR(SYSDATE,'HH24') BETWEEN 9 AND 17
AND TO_CHAR(SYSDATE,'D') BETWEEN 2 AND 6
WITH CHECK OPTION; new
数据库系统概论
An Introduction to Database System
第三章 关系数据库标准语言 SQL
第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7 嵌入式 SQL
3.8 小结
3.6 数据控制
概述
3.6.1 授权
3.6.2 收回权限
小结概述数据控制亦称为数据保护,包括数据的:
安全性控制
完整性控制
并发控制
恢复
SQL语言的数据控制功能
SQL语言提供了数据控制功能,能够在一定程度上保证数据库中数据的完全性,
完整性,并提供了一定的并发控制及恢复能力 。
1,完整性
数据库的完整性是指数据库中数据的正确性与相容性。
SQL语言定义完整性约束条件
CREATE TABLE语句
ALTER TABLE语句
码
取值唯一的列
参照完整性
其他约束条件
2,并发控制
并发控制,当多个用户并发地对数据库进行操作时,对他们加以控制、协调,以保证并发操作正确执行,保持数据库的一致性。
SQL语言并发控制能力:
提供事务、事务开始、事务结束、提交等概念
3,恢复
恢复,当发生各种类型的故障导致数据库处于不一致状态时,将数据库恢复到一致状态的功能。
SQL语言恢复功能:
提供事务回滚、重做等概念
( UNDO,REDO)
4,安全性
安全性:保护数据库,防止不合法的使用所造成的数据泄露和破坏 。
保证数据安全性的主要措施存取控制:控制用户只能存取他有权存取的数据规定不同用户对于不同数据对象所允许执行的操作
① 数据库元素类型:数据库、表、属性列、视图
②权限,SELECT,INSERT,UPDATE、
DELETE,ALTER,INDEX,CREATETAB、
ALL PRIVILEGES
③ 用户类型,DBA、属主、普通用户
DBMS实现数据安全性保护的过程
用户或 DBA把授权决定告知系统
SQL的 GRANT和 REVOKE
DBMS把授权的结果存入数据字典
当用户提出操作请求时,DBMS根据授权定义进行检查,以决定是否执行操作请求安全性 (续 )
谁定义?
DBA和表的建立者(即表的属主)
如何定义?
SQL语句:
GRANT
REVOKE
3.6.1 授 权
GRANT语句的一般格式:
GRANT <权限 >[,<权限 >]...
[ON <对象类型 > <对象名 >]
TO <用户 >[,<用户 >]...
[WITH GRANT OPTION];
谁定义? DBA和表的建立者 ( 即表的属主 )
GRANT功能:将对指定操作对象的指定操作权限授予指定的用户 。
(1) 操作权限
(2) 用户的权限
建表 ( CREATETAB) 的权限,属于 DBA
DBA授予 -->普通用户
基本表或视图的属主拥有对该表或视图的一切操作权限
接受权限的用户,
一个或多个具体用户
PUBLIC(全体用户)
(3 ) WITH GRANT OPTION子句
指定了 WITH GRANT OPTION子句,
获得某种权限的用户还可以把这种权限再授予 别的用户。
没有指定 WITH GRANT OPTION子句,
获得某种权限的用户只能使用该权限,
不能传播 该权限例题例 1 把查询 Student表权限授给用户 U1
GRANT SELECT
ON TABLE Student
TO U1;
例题(续)
例 2 把对 Student表和 Course表的全部权限授予用户 U2和 U3
GRANT ALL PRIVILIGES
ON TABLE Student,Course
TO U2,U3;
例 4
例题(续)
例 3 把对表 SC的查询权限授予所有用户
GRANT SELECT
ON TABLE SC
TO PUBLIC;
例题(续)
例 4 把查询 Student表和修改学生学号的权限授给用户 U4
GRANT UPDATE(Sno),SELECT
ON TABLE Student
TO U4;
例题(续)
例 5 把对表 SC的 INSERT权限授予 U5用户,
并允许他再将此权限授予其他用户
GRANT INSERT
ON TABLE SC
TO U5
WITH GRANT OPTION;
传播权限执行例 5后,U5不仅拥有了对表 SC的 INSERT权限,
还可以传播此权限,
GRANT INSERT ON TABLE SC TO U6
WITH GRANT OPTION;
同样,U6还可以将此权限授予 U7:
GRANT INSERT ON TABLE SC TO U7;
但 U7不能再传播此权限 。
U5--> U6--> U7
例题(续)
例 6 DBA把在数据库 S_C中建立表的权限授予用户 U8
GRANT CREATETAB
ON DATABASE S_C
TO U8;
3.6 数据控制
概述
3.6.1 授权
3.6.2 收回权限
小结
SQL收回权限的功能
REVOKE语句的一般格式为:
REVOKE <权限 >[,<权限 >]...
[ON <对象类型 > <对象名 >]
FROM <用户 >[,<用户 >]...;
功能:从指定 用户 那里收回对指定 对象的指定 权限例题例 7 把用户 U4修改学生学号的权限收回
REVOKE UPDATE(Sno)
ON TABLE Student
FROM U4;
例题(续)
例 8 收回所有用户对表 SC的查询权限
REVOKE SELECT
ON TABLE SC
FROM PUBLIC;
例题(续)
例 9 把用户 U5对 SC表的 INSERT权限收回
REVOKE INSERT
ON TABLE SC
FROM U5;
权限的级联回收系统将收回直接或间接从 U5处获得的对 SC
表的 INSERT权限,
-->U5--> U6--> U7
收回 U5,U6,U7获得的对 SC表的 INSERT
权限,
<--U5<-- U6<-- U7
小结,SQL灵活的授权机制
DBA拥有对数据库中所有对象的所有权限,并可以根据应用的需要将不同的权限授予不同的用户。
用户 对自己建立的基本表和视图拥有全部的操作权限,
并且可以用 GRANT语句把其中某些权限授予其他用户 。
被授权的用户 如果有,继续授权,的许可,还可以把获得的权限再授予其他用户 。
所有授予出去的权力在必要时又都可以用 REVOKE语句 收回 。
数据库系统概论
An Introduction to Database System
第三章 关系数据库标准语言 SQL
(续 4)
第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7 嵌入式 SQL
3.8 小结
3.7 嵌 入 式 SQL
SQL语言提供了两种不同的使用方式:
交互式
嵌入式
为什么 要引入嵌入式 SQL
SQL语言是非过程性语言
事务处理应用需要高级语言
这两种方式细节上有差别,在程序设计的环境下,SQL语句要做某些必要的扩充宿主语言十嵌入式 SQL
预处理程序
宿主语言十函数调用
SQL函数定义库 宿主语言编译程序
目标程序
3.7.1嵌入式 SQL的一般 形式
为了 区分 SQL语句与主语言语句,需要,
前缀,EXEC SQL
结束标志:随主语言的不同而不同
以 C为主语言的嵌入式 SQL语句的一般形式
EXEC SQL <SQL语句 >;
例,EXEC SQL DROP TABLE Student;
嵌入 SQL语句说明性语句嵌入 SQL语句 数据定义可执行语句 数据控制数据操纵
允许出现可执行的高级语言语句的地方,都可以写可执行 SQL语句
允许出现说明语句的地方,都可以写说明性
SQL语句
3.7.2 嵌入式 SQL语句与主语言之间的 通信将 SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句
SQL语句
描述性的面向 集合 的语句
负责操纵 数据库
高级语言语句
过程性的面向 记录 的语句
负责 控制程序流程工作单元之间的通信方式
1,SQL通信区向主语言传递 SQL语句的执行 状态 信息主语言能够据此控制程序流程
2,主变量
1)主语言向 SQL语句提供 参数
2)将 SQL语句查询数据库的结果交主语言进一步处理
3,游标解决 集合 性操作语言与 过程性 操作语言的不匹配
1,SQL通信区
SQLCA,SQL Communication Area
SQLCA是一个数据结构
SQLCA的用途
DBMS SQL通信区 SQLCA 应用程序信息
SQLCA的内容
与所执行的 SQL语句有关
与该 SQL语句的执行情况有关
SQLCA的使用方法
定义 SQLCA
用 EXEC SQL INCLUDE SQLCA加以定义
使用 SQLCA
SQLCA中有一个存放每次执行 SQL语句后返回代码的变量 SQLCODE
2,主变量
什么是主变量
嵌入式 SQL语句中可以使用主语言的程序变量来输入或输出数据
在 SQL语句中使用的主语言程序变量简称 为主变量主变量(续)
主变量的类型
输入 主变量
由应用程序对其赋值,SQL语句引用
输出 主变量
由 SQL语句赋值或设置状态信息,返回给应用程序
一个主变量有可能既是输入主变量又是输出主变量主变量(续)
主变量的用途
输入主变量
指定向数据库中插入的数据
将数据库中的数据修改为指定值
指定执行的操作
指定 WHERE子句或 HAVING子句中的条件
输出主变量
获取 SQL语句的结果数据
获取 SQL语句的执行状态主变量(续)
指示变量
一个主变量可以附带一个指示变量
( Indicator Variable)
主变量(续)
在 SQL语句中使用主变量和指示变量的方法
1) 说明主变量和指示变量
BEGIN DECLARE SECTION
........,
........,(说明主变量和指示变量 )
.........
END DECLARE SECTION
主变量(续)
2) 使用主变量
说明之后的主变量可以在 SQL语句中任何一个能够使用表达式的地方出现
为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的主变量名前要加冒号(,)作为标志
3) 使用指示变量指示变量前也必须加冒号标志,必须紧跟在所指主变量之后主变量(续)
在 SQL语句之外 (主语言 语句中 )使用主变量和指示变量的方法
可以直接引用,不必加冒号
3,游标( cursor)
为什么要使用游标
SQL语言与主语言具有不同数据处理方式
SQL语言是面向 集合 的,一条 SQL语句原则上可以产生或处理多条记录游标(续)
主语言是面向 记录 的,一组主变量一次只能存放一条记录
仅使用主变量并不能完全满足 SQL语句向应用程序输出数据的要求
嵌入式 SQL引入了游标的概念,用来协调这两种不同的处理方式游标(续)
什么是游标
游标是系统为用户开设的一个 数据缓冲区,
存放 SQL语句的执行结果
用户可以用 SQL语句逐一从游标中获取记录,
并赋给主变量,交由主语言进一步处理嵌入式 SQL语句与主语言之间的通信 (续 )
小结
在嵌入式 SQL中,SQL语句与主语言语句分工非常明确
SQL语句,直接与数据库打交道
主语言语句
1,控制程序流程
2,对 SQL语句的执行结果做进一步加工处理嵌入式 SQL语句与主语言之间的通信 (续 )
SQL语句用 主变量 从主语言中接收执行参数,
操纵数据库
SQL语句的 执行状态 由 DBMS送至 SQLCA中
主语言程序从 SQLCA中取出状态信息,据此决定下一步操作
如果 SQL语句从数据库中成功地检索出数据,
则通过主变量传给主语言做进一步处理
SQL语言和主语言的不同数据处理方式通过游标 来协调嵌入式 SQL语句与主语言之间的通信 (续 )
例:带有嵌入式 SQL的一小段 C程序
............
EXEC SQL INCLUDE SQLCA;
/* (1) 定义 SQL通信区 */
EXEC SQL BEGIN DECLARE SECTION;
/* (2) 说明主变量 */
CHAR title_id(7);
CHAR title(81);
INT royalty;
EXEC SQL END DECLARE SECTION;
嵌入式 SQL语句与主语言之间的通信 (续 )
main()
{
EXEC SQL DECLARE C1 CURSOR FOR
SELECT tit_id,tit,roy FROM titles;
/* (3) 游标操作(定义游标) */
/* 从 titles表中查询 tit_id,tit,roy */
EXEC SQL OPEN C1;
/* (4) 游标操作(打开游标) */
嵌入式 SQL语句与主语言之间的通信 (续 )
for(;;)
{
EXEC SQL FETCH C1 INTO,title_id,:title,:royalty;
/* (5) 游标操作(将当前数据放入主变量并推进游标指针) */
if (sqlca.sqlcode <> SUCCESS)
/* (6) 利用 SQLCA中的状态信息决定何时退出循环 */
break;
printf("Title ID,%s,Royalty,%d",:title_id,:royalty);
printf("Title,%s",:title);
/* 打印查询结果 */
}
EXEC SQL CLOSE C1;
/* (7) 游标操作(关闭游标) */
}
3.7 嵌 入 式 SQL
3.7.1 嵌入式 SQL的一般形式
3.7.2 嵌入式 SQL语句与主语言之间的通信
3.7.3 不用游标的 SQL语句
3.7.4 使用游标的 SQL语句
3.7.5 动态 SQL简介
3.7.3 不用游标的 SQL语句
不用游标的 SQL语句的种类
说明性语句
数据定义语句
数据控制语句
查询结果为单记录的 SELECT语句
非 CURRENT形式的 UPDATE语句
非 CURRENT形式的 DELETE语句
INSERT语句一、说明性语句
说明性语句是专为在嵌入式 SQL中说明主变量,SQLCA等而设置的
说明主变量
1,EXEC SQL BEGIN DECLARE SECTION;
2,EXEC SQL END DECLARE SECTION;
这两条语句必须配对出现,相当于一个括号,
两条语句中间是主变量的说明
说明 SQLCA
3,EXEC SQL INCLUDE SQLCA
二、数据定义语句例 1 建立一个,学生,表 Student
EXEC SQL CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE,
Sname CHAR(20),
Ssex CHAR(1),
Sage INT,
Sdept CHAR(15));
三、数据控制语句例 2 把查询 Student表权限授给用户 U1
EXEC SQL GRANT SELECT ON
TABLE Student TO U1;
四、查询结果为单记录的 SELECT语句
语句格式
EXEC SQL SELECT [ALL|DISTINCT]
<目标列表达式 >[,<目标列表达式 >]...
INTO <主变量 >[<指示变量 >]
[,<主变量 >[<指示变量 >]]..,
FROM <表名或视图名 >[,<表名或视图名 >],..
[WHERE <条件表达式 >]
[GROUP BY <列名 1> [HAVING <条件表达式 >]]
[ORDER BY <列名 2> [ASC|DESC]];
查询结果为单记录的 SELECT语句(续)
对交互式 SELECT语句的扩充就是多了一个
INTO子句
把从数据库中找到的符合条件的记录,放到 INTO子句指出的主变量中去。
查询结果为单记录的 SELECT语句(续)
使用注意事项
1,使用主变量
INTO子句
WHERE子句的条件表达式
HAVING短语的条件表达式查询结果为单记录的 SELECT语句(续)
2,查询结果为空集
如果数据库中没有满足条件的记录,即查询结果为空,则 DBMS将 SQLCODE的值置为 100
3,查询结果为多条记录
程序出错,DBMS会在 SQLCA中返回错误信息查询结果为单记录的 SELECT语句(续)
例 3 根据学生号码查询学生信息。
假设已将要查询的学生的学号赋给了主变量 givensno
EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept
INTO,Hsno,:Hname,:Hsex,:Hage,:Hdept
FROM Student
WHERE Sno=:givensno;
Hsno,Hname,Hsex,Hage,Hdept和 givensno均是主变量,并均已在前面的程序中说明过了。
查询结果为单记录的 SELECT语句(续)
例 4 查询某个学生选修某门课程的成绩。
假设已将要查询的学生的学号赋给了主变量
givensno,将课程号赋给了主变量 givencno。
EXEC SQL SELECT Sno,Cno,Grade
INTO,Hsno,:Hcno,:Hgrade:Gradeid
FROM SC
WHERE Sno=:givensno AND
Cno=:givencno;
查询结果为单记录的 SELECT语句(续)
从提高应用程序的数据独立性角度考虑,
SELECT语句在任何情况下都应该使用游标
对于仅返回一行结果数据的 SELECT语句虽然可以不使用游标
但如果以后数据库改变了,该 SELECT语句可能会返回多行数据,这时该语句就会出错五、非 CURRENT形式的 UPDATE语句
非 CURRENT形式的 UPDATE语句
使用主变量
SET子句
WHERE子句
使用指示变量
SET子句
非 CURRENT形式的 UPDATE语句可以操作多条元组非 CURRENT形式的 UPDATE语句(续)
例 5 将全体学生 1号课程的考试成绩增加若干分。
假设增加的分数已赋给主变量 Raise
EXEC SQL UPDATE SC
SET Grade=Grade+:Raise
WHERE Cno='1';
非 CURRENT形式的 UPDATE语句(续)
例 6 修改某个学生 1号课程的成绩。
假设该学生的学号已赋给主变量 givensno,
修改后的成绩已赋给主变量 newgrade。
EXEC SQL UPDATE SC
SET Grade=:newgrade
WHERE Sno=:givensno;
非 CURRENT形式的 UPDATE语句(续)
例 7 将计算机系全体学生年龄置 NULL值
Sageid=-1;
EXEC SQL UPDATE Student
SET Sage=:Raise:Sageid
WHERE Sdept='CS';
非 CURRENT形式的 UPDATE语句(续)
将指示变量 Sageid赋一个负值后,无论主变量 Raise为何值,DBMS都会将 CS系所有记录的年龄属性置空值。它等价于:
EXEC SQL UPDATE Student
SET Sage=NULL
WHERE Sdept='CS';
六、非 CURRENT形式的 DELETE语句
非 CURRENT形式的 DELETE语句
使用主变量
WHERE子句
非 CURRENT形式的 DELETE语句可以操作多条元组非 CURRENT形式的 DELETE语句(续)
例 8 某个学生退学了,现要将有关他的所有选课记录删除掉。
假设该学生的姓名已赋给主变量 stdname
EXEC SQL DELETE
FROM SC
WHERE Sno=
(SELECT Sno
FROM Student
WHERE Sname=:stdname);
七,INSERT语句
非 CURRENT形式的 INSERT语句
使用主变量
VALUES子句
使用指示变量
VALUES子句
非 CURRENT形式的 INSERT语句一次只能输入一条元组
INSERT语句(续)
例 9 某个学生新选修了某门课程,将有关记录插入 SC表假设学生的学号已赋给主变量 stdno,课程号已赋给主变量 couno。
gradeid=-1;
EXEC SQL INSERT
INTO SC(Sno,Cno,Grade)
VALUES(:stdno,:couno,:gr:gradeid);
由于该学生刚选修课程,尚未考试,因此成绩列为空。
所以本例中用指示变量指示相应的主变量为空值。
3.7.4 使用游标的 SQL语句
必须使用游标的 SQL语句
查询结果为多条记录的 SELECT语句
CURRENT形式的 UPDATE语句
CURRENT形式的 DELETE语句一,查询结果为多条记录的 SELECT语句
使用游标的步骤
1,说明游标
2,打开游标
3,移动游标指针,然后取当前记录
4,关闭游标
1,说明游标
使用 DECLARE语句
语句格式
EXEC SQL DECLARE <游标名 > CURSOR
FOR <SELECT语句 >;
功能
是一条说明性语句,这时 DBMS并不执行
SELECT指定的查询操作。
2,打开游标
使用 OPEN语句
语句格式
EXEC SQL OPEN <游标名 >;
功能
打开游标实际上是 执行相应的 SELECT语句,把所有满足查询条件的记录从指定表取到缓冲区中
这时游标处于活动状态,指针指向查询结果集中第一条记录之前
3,移动游标指针,然后取当前记录
使用 FETCH语句
语句格式
EXEC SQL FETCH [[NEXT|PRIOR|
FIRST|LAST] FROM] <游标名 >
INTO <主变量 >[<指示变量 >]
[,<主变量 >[<指示变量 >]]...;
移动游标指针,然后取当前记录(续)
功能
指定方向推动游标指针,然后将缓冲区中的当前记录取出来送至主变量供主语言进一步处理。
NEXT|PRIOR|FIRST|LAST:指定推动游标指针的方式。
NEXT:向前推进一条记录
PRIOR:向回退一条记录
FIRST:推向第一条记录
LAST:推向最后一条记录
缺省值为 NEXT
移动游标指针,然后取当前记录(续)
说明
(1) 主变量必须与 SELECT语句中的目标列表达式具有一一对应关系
(2) FETCH语句通常用在一个循环结构中,通过循环执行 FETCH语句逐条取出结果集中的行进行处理
(3) 为进一步方便用户处理数据,现在一些关系数据库管理系统对 FETCH语句做了扩充,允许用户向任意方向以任意步长移动游标指针
4,关闭游标
使用 CLOSE语句
语句格式
EXEC SQL CLOSE <游标名 >;
功能
关闭游标,释放结果集占用的缓冲区及其他资源
说明
游标被关闭后,就不再和原来的查询结果集相联系
被关闭的游标可以再次被打开,与新的查询结果相联系例题例 1 查询某个系全体学生的信息(学号、姓名、
性别和年龄)。要查询的系名由用户在程序运行过程中指定,放在主变量 deptname中
......
.....,
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
例题(续)
......
/* 说明主变量
deptname,HSno,HSname,HSsex,HSage等 */
......
......
EXEC SQL END DECLARE SECTION;
......
......
gets(deptname); /* 为主变量 deptname赋值 */
......
例题(续)
EXEC SQL DECLARE SX CURSOR FOR
SELECT Sno,Sname,Ssex,Sage
FROM Student
WHERE SDept=:deptname; /* 说明游标 */
EXEC SQL OPEN SX /* 打开游标 */
例题(续)
WHILE(1) /* 用循环结构逐条处理结果集中的记录 */
{
EXEC SQL FETCH SX
INTO,HSno,:HSname,:HSsex,:HSage;
/* 将游标指针向前推进一行,然后从结果集中取当前行,送相应主变量 */
例题(续)
if (sqlca.sqlcode <> SUCCESS)
break;
/* 若所有查询结果均已处理完或出现
SQL语句错误,则退出循环 */
/* 由主语言语句进行进一步处理 */
......
......
};
例题(续)
EXEC SQL CLOSE SX; /* 关闭游标 */
......
......
例题(续)
例 2 查询某些系全体学生的信息。
......
......
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
......
/* 说明主变量
deptname,HSno,HSname,HSsex,HSage等 */
......
......
例题(续)
EXEC SQL END DECLARE SECTION;
......
......
......
EXEC SQL DECLARE SX CURSOR FOR
SELECT Sno,Sname,Ssex,Sage
FROM Student
WHERE SDept=:deptname; /* 说明游标 */
例题(续)
WHILE (gets(deptname)!=NULL) /* 接收主变量
deptname的值 */
{
/* 下面开始处理 deptname指定系的学生信息,
每次循环中 deptname可具有不同的值 */
EXEC SQL OPEN SX /* 打开游标 */
例题(续)
WHILE (1) { /* 用循环结构逐条处理结果集中的记录 */
EXEC SQL FETCH SX
INTO,HSno,:HSname,:HSsex,:HSage;
/* 将游标指针向前推进一行,然后从结果集中取当前行,送相应主变量 */
例题(续)
if (sqlca.sqlcode <> SUCCESS)
break;
/* 若所有查询结果均已处理完或出现
SQL语句错误,则退出循环 */
/* 由主语言语句进行进一步处理 */
......
......
}; /* 内循环结束 */
例题(续)
EXEC SQL CLOSE SX; /* 关闭游标 */
}; /* 外循环结束 */
......
......
二,CURRENT形式的 UPDATE语句和 DELETE语句
CURRENT形式的 UPDATE语句和 DELETE
语句的用途
非 CURRENT形式的 UPDATE语句和 DELETE
语句
面向集合的操作
一次修改或删除所有满足条件的记录二,CURRENT形式的 UPDATE语句和 DELETE语句
CURRENT形式的 UPDATE语句和 DELETE
语句的用途(续)
如果只想修改或删除其中 某个 记录
用带游标的 SELECT语句查出所有满足条件的记录
从中进一步找出要修改或删除的记录
用 CURRENT形式的 UPDATE语句和
DELETE语句修改或删除之
CURRENT形式的 UPDATE语句和 DELETE语句(续)
步骤
(1) DECLARE?
说明游标
(2) OPEN
打开游标,把所有满足查询条件的记录从指定表取至缓冲区
(3) FETCH
推进游标指针,并把当前记录从缓冲区中取出来送至主变量
CURRENT形式的 UPDATE语句和 DELETE语句(续)
(4) 检查该记录是否是要修改或删除的记录,是则处理之?
(5) 重复第 (3)和 (4)步,用逐条取出结果集中的行进行判断和处理
(6) CLOSE
关闭游标,释放结果集占用的缓冲区和其他资源
CURRENT形式的 UPDATE语句和 DELETE语句(续)
说明游标
为 UPDATE语句说明游标
使用带 FOR UPDATE OF <列名 >短语的
DECLARE语句
语句格式
EXEC SQL DECLARE <游标名 > CURSOR
FOR <SELECT语句 > FOR UPDATE
OF <列名 >;
FOR UPDATE OF <列名 >短语用于指明检索出的数据在指定列上是可修改的,以便
DBMS进行并发控制
CURRENT形式的 UPDATE语句和 DELETE语句(续)
为 DELETE语句说明游标
使用带 FOR UPDATE短语的 DECLARE语句
语句格式
EXEC SQL DECLARE <游标名 > CURSOR
FOR <SELECT语句 > FOR UPDATE;
FOR UPDATE短语提示 DBMS进行并发控制
CURRENT形式的 UPDATE语句和 DELETE语句(续)
修改或删除当前记录
经检查缓冲区中记录是要修改或删除的记录,
则用 UPDATE语句或 DELETE语句修改或删除该记录
语句格式
<UPDATE语句 > WHERE CURRENT OF <游标名 >
<DELETE语句 > WHERE CURRENT OF <游标名 >
WHERE CURRENT OF <游标名 >子句表示修改或删除的是该游标中最近一次取出的记录例题例 3 对某个系的学生信息,根据用户的要求修改其中某些人的年龄字段。
思路
查询某个系全体学生的信息 (要查询的系名由主变量 deptname指定)
然后根据用户的要求修改其中某些记录的年龄字段例题(续)
......
......
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
......
/* 说明主变量
deptname,HSno,HSname,HSsex,HSage,NEWAge等 */
......
例题(续)
......
EXEC SQL END DECLARE SECTION;
......
......
gets(deptname); /* 为主变量 deptname赋值
*/
......
例题(续)
EXEC SQL DECLARE SX CURSOR FOR
SELECT Sno,Sname,Ssex,Sage
FROM Student
WHERE SDept=:deptname
FOR UPDATE OF Sage; /* 说明游标 */
EXEC SQL OPEN SX /* 打开游标 */
例题(续)
WHILE(1) {/* 用循环结构逐条处理结果集中的记录 */
EXEC SQL FETCH SX INTO,HSno,:HSname,
:HSsex,:HSage;
/* 将游标指针向前推进一行,然后从结果集中取当前行,送相应主变量 */
例题(续)
if (sqlca.sqlcode <> SUCCESS)
break;
/* 若所有查询结果均已处理完或出现 SQL语句错误,则退出循环 */
printf("%s,%s,%s,%d",Sno,Sname,Ssex,
Sage);
/* 显示该记录 */
printf("UPDATE AGE? "); /* 问用户是否要修改 */
scanf("%c",&yn);
例题(续)
if (yn='y' or yn='Y') /* 需要修改 */
{
printf("INPUT NEW AGE,");
scanf("%d",&NEWAge); /* 输入新的年龄值
*/
EXEC SQL UPDATE Student
SET Sage=:NEWAge
WHERE CURRENT OF SX;
/* 修改当前记录的年龄字段 */
};
例题(续)
......
......
};
EXEC SQL CLOSE SX; /* 关闭游标 */
......
......
例题(续)
例 4 对某个系的学生信息,根据用户的要求删除其中某些人的记录。
......
......
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
......
/* 说明主变量
deptname,HSno,HSname,HSsex,HSage等 */
例题(续)
......
......
EXEC SQL END DECLARE SECTION;
......
......
gets(deptname); /* 为主变量 deptname赋值
*/
......
例题(续)
EXEC SQL DECLARE SX CURSOR FOR
SELECT Sno,Sname,Ssex,Sage
FROM Student
WHERE SDept=:deptname
FOR UPDATE; /* 说明游标 */
EXEC SQL OPEN SX /* 打开游标 */
例题(续)
WHILE(1){ /* 用循环结构逐条处理结果集中的记录 */
EXEC SQL FETCH SX INTO,HSno,:HSname,
:HSsex,:H
Sage;
/* 将游标指针向前推进一行,然后从结果集中取当前行,送相应主变量 */
例题(续)
if (sqlca.sqlcode <> SUCCESS)
break;
/* 若所有查询结果均已处理完或出现 SQL语句错误,则退出循环 */
printf("%s,%s,%s,%d",Sno,Sname,Ssex,
Sage);
/* 显示该记录 */
例题(续)
printf("DELETE? "); /* 问用户是否要删除 */
scanf("%c",&yn);
if (yn='y' or yn='Y') /* 需要删除 */
EXEC SQL DELETE
FROM Student
WHERE CURRENT OF SX; /* 删除当前记录
*/
例题(续)
......
......
};
EXEC SQL CLOSE SX; /* 关闭游标 */
......
......
3.7 嵌 入 式 SQL
3.7.1 嵌入式 SQL的一般形式
3.7.2 嵌入式 SQL语句与主语言之间的通信
3.7.3 不用游标的 SQL语句
3.7.4 使用游标的 SQL语句
3.7.5 动态 SQL简介
3.7.5 动态 SQL简介
静态嵌入式 SQL
动态嵌入式 SQL
一、静态 SQL的特点
用户可以在程序运行过程中根据实际需要输入 WHERE子句或 HAVING子句中某些变量的 值 。
语句中主变量的 个数与数据类型 在预编译时都是确定的,只有是主变量的 值 是程序运行过程中动态输入的。
静态 SQL的不足静态 SQL语句提供的编程 灵活性 在许多情况下仍显得不足,不能编写更为通用的程序。
需求例,对 SC:
任课教师想查选修某门课程的所有学生的学号及其成绩
班主任想查某个学生选修的所有课程的课程号及相应成绩
学生想查某个学生选修某门课程的成绩即:查询 条件是不确定 的,要查询的 属性列 也是不确定的二、动态 SQL
1,什么是动态嵌入式 SQL
动态 SQL方法允许在程序运行过程中临时,组装,SQL语句。
2,应用范围
在 预编译 时下列信息不能确定时
SQL语句正文
主变量个数
主变量的数据类型
SQL语句中引用的数据库对象(列、索引、基本表、视图等)
动态 SQL(续)
3,动态 SQL的形式
语句可变
临时构造完整的 SQL语句
条件可变
WHERE子句中的条件
HAVING短语中的条件
数据库对象、查询条件均可变
SELECT子句中的列名
FROM子句中的表名或视图名
WHERE子句中的条件
HAVING短语中的条件动态 SQL(续)
4,常用动态 SQL语句
EXECUTE IMMEDIATE
PREPARE
EXECUTE
DESCRIBE
使用动态 SQL技术更多的是涉及程序设计方面的知识,而不是 SQL语言本身第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7嵌入式 SQL
3.8 小结
3.8 小 结
SQL的特点
⒈ 综合统一
2,度非过程化
3,面向集合的操作方式
4,同一种语法结构提供两种使用方式
5,语言简捷,易学易用小结(续)
交互式 SQL
数据定义
查询
数据更新
数据控制小结(续)
表 3.1 SQ L 语言的动词
SQ L 功能 动 词数 据 查 询 SEL EC T
数 据 定 义 C R E A T E,D R O P,A L T E R
数 据 操 纵 INS E R T,U P D A T E,
DELET E
数 据 控 制 G R A N T,R EV O K E
小结(续)
嵌入式 SQL
与主语言的通信方式
1,SQL通信区
向主语言传递 SQL语句的执行状态信息
2,主变量
1)主语言向 SQL语句提供参数
2)将 SQL语句查询数据库的结果交主语言进一步处理
3,游标
解决集合性操作语言与过程性操作语言的不匹配小结(续)
嵌入式 SQL(续 )
静态 SQL
不用游标
不需要返回结果数据的 SQL语句
只返回一条结果的 SQL语句
使用游标
说明游标
打开游标
推进游标并取当前记录
关闭游标
动态 SQL
第二、三章的复习
关系数据结构:表关系模型 关系操作 (关系代数、关系演算,SQL)
完整性约束实体完整性、
参照完整性用户定义完整性
1,关系中没有行序的原因是 __.
2,关系中不允许有重复元组的原因是 __
3,关系模型的基本数据结构是 __
4,实体完整性是对 __(键)的约束,参照完整性是对 __的约束。
5,关系代数的基本操作是 ____。
6,等式 R∞S = R× S成立的条件是 __
7、关系的并、差、交操作,要求两个关系具有 __。
8、一般,在关系代数运算中,当查询涉及到,否定,时,就要用到 __操作;当查询涉及到,全部值,时,就要用到 __
操作
9、在关系中,,元数,是指
A、行数 B、元组个数 C、关系个数 D、
列数
10、在关系中,,基数,是指()
A、行数 B、属性个数
C、关系个数 D、列数
11、设关系 R,S,W各有 10个元组,那么这 3个关系的自然连接的元组个数有
A,10 B,30
C,1000 D、不确定(与计算结果有关
11,设 W= R∞ S(条件为 iθj),且 W,R,S的元组个数分别为 p,m,n,那么三者之间满足
A,p<(m+n) B,P≤(m+ n)
C,p<(m× n) D,P≤(m× n)
12,设关系 R和 S的结构相同,且各有 10个元组,
那么这两个关系的并操作结果的元组个数为
A,10 B、小于等于 10
C,20 D、小于等于 20
13,设关系 R和 S的属性个数分别为 2和 3,那么 R ∞ S
(条件为 1<2)等价于
A,σ1<2(R× S) B,σ1<4(R× S)
C,σ1<2(R ∞ S) D,σ1<4(R ∞ S)
14,如果两个关系没有公共属性,那么其自然连接
A、转化为笛卡尔积操作 B、转化为连接操作
C、转化为外部并操作 D、结果为空关系
15,下列式子中,不正确的是
A,R- S= R-( R ∩ S)
B,R=( R- S) U( R ∩ S)
C,R ∩ S= S-( S- R)
D,R ∩ S= S-( R- S)
16,关系代数中的 θ连接操作由()操作组合而成。
A,σ和 π B,σ和 × C,σ,π和 × D,π和 ×
17,设四元关系 R( A,B,C,D),则下面不正确的是()
A,πD,B( R)为取属性 D,B的两列组成新关系
B,π4,2( R)为取属性的值为 4,2的两列组成新关系
C,πD,B( R)与 π4,2( R)是等价的
D,πD,B( R) π4,2( R)是相同关系
18,设 R为 K元关系,则 σ 2>’4’( R) 表示()
A、从 R中挑选 2的值大于 4个分量值的元组所组成的关系
B、从 R中挑选第 2个分量值大于 4的元组所构成的关系。
C、从 R中挑选第 2个分量值大于 4个分量值的元组所构成的关系
D,σ 2>’4’( R) 和 R相比,基数不变,元数减少
19,有关系,R( A,B,C),主键= A;
S( D,A),主键= D,外键= A,参照 R
的属性 A,关系 R和 S的元组如下所示。指出关系 S中违反关系完整性规则的元组是
()
A、( 1,2) B、( 2,null) C、( 3,3) D、
( 4,1)
R
A B C
3 6 7
2 5 7
D A
1 2
2 null
3 3
4 1
S
20,自然连接是构成新关系的有效方法。
一般情况下,要求 R和 S含有一个或多个共有的()
A、元组 B、行 C、记录 D、属性
21、设有属性 A,B,C,D,以下表示中不是关系的是()
A,R( A) B,R( A,B,C,D)
C,R( A× B× C× D) D,R( A,B)
22,设关系 R( A,B,C)和 S( B,C,
D),下列各关系代数表达式不成立的是
()
A,πA( R) ∞ πD( S) B,R ∪ S
C,πB( R) ∩ πB( S) D,R∞ S
23、关系模式的任何属性()
A、不可再分 B、可再分
C、命名在该关系模式中可以不唯一
D、以上都不是
24、试述等值连接和自然连接的区别。
25、在参照完整性中,外码的属性值能否为空?什么时候可以为空?
26,设有如下所示的两个关系 E1和 E2,其中 E2是从 E1中经过关系代数运算所形成的结果,试给出该运算的表达式。
E1
A B C
1 2 3
4 5 6
7 8 9
D A
5 6
8 9
E2
27、
R A B C
3 6 7
2 5 7
7 2 3
4 4 3
A B C
3 4 5
7 2 3
计算,RUS,R- S,R ∩ S,R× S,π3,2(S),
σB<‘5’(R),R S,R S
S
2<2
第三章
1,在 SQL中,关系模式称为 ___,子模式
(外模式)称为 ___,元组称为 ___,属性称为 ___。
2,SQL中,表有两种,___和 ___,也称为
___和 ___。
3,基本表中,,主键,概念应该体现其值的 ___和 ___两个特征。
4,操作,元组 IN (集合),的语义是
___
5,表达式中的通配符,%,表示 ___,
,_‖表示 ___
6,操作,元组 >SOME(集合),的语义是 ___
7,操作,元组 <ALL(集合),的语义是 ___
8,SQL有两种使用方式,___和 ___。
9,嵌入式 SQL的预处理方式,是指预处理程序先对源程序进行扫描,识别出 ___,
并处理成宿主语言的 ___形式。
10,为保证嵌入式 SQL的实现,通常
DBMS制造商提供一个 ___,供编译时使用。
11,SQL语句在嵌入在 C语言程序中时,
必须加上前缀标识 ___和结束标志 ___
12,在 SQL中,用户可以直接进行查询操作的是
A、实表和虚表 B、基本表和实表
C、视图和虚表 D、基本表
13,SQL中,与,NOT IN”等价的操作是
A、= SOME B,<>SOME
C,=ALL D,<>ALL
14,SQL中,谓词 EXISTS可用来测试一个集合是否
A、有重复元组 B、有重复的列名
C、为非空集合 D、有空值
15,基本表 EMP( ENO,ENAME,SALARY,DNO)
表示职工的工号、姓名、工资和所在部门的编号。
基本表 DEPT( DNO,DNAME)表示部门的编号和部门名。
有一 SQL语句,SELECT COUNT(DISTINCT DNO)
FROM EMP;
其等价的查询语句是
A、统计职工的总人数 B、统计每一部门的职工人数
C、统计职工服务的部门数目 D、统计每一职工服务的部门数目
EMP( ENO,ENAME,SALARY,DNO)
DEPT( DNO,DNAME)
16,SELECT ENO,ENAME
FROM EMP
WHERE DNO NOT IN
(SELECT DNO FROM DEPT WHERE
DNAME=?金工车间 ’ );
其等价的关系代数表达式
17,UPDATE EMP
SET SALARY= SALARY*1.05
WHERE DNO=?D6‘
AND SALARY<(SELECT AVG(SALARY)
FROM EMP);
其等价的修改语句为
A、为工资低于 D6部门平均工资的所有职工加薪 5%
B、为工资低于整个企业平均工资的职工加薪 5%
C、为在 D6部门工资、工资低于整个企业平均工资的职工加薪
5%
D、为在 D6部门工资、工资低于本部门平均工资的职工加薪 5%
18,有关嵌入式 SQL的叙述中,不正确的是
A、宿主语言是指 C一类高级程序设计语言
B、宿主语言是指 SQL语言
C、在程序中要区分 SQL语句和宿主语言语句
D,SQL有交互式和嵌入式两种使用方式
19,允许在嵌入的 SQL语句中,引用宿主语言的程序变量,在引用时
A、直接引用
B、这些变量前必须加符号 *
C、这些变量前必须加符号:
D、这些变量前必须加符号 &
20,如果嵌入的 SELECT语句的查询结果肯定是单元组,那么嵌入时
A、肯定不涉及游标机制
B、必须使用游标机制
C、是否使用游标,由程序员决定
D、是否使用游标,由 DBMS决定。
21,请问 SQL的 GRANT和 REVOKE命令属于数据库保护中的()控制
A、完整性 B、安全性
C、并发控制 D、恢复机制
22,SQL语句中,实现数据检索的语句是()
A,SELECT B,INSERT
C,UPDATE D,FIND
23,下列 SQL语句中,修改表结构的是()
A,ALTER B,CREATE
C,UPDATE D,DELETE
24,在 SQL中,如果希望将查询结果排序,应在
SELECT语句中使用()子句
A,ASC B,HAVING
C,DESC D,ORDER BY
25,在 SQL语言中,创建基本表应使用()
语句
A,CREATE VIEW B,CREATE SCHEMA
C,CREATE INDEX D,CREATE TABLE
26,在 SQL语句中,用于测试子查询是否为空的谓词是()
A,EXISTS B,UNIQUE C.SOME D.ALL
27,在 SQL中,建立唯一索引要用到()保留字
A,PRIMARY B,UNIQUE
C,INDEX D,DISTINCT
28,视图创建后,数据库中存放的是()
A、查询语句 B、查询结果
C、视图定义 D、所引用的基本表的定义
29,视图是一个,虚表,,视图的构造基于
()
A、基本表 B、视图
C、基本表或视图 D、数据字典
30,在视图上不能完成的操作是()
A、更新视图 B、查询
C、在视图上定义新的基本表 D、在视图上定义新视图
31,在 WHERE子句的条件表达式中,可以用
()通配符与所在位置的单个字符相匹配。
A),B)% C)? D) _
32,向基本表中增加一个新列后,原有元组在该列上的值是()
A) True B) False C)空值 D)不确定
33,嵌入式 SQL语句中引用主变量时,必须在变量名前加()标志。
A、逗号 B、冒号 C、分号 D、句号
34,在 SELECT语句中,与关系代数中 ∏运算符对应的是()子句
A,SELECT B,FROM
C,WHERE D,GROUP BY
35,在 SELECT语句的下列子句中,通常和 HAVING子句同时使用的是()
A,ORDER BY B,WHERE
C,GROUP BY D、均不需要
36,假定学生关系是 S( S#,Sname,Sex,
Age),课程关系是 C( C#,Cname,
TEACHER),学生选课关系是 SC( S#,
C#,Grade)。要查找选修,数据库系统概论,课程的,男,学生学号,将涉及关系()
A,S B,SC,C
C,S,SC D,S,SC,C
37、为什么将 SQL的视图称为,虚表,?
38、所有的视图是否都可以更新?为什么?
39、相关子查询和不相关子查询在执行上有什么不同?
40、在嵌入式 SQL中是如何区分 SQL语句和主语言语句的?
41、在嵌入式 SQL中是如何解决数据库工作单元与源程序工作单元之间通信的?
42、试述 DELETE语句与 DROP TABLE语句的区别。
43,SQL的集合处理方式与宿主语言的单记录处理方式之间是如何协调的?
S( S#,SNAME,AGE,SEX),
SC(S#,C#,GRADE),
C(C#,CNAME,TEACHER),
用 SQL语句写出下列对 S,SC,C的查询要求:
1)统计有学生选修的课程门数
2)求选修 C4课程的女学生的平均成绩
3)求 LIU老师所授课程的每门课的平均成绩
4)统计每门课程的学生选修人数(超过 10人的课程才统计)。要求显示课程号和人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
5)检索学号比 WANG同学大,而年龄比他小的学生姓名
6)在表 SC中检索成绩为空值的学生学号和课程号
7)检索姓名以 L打头的所有学生的姓名和年龄
8)求年龄大于女同学平均年龄的男生姓名和年龄
9)往关系 C中插入一个课程元组
( ’ C8‘,‘VC++‘,‘BAO‘)
10)检索所授每门课程平均成绩均大于 80分的教师姓名,并把检索到的值送往另一个已存在的表 FACULTY( TNAME)
11)在 SC中删除尚无成绩的选课元组
12)把 MATHS课不及格的成绩全改为 60分
13)在表 SC中,当某个成绩低于全部课程的平均成绩时,提高 5%。
设有基本表 R( A,B,C)和 S( A,B,C),试用 SQL语句表示下列关系代数表达式。
① R U S ② R ∩ S
③ R- S ④ R× S
⑤ ∏A,B(R) ∏B,C(S)
⑥ ∏1,6(σ3=4(R× S))
⑦ ∏1,2,3((R S))
8,R÷ ∏C(S)
下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第四章 关系系统及其查询优化第四章 关系系统及其查询优化
4.1 关系系统
4.2 关系系统的查询优化
4.3 小结关系系统
能够 在一定程度上 支持关系模型的数据库管理系统是关系系统 。
由于关系模型中并非每一部分都是 同等 重要的
并不苛求一个实际的关系系统必须 完全 支持关系模型 。
关系系统与关系模型
关系数据结构
域及域上定义的关系
关系操作
并、交、差、广义笛卡尔积、选择、投影、连接、
除等
关系完整性
实体完整性、参照完整性、用户自己定义的完整性关系系统的定义一个数据库管理系统可定义为关系系统,当且仅当它至少支持:
1,关系数据库 ( 即关系数据结构 )
系统中只有表这种结构
2,支持选择、投影和(自然)连接运算对这些运算不要求用户定义任何物理存取路径对关系系统的 最低 要求关系系统的定义
● 不支持关系数据结构的系统显然不能称为关系系统
● 仅支持关系数据结构,但没有选择,投影和连接运算功能的系统仍不能算作关系系统 。
原因:不能提高用户的生产率
支持选择、投影和连接运算,但要求定义物理存取路径,这种系统也不能算作真正的关系系统
原因:就降低或丧失了数据的物理独立性
选择、投影、连接运算是最有用的运算
4.1.2 关系系统的分类
分类依据:支持关系模型的程度
分类
⒈ 表式系统:支持关系数据结构 (即表 )
⒉ (最小 )关系系统支持:关系数据结构选择、投影、连接关系操作
⒊ 关系完备的系统支持:关系数据结构所有的关系代数操作
⒋ 全关系系统支持:关系模型的所有特征特别是,数据结构中域的概念关系系统的分类 (续)
数据结构 数据操作 完整性表式系统 表
(最小 )关系系统 表 选择,投影,
连接
关系完备的系统 表
全关系系统
第四章 关系系统及其查询优化
4.1 关系系统
4.2 关系系统的查询优化
4.3 小结
4.2 关系系统的查询优化
4.2.1 查询优化概述
4.2.2 查询优化的必要性
4.2.3 查询优化的一般准则
4.2.4 关系代数等价变换规则
4.2.5 关系代数表达式的优化算法
4.2.6 优化的一般步骤
4.2.1 查询优化概述
查询优化的必要性
查询优化极大地影响 RDBMS的性能 。
查询优化的可能性
关系数据语言的 级别很高,使 DBMS可以从关系表达式中分析查询 语义 。
由 DBMS进行查询优化的好处
用户不必考虑如何最好地表达查询以获得较好的效率
系统可以比用户程序的 优化 做得更好
(1) 优化器可以从数据字典中获取许多统计信息,
而用户程序则难以获得这些信息由 DBMS进行查询优化的好处
(2)如果数据库的物理统计信息改变了,系统可以自动对查询 重新优化 以选择相适应的执行计划 。
在非关系系统中必须重写程序,而重写程序在实际应用中往往是不太可能的 。
(3)优化器可以考虑数百种不同的执行计划,而程序员一般只能考虑有限的几种可能性 。
(4)优化器中包括了很多复杂的优化技术查询优化目标
查询优化的总目标选择有效策略,求得给定关系表达式的值
实际系统的查询优化步骤
1,将查询转换成某种内部表示,通常是语法树
2,根据一定的等价变换规则把语法树转换成标准
( 优化 ) 形式实际系统的查询优化步骤
3,选择低层的操作算法对于语法树中的每一个操作
计算各种执行算法的执行代价
选择代价小的执行算法
4,生成查询计划 (查询执行方案 )
查询计划是由一系列内部操作组成的 。
代价模型
集中式数据库
单用户系统总代价 = I/O代价 + CPU代价
多用户系统总代价 = I/O代价 + CPU代价 + 内存代价
分布式数据库总代价 = I/O代价 + CPU代价 [+ 内存代价 ] + 通信代价
4.2.2 查询优化的必要性例:求选修了课程C 2的学生姓名
SELECT Student.Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno
AND SC.Cno='2';
查询优化的必要性(续)
假设 1:外存:
Student:1000条,SC:10000条,选修 2号课程,50条假设 2:一个内存块装元组,10个 Student,或 100个 SC,
内存中一次可以存放,5块 Student元组,
1块 SC元组和若干块连接结果元组假设 3:读写速度,20块 /秒假设 4:连接方法,基于数据块 的嵌套循环法执行策略 1
Q 1 = П S name(бStudent.Sno=SC.Sno ∧ SC.Cno='2'
(Student× SC))
① Student× SC
读取总块数 = 读 Student表块数 + 读 SC表遍数
*每遍块数
=1000/10+(1000/(10× 5)) × (10000/100)
=100+20× 100=2100
读数据时间 =2100/20=105秒不同的执行策略,考虑 I/O时间中间结果大小 = 1000*10000 = 107 (1千万条元组 )
写中间结果时间 = 10000000/10/20 = 50000秒
② б
读数据时间 = 50000秒
③ П
总时间 =105+ 50000+ 50000秒 = 100105秒
= 27.8小时查询优化的必要性(续)
2,Q 2= ПS name(бSC.Cno=' 2' (Student SC))
①
读取总块数 = 2100块读数据时间 =2100/20=105秒中间结果大小 =10000 ( 减少 1000倍 )
写中间结果时间 =10000/10/20=50秒
② б
读数据时间 =50秒
③ П
总时间 = 105+ 50+ 50秒= 205秒 =3.4分查询优化的必要性(续)
3,Q 2= ПSname(Student бSC.Cno=' 2' (SC))
① б
读 SC表总块数 = 10000/100=100块读数据时间 =100/20=5秒中间结果大小 =50条 不必写入外存
②
读 Student表总块数 = 1000/10=100块读数据时间 =100/20=5秒
③ П
总时间 = 5+ 5秒= 10秒查询优化的必要性(续)
4,Q 2= ПS name(Student бSC.Cno='2' (SC))
假设 SC表在 Cno上有索引,Student表在 Sno上有索引
① б
读 SC表索引 =
读 SC表总块数 = 50/100<1块读数据时间中间结果大小 =50条 不必写入外存查询优化的必要性(续)
②
读 Student表索引 =
读 Student表总块数 = 50/10=5块读数据时间
③ П
总时间 <10秒
4.2.3 查询优化的一般准则
选择运算应尽可能先做
目的:减小中间关系
在执行连接操作前对关系适当进行预处理
按连接属性排序
在连接属性上建立索引
投影运算和选择运算同时做
目的:避免重复扫描关系
将投影运算与其前面或后面的双目运算结合
目的:减少扫描关系的遍数查询优化的一般准则 (续)
某些选择运算+在其前面执行的笛卡尔积
===> 连接运算例,бStudent.Sno=SC.Sno (Student× SC)
Student SC
提取公共子表达式
4.2.4 关系代数等价变换规则
关系代数表达式等价
指用相同的关系代替两个表达式中相应的关系所得到的结果是相同的
上面的优化策略大部分都涉及到代数表达式的变换常用的等价变换规则设 E1,E2等是关系代数表达式,F是条件表达式
l,连接、笛卡尔积交换律
E1× E2≡ E2× E1
E1 E2≡ E2 E1
E1 F E2≡ E2 F E1
关系代数等价变换规则(续)
2,连接,笛卡尔积的结合律
(E1× E2) × E3 ≡ E1 × (E2× E3)
(E1 E2) E3 ≡ E1 (E2 E3)
(E1 E2) E3 ≡ E1 (E2 E3)
F F F F
关系代数等价变换规则(续)
3,投影的串接定律
πA1,A2,?,An(π B1,B2,?,Bm(E))≡ πA1,A2,?,An (E)
假设:
1)E是关系代数表达式
2)Ai(i=1,2,…,n),Bj(j=l,2,…,m)是属性名
3){A1,A2,…,An}构成 {Bl,B2,…,Bm}的子集关系代数等价变换规则(续)
4,选择的串接定律
бF1 ( б F2( E)) ≡ бF1∧ F2(E)
选择的串接律说明 选择条件可以合并
这样一次就可检查全部条件 。
关系代数等价变换规则(续)
5,选择与投影的交换律
(1)假设,选择条件 F只涉及属性 A1,…,An
бF (πA1,A2,?,An(E))≡ πA1,A2,?,An(бF(E))
(2)假设,F中有不属于 A1,…,An的属性 B1,…,Bm
π A1,A2,?,An (бF (E))≡
πA1,A2,?,An(бF (πA1,A2,?,An,B1,B2,?,Bm(E)))
关系代数等价变换规则(续)
6,选择与笛卡尔积的交换律
(1) 假设,F中涉及的属性都是 E1中的属性
бF (E1× E2)≡ бF (E1)× E2
(2) 假设,F=F1∧ F2,并且 F1只涉及 E1中的属性,
F2只涉及 E2中的属性则由上面的等价变换规则 1,4,6可推出:
бF(E1× E2) ≡ бF1(E1)× бF2 (E2)
关系代数等价变换规则(续)
(3) 假设,F=F1∧ F2,
F1只涉及 E1中的属性,
F2涉及 E1和 E2两者的属性
бF(E1× E2)≡ б F2(бF1(E1)× E2)
它使部分选择在笛卡尔积前先做关系代数等价变换规则(续)
7,选择与并的交换假设,E=E1∪ E2,E1,E2有相同的属性名
бF(E1∪ E2)≡ бF(E1)∪ бF(E2)
8,选择与差运算的交换假设,E1与 E2有相同的属性名
бF(E1-E2)≡ бF(E1) - бF(E2)
关系代数等价变换规则(续)
9,投影与笛卡尔积的交换假设,E1和 E2是两个关系表达式,
A1,…,An是 E1的属性,
B1,…,Bm是 E2的属性
π A1,A2,…,An,B1,B2,…,Bm ( E1× E2)≡
π A1,A2,…,An( E1)× π B1,B2,…,Bm(E2)
关系代数等价变换规则(续)
l0,投影与并的交换假设,E1和 E2 有相同的属性名
π A1,A2,…,An(E1∪ E2)≡
π A1,A2,…,An(E1)∪ π A1,A2,…,An(E2)
小结
1-2,连接,笛卡尔积 的交换律,结合律
3,合并或分解 投影 运算
4,合并或分解 选择 运算
5-8,选择运算与其他运算交换
5,9,10,投影运算与其他运算交换
4.2 关系系统的查询优化
4.2.1 查询优化概述
4.2.2 查询优化的必要性
4.2.3 查询优化的一般准则
4.2.4 关系代数等价变换规则
4.2.5 关系代数表达式的优化算法
4.2.6 优化的一般步骤
4.2.5 关系代数表达式的优化算法算法:关系表达式的优化输入:一个关系表达式的语法树 。
输出:计算该表达式的程序 。
方法:
( 1) 分解选择运算利用规则 4把形如 бF1 ∧ F2 ∧ … ∧ Fn (E)变换为
бF1 (бF2(… (бFn(E))… ))
关系代数表达式的优化算法 (续 )
( 2) 通过交换选择运算,将其尽可能移到叶端对每一个选择,利用规则 4~ 8尽可能把它移到树的叶端 。
( 3) 通过交换投影运算,将其尽可能移到叶端对每一个投影利用规则 3,9,l0,5中的一般形式尽可能把它移向树的叶端 。
关系代数表达式的优化算法 (续 )
( 4) 合并串接的选择和投影,以便能同时执行或在一次扫描中完成
利用规则 3~ 5把选择和投影的串接合并成单个选择,单个投影或一个选择后跟一个投影 。
使多个选择或投影能同时执行,或在一次扫描中全部完成
尽管这种变换似乎违背,投影尽可能早做,
的原则,但这样做效率更高 。
关系代数表达式的优化算法 (续 )
( 5) 对内结点分组
把上述得到的语法树的内节点分组 。
每一双目运算 (×,,∪,-)和它所有的直接祖先为一组 (这些直接祖先是 б,π运算 )。
如果其后代直到叶子全是单目运算,则也将它们并入该组,但当双目运算是笛卡尔积
(× ),而且其后的选择不能与它结合为等值连接时除外 。 把这些单目运算单独分为一组 。
关系代数表达式的优化算法 (续 )
( 6) 生成程序
生成一个程序,每组结点的计算是程序中的一步 。
各步的顺序是任意的,只要保证任何一组的计算不会在它的后代组之前计算 。
4.2 关系系统的查询优化
4.2.1 查询优化概述
4.2.2 查询优化的必要性
4.2.3 查询优化的一般准则
4.2.4 关系代数等价变换规则
4.2.5 关系代数表达式的优化算法
4.2.6 优化的一般步骤
4.2.6 优化的一般步骤
1,把查询转换成某种内部表示
2,代数优化:把语法树转换成标准 ( 优化 )
形式
3,物理优化:选择低层的存取路径
4.生成查询计划,选择代价最小的优化的一般步骤 (续 )
( 1) 把查询转换成某种内部表示例:求选修了课程C 2的学生姓名
SELECT Student.Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno
AND SC.Cno='2';
( 1)把查询转换成某种内部表示语法树 结果
project(Sname)
select(SC.Cno=?2?)
join(Student.Sno=SC.Sno)
Student SC
关系代数语法树
πSname
SC.Cno=’2’
Student.Sno=SC.S
×
Student SC
( 2)代数优化利用优化算法把语法树转换成标准 ( 优化 ) 形式
πSname
Student.Sno=SC.Sno
SC.Cno=?2?
×
Student
SC
( 3)物理优化:选择低层的存取路径
- 优化器查找数据字典获得当前数据库状态信息
选择字段上是否有索引
连接的两个表是否有序
连接字段上是否有索引
– 然后根据一定的优化规则选择存取路径如本例中若 SC表上建有 Cno的索引,则应该利用这个索引,而不必顺序扫描 SC表 。
( 4)生成查询计划,选择代价最小的
– 在作连接运算时,若两个表 (设为 R1,R2)均无序,连接属性上也没有索引,则可以有下面几种查询计划,
对两个表作排序预处理
对 R1在连接属性上建索引
对 R2在连接属性上建索引
在 R1,R2的连接属性上均建索引
– 对不同的查询计划计算代价,选择代价最小的一个 。
– 在计算代价时主要考虑磁盘读写的 I/O数,内存 CPU处理时间在粗略计算时可不考虑 。
第四章 关系系统及其查询优化
4.1 关系系统
4.2 关系系统的查询优化
4.3 小结
4.3 小结
关系系统
关系系统的定义一个数据库管理系统可定义为关系系统,当且仅当它至少支持:
1,关系数据库 ( 即关系数据结构 )
2,支持选择、投影和(自然)连接运算,
且不要求用户定义任何物理存取路径小结 (续)
关系系统的分类
表式系统
(最小 )关系系统
关系完备系统
全关系系统小结 (续)
关系系统的查询优化
代数优化:关系代数表达式的优化
关系代数等价变换规则
关系代数表达式的优化算法
物理优化:存取路径和低层操作算法的选择下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第五章 关系数据理论第五章 关系数据理论
5.1 问题的提出
5.2 规范化
5.3 数据依赖的公理系统
*5.4 模式的分解
5.5 小结
5.1 问题的提出关系数据库逻辑设计
针对具体问题,如何构造一个适合于它的数据模式
数据库逻辑设计的工具 ── 关系数据库的规范化理论问题的提出一、概念回顾二、关系模式的形式化定义三、什么是数据依赖四、关系模式的简化定义五、数据依赖对关系模式影响一、概念回顾
关系,描述实体、属性、实体间的联系。
从形式上看,它是一张二维表,是所涉及属性的笛卡尔积的一个子集。
关系模式,用来定义关系。
关系数据库,基于关系模型的数据库,利用关系来描述现实世界。
从形式上看,它由一组关系组成。
关系数据库的模式,定义这组关系的关系模式的全体。
二、关系模式的形式化定义关系模式由五部分组成,即它是一个五元组:
R(U,D,DOM,F)
R,关系名
U,组成该关系的属性名集合
D,属性组 U中属性所来自的域
DOM:属性向域的映象集合
F,属性间数据的依赖关系集合三、什么是数据依赖
1,完整性约束的表现形式
限定属性取值范围:例如学生成绩必须在 0-100之间
定义属性 值 间的相互关连(主要体现于值的 相等与否 ),这就是数据依赖,它是数据库模式设计的关键什么是数据依赖(续)
2,数据依赖
是通过一个关系中属性间值的相等与否体现出来的数据间的相互关系
是现实世界属性间相互联系的抽象
是数据内在的性质
是 语义 的体现什么是数据依赖(续)
3,数据依赖的类型
函数依赖( Functional Dependency,简记为 FD)
多值依赖( Multivalued Dependency,简记为 MVD)
其他四、关系模式的简化表示
● 关系模式 R( U,D,DOM,F)
简化为一个三元组:
R( U,F)
● 当且仅当 U上的一个关系 r 满足 F时,r称为关系 模式 R( U,F)的一个 关系五,数据依赖对关系模式的影响例:描述学校的数据库:
学生的学号( Sno)、所在系( Sdept)
系主任姓名( Mname)、课程名( Cname)
成绩( Grade)
单一 的关系模式,Student <U,F>
U ={ Sno,Sdept,Mname,Cname,Grade }
数据依赖对关系模式的影响(续)
学校数据库的语义:
⒈ 一个系有若干学生,一个学生只属于一个系;
⒉ 一个系只有一名主任;
⒊ 一个学生可以选修多门课程,每门课程有若干学生选修;
⒋ 每个学生所学的每门课程都有一个成绩。
数据依赖对关系模式的影响(续)
属性组 U上的一组函数依赖 F:
F ={ Sno → Sdept,Sdept → Mname,
(Sno,Cname) → Grade }
Sno Cname
Sdept Mname
Grade
关系模式 Student<U,F>中存在的问题
⒈ 数据冗余太大
浪费大量的存储空间例:每一个系主任的姓名重复出现
⒉ 更新异常( Update Anomalies)
数据冗余,更新数据时,维护数据完整性代价大。
例:某系更换系主任后,系统必须修改与该系学生有关的每一个元组关系模式 Student<U,F>中存在的问题
⒊ 插入异常( Insertion Anomalies)
该插的数据插不进去例,如果一个系刚成立,尚无学生,我们就无法把这个系及其系主任的信息存入数据库。
⒋ 删除异常( Deletion Anomalies)
不该删除的数据不得不删例,如果某个系的学生全部毕业了,我们在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了。
数据依赖对关系模式的影响(续)
结论:
Student关系模式不是一个好的模式。
,好,的模式:
不会发生插入异常、删除异常、更新异常,
数据冗余应尽可能少。
原因,由存在于模式中的 某些数据依赖 引起的解决方法,通过 分解 关系模式来消除其中不合适的数据依赖。
5.2 规范化规范化理论 正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、
更新异常和数据冗余问题。
5.2.1 函数依赖一、函数依赖二、平凡函数依赖与非平凡函数依赖三、完全函数依赖与部分函数依赖四、传递函数依赖一、函数依赖定义 5.1 设 R(U)是一个属性集 U上的关系模式,X和 Y
是 U的子集。
若对于 R(U)的 任意 一个可能的关系 r,r中不可能存在两个元组在 X上的属性值相等,而在 Y上的属性值不等,
则称,X函数确定 Y‖ 或,Y函数依赖于 X‖,记作 X→ Y。
X称为这个函数依赖的 决定属性集 (Determinant)。
Y=f(x)
说明:
1,函数依赖不是指关系模式 R的某个或某些关系实例满足的约束条件,而是指 R的 所有关系实例 均要满足的约束条件。
2,函数依赖是 语义范畴 的概念。只能根据数据的语义来确定函数依赖。
例如,姓名 → 年龄,这个函数依赖只有在不允许有同名人的条件下成立
3,数据库设计者可以对现实世界作强制的规定。例如规定不允许同名人出现,函数依赖,姓名 → 年龄,成立。所插入的元组必须满足规定的函数依赖,若发现有同名人存在,
则拒绝装入该元组。
函数依赖(续)
例,Student(Sno,Sname,Ssex,Sage,Sdept)
假设不允许重名,则有,
Sno → Ssex,Sno → Sage,Sno → Sdept,
Sno ←→ Sname,Sname → Ssex,Sname → Sage
Sname → Sdept
但 Ssex → Sage
若 X→ Y,并且 Y→ X,则记为 X←→ Y。
若 Y不函数依赖于 X,则记为 X─→ Y。
二、平凡函数依赖与非平凡函数依赖在关系模式 R(U)中,对于 U的子集 X和 Y,
如果 X→ Y,但 Y? X,则称 X→ Y是 非平凡的函数依赖若 X→ Y,但 Y? X,则称 X→ Y是 平凡的函数依赖例:在关系 SC(Sno,Cno,Grade)中,
非平凡函数依赖,(Sno,Cno) → Grade
平凡函数依赖,(Sno,Cno) → Sno
(Sno,Cno) → Cno
平凡函数依赖与非平凡函数依赖(续)
于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义,因此若不特别声明,我们总是讨论非平凡函数依赖 。
三、完全函数依赖与部分函数依赖定义 5.2 在关系模式 R(U)中,如果 X→ Y,并且对于 X
的任何一个真子集 X‘,都有
X‘ Y,则称 Y完全函数依赖于 X,记作 X f Y。
若 X→ Y,但 Y不完全函数依赖于 X,则称 Y部分函数依赖 于 X,记作 X P Y。
完全函数依赖与部分函数依赖(续)
例,在关系 SC(Sno,Cno,Grade)中,
由于,Sno → Grade,Cno → Grade,
因此,(Sno,Cno) f Grade
四、传递函数依赖定义 5.3 在关系模式 R(U)中,如果 X→ Y,Y→ Z,
且 Y?X,Y→ X,则称 Z传递函数依赖 于 X。
注,如果 Y→ X,即 X←→ Y,则 Z直接依赖 于 X。
例,在关系 Std(Sno,Sdept,Mname)中,有:
Sno → Sdept,Sdept → Mname
Mname传递函数依赖于 Sno
5.2.2 码定义 5.4 设 K为关系模式 R<U,F>中的属性或属性组合。
若 K f U,则 K称为 R的一个 侯选码 ( Candidate Key)。
若关系模式 R有多个候选码,则选定其中的一个做为 主码 ( Primary key)。
主属性与非主属性
ALL KEY
外部码定义 5.5 关系模式 R 中属性或属性组 X
并非 R的码,但 X 是另一个关系模式的码,则称 X 是 R 的 外部码( Foreign
key) 也称外码
主码又和外部码一起提供了表示关系间联系的手段 。
5.2.3 范式
范式是符合某一种级别的关系模式的集合。
关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。
范式的种类:
第一范式 (1NF)
第二范式 (2NF)
第三范式 (3NF)
BC范式 (BCNF)
第四范式 (4NF)
第五范式 (5NF)
5.2.3 范式
各种范式之间存在联系:
某一关系模式 R为第 n范式,可简记为 R? nNF。
NF5NF4B C N FNF3NF2NF1
5.2.4 2NF
1NF的定义如果一个关系模式 R的所有属性都是 不可分的基本数据项,则 R? 1NF。
第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库。
但是满足第一范式的关系模式并不一定是一个好的关系模式。
2NF
例,关系模式 SLC(Sno,Sdept,Sloc,Cno,
Grade)
Sloc为学生住处,假设每个系的学生住在同一个地方。
函数依赖包括:
(Sno,Cno) f Grade
Sno → Sdept
(Sno,Cno) P Sdept
Sno → Sloc
(Sno,Cno) P Sloc
Sdept → Sloc
2NF
SLC的码为 (Sno,Cno)
SLC满足第一范式。
非主属性 Sdept和 Sloc部分函数依赖于码 (Sno,Cno)
Sno
Cno
Grade
Sdept
Sloc
SLC
SLC不是一个好的关系模式
(1) 插入异常假设 Sno= 95102,Sdept= IS,Sloc= N的学生还未选课,因课程号是主属性,因此该学生的信息无法插入 SLC。
(2) 删除异常假定某个学生本来只选修了 3号课程这一门课。现在因身体不适,他连 3号课程也不选修了。因课程号是主属性,此操作将导致该学生信息的整个元组都要删除。
SLC不是一个好的关系模式(3) 数据冗余度大如果一个学生选修了 10门课程,那么他的 Sdept和
Sloc值就要重复存储了 10次。
(4) 修改复杂例如学生转系,在修改此学生元组的 Sdept值的同时,还可能需要修改住处( Sloc)。如果这个学生选修了 K门课,则必须无遗漏地修改 K个元组中全部
Sdept,Sloc信息。
2NF
原因
Sdept,Sloc部分函数依赖于码。
解决方法
SLC分解为两个关系模式,以消除这些部分函数依赖
SC( Sno,Cno,Grade)
SL( Sno,Sdept,Sloc)
2NF
SLC的码为 (Sno,Cno)
SLC满足第一范式。
非主属性 Sdept和 Sloc部分函数依赖于码 (Sno,Cno)
Sno
Cno
Grade
Sdept
Sloc
SLC
2NF
函数依赖图,
Sno
Cno
Grade
SC SL
Sno
Sdept
Sloc
2NF
2NF的定义定义 5.6 若关系模式 R? 1NF,并且每一个 非主属性都 完全 函数依赖于 R的码,则 R? 2NF。
例,SLC(Sno,Sdept,Sloc,Cno,Grade)? 1NF
SLC(Sno,Sdept,Sloc,Cno,Grade)
2NF SC( Sno,Cno,Grade)? 2NF
SL( Sno,Sdept,Sloc)? 2NF
第二范式(续)
采用投影分解法将一个 1NF的关系分解为多个
2NF的关系,可以在一定程度上减轻原 1NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
将一个 1NF关系分解为多个 2NF的关系,并不能完全消除关系模式中的各种异常情况和数据冗余。
5.2.5 3NF
例,2NF关系模式 SL(Sno,Sdept,Sloc)中
函数依赖:
Sno→ Sdept
Sdept→ Sloc
Sno→ Sloc
Sloc传递函数依赖于 Sno,即 SL中存在非主属性对码的传递函数依赖。
3NF
函数依赖图,
SL
Sno
Sdept
Sloc
3NF
解决方法采用投影分解法,把 SL分解为两个关系模式,以消除传递函数依赖:
SD( Sno,Sdept)
DL( Sdept,Sloc)
SD的码为 Sno,DL的码为 Sdept。
3NF
SD的码为 Sno,DL的码为 Sdept。
Sno Sdept
SD
Sdept Sloc
DL
3NF
3NF的定义定义 5.8 关系模式 R<U,F> 中若不存在这样的码 X、属性组 Y及 非主属性 Z( Z? Y),使得
X→ Y,Y → X,Y→ Z,成立,则称 R<U,F>
3NF。
例,SL(Sno,Sdept,Sloc)? 2NF
SL(Sno,Sdept,Sloc)? 3NF
SD( Sno,Sdept)? 3NF
DL( Sdept,Sloc)? 3NF
3NF
若 R? 3NF,则 R的每一个 非主属性 既不部分函数依赖于候选码也不传递函数依赖于候选码。
如果 R? 3NF,则 R也是 2NF。
采用投影分解法将一个 2NF的关系分解为多个 3NF的关系,
可以在一定程度上解决原 2NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
将一个 2NF关系分解为多个 3NF的关系后,并不能完全消除关系模式中的各种异常情况和数据冗余。
5.2.6 BC范式( BCNF)
定义 5.9 设关系模式 R<U,F>? 1NF,如果对于 R的 每个函数依赖 X→ Y,若 Y不属于 X,则 X必含有候选码,那么 R? BCNF。
若 R? BCNF
每一个决定属性集(因素)都包含(候选)码
R中的所有属性(主,非主属性)都完全函数依赖于码
R? 3NF(证明)
若 R? 3NF 则 R不一定? BCNF
BCNF
例:在关系模式 STJ( S,T,J)中,S表示学生,
T表示教师,J表示课程。
每一教师只教一门课。每门课由若干教师教,某一学生选定某门课,就确定了一个固定的教师。某个学生选修某个教师的课就确定了所选课的名称,
(S,J)→ T,(S,T)→ J,T→ J
5.2.6 BCNF
S
J
T
S
T
J
STJ
BCNF
STJ? 3NF
(S,J)和 (S,T)都可以作为候选码
S,T,J都是主属性
STJ? BCNF
T→ J,T是决定属性集,T不是候选码
BCNF
解决方法:将 STJ分解为二个关系模式:
SJ(S,J)? BCNF,TJ(T,J)? BCNF
没有 任何属性 对码的部分函数依赖和传递函数依赖
S J
ST
T J
TJ
3NF与 BCNF的关系
如果关系模式 R? BCNF,
必定有 R? 3NF
如果 R? 3NF,且 R只有一个候选码,
则 R必属于 BCNF。
BCNF的关系模式所具有的性质
⒈ 所有 非主属性 都完全函数依赖于每个候选码
⒉ 所有 主属性 都完全函数依赖于每个不包含它的候选码
⒊ 没有任何属性完全函数依赖于 非码 的任何一组属性
5.2.5 多值依赖与第四范式( 4NF)
例,学校中某一门课程由多个教师讲授,他们使用相同的一套参考书。
关系模式 Teaching(C,T,B)
课程 C、教师 T 和 参考书 B
……
…
课 程 C 教 员 T 参 考 书 B
物理数学计算数学李 勇王 军李 勇张 平张 平周 峰普通物理学光学原理物理习题集数学分析微分方程高等代数数学分析表 5.1
普通物理学光学原理物理习题集普通物理学光学原理物理习题集数学分析微分方程高等代数数学分析微分方程高等代数
…
李 勇李 勇李 勇王 军王 军王 军李 勇李 勇李 勇张 平张 平张 平
…
物 理物 理物 理物 理物 理物 理数 学数 学数 学数 学数 学数 学
…
参考书 B教员 T课程 C
用二维表表示 Teaching
多值依赖与第四范式(续)
Teaching? BCNF:
Teach具有唯一候选码 (C,T,B),即全码
Teaching模式中存在的问题
(1)数据冗余度大:有多少名任课教师,参考书就要存储多少次多值依赖与第四范式(续)
(2)插入操作复杂:当某一课程增加一名任课教师时,
该课程有多少本参照书,就必须插入多少个元组例如物理课增加一名教师刘关,需要插入两个元组:
(物理,刘关,普通物理学)
(物理,刘关,光学原理)
多值依赖与第四范式(续)
(3) 删除操作复杂:某一门课要去掉一本参考书,
该课程有多少名教师,就必须删除多少个元组
(4) 修改操作复杂:某一门课要修改一本参考书,
该课程有多少名教师,就必须修改多少个元组
产生原因,存在多值依赖一、多值依赖
定义 5.10
设 R(U)是一个属性集 U上的一个关系模式,X,Y和 Z
是 U的子集,并且 Z= U- X- Y,多值依赖 X→→ Y成立当且仅当对 R的 任一关系 r,r在( X,Z)上的每个值对应一组 Y的值,这组值仅仅决定于 X值而与 Z值无关例 Teaching( C,T,B)
对于 C的每一个值,T有一组值与之对应,而不论 B取何值一、多值依赖
在 R( U)的任一关系 r中,如果存在元组 t,s 使得
t[X]=s[X],那么就必然存在元组 w,v? r,( w,v可以与 s,t相同),使得 w[X]=v[X]=t[X],而 w[Y]=t[Y],
w[Z]=s[Z],v[Y]=s[Y],v[Z]=t[Z](即交换 s,t元组的 Y
值所得的两个新元组必在 r中),则 Y多值依赖于 X,记为
X→→ Y。 这里,X,Y是 U的子集,Z=U-X-Y。
t x y1 z2
s x y2 z1
w x y1 z1
v x y2 z2
多值依赖(续)
平凡多值依赖和非平凡的多值依赖
若 X→→ Y,而 Z= φ,则称
X→→ Y为 平凡的多值依赖
否则称 X→→ Y为 非平凡的多值依赖多值依赖的性质
( 1)多值依赖具有对称性若 X→→ Y,则 X→→ Z,其中 Z= U- X- Y
多值依赖的对称性可以用完全二分图直观地表示出来。
( 2)多值依赖具有传递性若 X→→ Y,Y→→ Z,则 X→→ Z -Y
多值依赖的对称性
Xi
Zi1 Zi2 … Zim
Yi1 Yi2 … Yin
多值依赖的对称性物理普通物理学 光学原理 物理习题集李勇 王军多值依赖(续)
( 3)函数依赖是多值依赖的特殊情况。
若 X→ Y,则 X→→ Y。
( 4)若 X→→ Y,X→→ Z,则 X→→ Y? Z。
( 5)若 X→→ Y,X→→ Z,则 X→→ Y∩ Z。
( 6)若 X→→ Y,X→→ Z,则 X→→ Y-Z,
X→→ Z -Y。
多值依赖与函数依赖的区别
(1) 有效性
多值依赖的有效性与属性集的范围有关若 X→→ Y在 U上成立,则在 W( X Y? W? U)上一定成立;反之则不然,即 X→→ Y在 W( W? U)上成立,在 U上并不一定成立
多值依赖的定义中不仅涉及属性组 X和 Y,而且涉及 U中其余属性 Z。
一般地,在 R( U)上若有 X→→ Y在 W( W? U)
上成立,则称 X→→ Y为 R( U)的嵌入型多值依赖多值依赖与函数依赖的区别
只要在 R( U)的任何一个关系 r中,元组在 X和
Y上的值满足定义 5.l(函数依赖),
则函数依赖 X→ Y在任何属性集 W( X Y? W
U)上成立 。
多值依赖(续)
(2)
若函数依赖 X→ Y在 R( U)上成立,则对于任何 Y'? Y均有 X→ Y' 成立
多值依赖 X→→ Y若在 R(U)上成立,不能断言对于任何 Y'? Y有 X→→ Y' 成立二、第四范式( 4NF)
定义 5.10 关系模式 R<U,F>? 1NF,如果对于 R的每个非平凡多值依赖 X→→ Y( Y? X),
X都含有候选码,则 R? 4NF。
( X→ Y)
如果 R? 4NF,则 R? BCNF
不允许 有非平凡且非函数依赖的 多值依赖允许 的是 函数依赖 (是非平凡多值依赖)
第四范式(续)
例,Teach(C,T,B)? 4NF
存在非平凡的多值依赖 C→→ T,且 C不是候选码
用投影分解法把 Teach分解为如下两个关系模式:
CT(C,T)? 4NF
CB(C,B)? 4NF
C→→ T,C→→ B是平凡多值依赖
5.2 规范化
5.2.1 第一范式( 1NF)
5.2.2 第二范式( 2NF)
5.2.3 第三范式( 3NF)
5.2.4 BC范式( BCNF)
5.2.5 多值依赖与第四范式( 4NF)
5.2.6 规范化
5.2.6 规范化
关系数据库的规范化理论是数据库逻辑设计的工具。
一个关系只要其分量都是不可分的数据项,它就是规范化的关系,但这只是最基本的规范化。
规范化程度可以有多个不同的级别规范化(续)
规范化程度过低的关系不一定能够很好地描述现实世界,可能会存在插入异常、删除异常、
修改复杂、数据冗余等问题
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式集合,
这种过程就叫 关系模式的规范化规范化(续)
关系模式规范化的基本步骤
1NF
↓ 消除非主属性对码的部分函数依赖消除决定属性 2NF
集非码的非平 ↓ 消除非主属性对码的传递函数依赖凡函数依赖 3NF
↓ 消除主属性对码的部分和传递函数依赖
BCNF
↓ 消除非平凡且非函数依赖的多值依赖
4NF
规范化的基本思想
消除不合适的数据依赖
的各关系模式达到某种程度的,分离,
采用,一事一地,的模式设计原则让一个关系描述一个概念、一个实体或者实体间的一种联系。若多于一个概念就把它,分离,出去
所谓规范化实质上是概念的单一化规范化(续)
不能说规范化程度越高的关系模式就越好
在设计数据库模式结构时,必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式
上面的规范化步骤可以在其中任何一步终止第五章 关系数据理论
5.1 数据依赖
5.2 规范化
5.3 数据依赖的公理系统
5.4 模式的分解
5.3 数据依赖的公理系统
逻辑蕴含定义 5.11 对于满足一组 函数依赖 F 的关系模式 R <U,F>,其任何一个关系 r,
若函数依赖 X→ Y都成立,则称
F逻辑蕴含 X → Y
Armstrong公理系统
一套推理规则,是模式分解算法的理论基础
用途
求给定关系模式的码
从一组函数依赖求得蕴含的函数依赖
1,Armstrong公理系统关系模式 R <U,F >来说有以下的推理规则:
Al.自反律 ( Reflexivity):
若 Y? X? U,则 X → Y为 F所蕴含。
A2.增广律 ( Augmentation):若 X→ Y为 F所蕴含,
且 Z? U,则 XZ→ YZ为 F所蕴含。
A3.传递律 ( Transitivity):若 X→ Y及 Y→ Z为 F所蕴含,则 X→ Z为 F所蕴含。
注意:由自反律所得到的函数依赖均是平凡的函数依赖,自反律的使用并不依赖于 F
定理 5.l Armstrong推理规则是正确的
( l)自反律,若 Y? X? U,则 X → Y为 F所蕴含证,设 Y? X? U
对 R <U,F> 的任一关系 r中的任意两个元组 t,s:
若 t[X]=s[X],由于 Y? X,有 t[y]=s[y],
所以 X→ Y成立,
自反律得证定理 5.l
(2)增广律,若 X→ Y为 F所蕴含,且 Z? U,则 XZ→ YZ
为 F所蕴含。
证,设 X→ Y为 F所蕴含,且 Z? U。
设 R<U,F> 的任一关系 r中任意的两个元组 t,s;
若 t[XZ]=s[XZ],则有 t[X]=s[X]和 t[Z]=s[Z];
由 X→ Y,于是有 t[Y]=s[Y],所以 t[YZ]=s[YZ],所以
XZ→ YZ为 F所蕴含,
增广律得证。
定理 5.l
(3) 传递律:若 X→ Y及 Y→ Z为 F所蕴含,则
X→ Z为 F所蕴含。
证,设 X→ Y及 Y→ Z为 F所蕴含。
对 R<U,F> 的任一关系 r中的任意两个元组 t,s。
若 t[X]=s[X],由于 X→ Y,有 t[Y]=s[Y];
再由 Y→ Z,有 t[Z]=s[Z],所以 X→ Z为 F所蕴含,
传递律得证。
2,导出规则
1.根据 A1,A2,A3这三条推理规则可以得到下面三条推理规则:
合并规则,由 X→ Y,X→ Z,有 X→ YZ。
( A2,A3)
伪传递规则,由 X→ Y,WY→ Z,有 XW→ Z。
( A2,A3)
分解规则,由 X→ Y及 Z?Y,有 X→ Z。
( A1,A3)
导出规则
2.根据合并规则和分解规则,可得引理 5.1
引理 5.l X→ A1 A2… Ak成立的充分必要条件是 X→ Ai成立( i=l,2,…,k)。
3,函数依赖闭包定义 5.l2 在关系模式 R<U,F>中为 F所逻辑蕴含的函数依赖的全体叫作 F的闭包,记为 F+。
定义 5.13 设 F为属性集 U上的一组函数依赖,X?U,
XF+ ={ A|X→ A能由 F 根据 Armstrong公理导出 },
XF+称为属性集 X关于函数依赖集 F 的闭包
F的闭包
F={X Y,Y Z},F+计算是 NP完全问题,X A1A2...An
F+={
X φ,Y φ,Z φ,XY φ,XZ φ,YZ φ,XYZ φ,
X X,Y Y,Z Z,XY X,XZ X,YZ Y,XYZ X,
X Y,Y Z,XY Y,XZ Y,YZ Z,XYZ Y,
X Z,Y YZ,XY Z,XZ Z,YZ YZ,XYZ Z,
X XY,XY XY,XZ XY,XYZ XY,
X XZ,XY YZ,XZ XZ,XYZ YZ
X YZ,XY XZ,XZ XY,XYZ XZ,
X ZYZ,XY XYZ,XZ XYZ,XYZ XYZ }
关于闭包的引理
引理 5.2
设 F为属性集 U上的一组函数依赖,X,Y? U,
X→ Y能由 F 根据 Armstrong公理导出的充分必要条件是 Y?XF+
用途将判定 X→ Y是否能由 F根据 Armstrong公理导出的问题,
就转化为求出 XF+,判定 Y是否为 XF+的子集的问题求闭包的算法算法 5.l 求属性集 X( X? U)关于 U上的函数依赖集 F 的闭包 XF+
输入,X,F
输出,XF+
步骤:
( 1)令 X( 0) =X,i=0
( 2)求 B,这里 B = { A |(? V)(? W)(V→ W?F
∧ V? X( i) ∧ A? W)};
( 3) X( i+1) =B∪ X( i)
算法 5.l
( 4)判断 X( i+1) = X ( i) 吗?
( 5)若相等或 X( i) =U,则 X( i) 就是 XF+,
算法终止。
( 6)若否,则 i=i+l,返回第( 2)步。
对于算法 5.l,令 ai =|X( i) |,{ai }形成一个步长大于 1的严格递增的序列,序列的上界是 | U |,因此该算法最多 |U| - |X| 次循环就会终止。
Define XF+ = closure of X
= set of attributes functionally determined byX
Basis,XF+,=X
Induction,If Y XF+,and Y A is a given FD,
then add A to XF+
End when XF+ cannot be changed.
Algorithm
yX+ New X+
A
U={A,B,C,D}; F={A B,BC D};
A+ = AB.
C+ = C.
(AC)+ = ABCD.
Example
A
C
B
Example
A
C
D
B
U={A,B,C,D}; A B,BC D.
(AC)+ = ABCD.
函数依赖闭包
[例 1] 已知关系模式 R<U,F>,其中
U={A,B,C,D,E};
F={AB→ C,B→ D,C→ E,EC→ B,AC→ B}。
求( AB) F+ 。
解 设 X( 0) =AB;
(1)计算 X( 1),逐一的扫描 F集合中各个函数依赖,
找左部为 A,B或 AB的函数依赖。得到两个:
AB→ C,B→ D。
于是 X( 1) =AB∪ CD=ABCD。
函数依赖闭包
(2)因为 X( 0) ≠ X( 1),所以再找出左部为 ABCD
子集的那些函数依赖,又得到 AB→ C,B→ D,
C→ E,AC→ B,
于是 X( 2) =X( 1) ∪ BCDE=ABCDE。
(3)因为 X( 2) =U,算法终止所以( AB) F+ =ABCDE。
4,Armstrong公理系统的有效性与完备性
建立公理系统体系 目的,从已知的 f 推导出未知的 f
明确,1.公理系统推导出来的 f 正确?
2,F+中的每一个 f 都能推导出来?
/ f 不能由 F 导出,f? F+
F F+ f
4,Armstrong公理系统的有效性与完备性
有效性,由 F出发根据 Armstrong公理推导出来的每一个函数依赖一定在 F+中
/* Armstrong正确
完备性,F+中的每一个函数依赖,必定可以由
F出发根据 Armstrong公理推导出来
/* Armstrong公理够用,完全完备性,所有不能用 Armstrong公理推导出来 f,都不为真若 f 不能用 Armstrong公理推导出来,f? F+
有效性与完备性的证明证明:
1,有效性可由定理 5.l得证
2,完备性只需证明 逆否命题,若函数依赖 X→ Y不能由 F从
Armstrong公理导出,那么它必然不为 F所蕴含分三步证明:
有效性与完备性的证明
(1)引理,若 V→ W成立,且 V? XF+,则 W? XF+
证 因为 V? XF+,所以有 X→ V成立;
因为 X → V,V→ W,于是 X→ W成立所以 W? XF+
(2)/* 若 f 不能用 Armstrong公理推导出来,f? F+
/* 若存在 r,F+中的全部函数依赖在 r上成立。
/* 而不能用 Armstrong公理推导出来的 f,在 r上不成立。
构造一张二维表 r,它由下列两个元组构成,可以证明 r必是 R( U,F)
的一个关系,即 F+中的全部函数依赖在 r上成立 。
Armstrong公理系统的有效性与完备性 (续 )
XF+ U-XF+
11......1 00......0
11......1 11......1
若 r不是 R<U,F> 的关系,则必由于 F中有函数依赖 V→ W在 r上不成立所致 。 由 r的构成可知,V必定是 XF+ 的子集,而 W不是 XF+ 的子集,可是由第 ( 1)
步,W? XF+,矛盾 。 所以 r必是 R<U,F>的一个关系 。
Armstrong公理系统的有效性与完备性 (续 )
(3) )/* 若 f 不能用 Armstrong公理推导出来,f? F+
/* 而不能用 Armstrong公理推导出来的 f,在 r上不成立。
若 X→ Y 不能由 F从 Armstrong公理导出,则 Y 不是
XF+ 的子集。(引理 5.2)
因此必有 Y 的子集 Y’ 满足 Y’? U-XF+,则 X→ Y在
r 中不成立,即 X→ Y必不为 R<U,F> 蕴含
/* 因为 F+中的全部函数依赖在 r上成立。
Armstrong公理系统的有效性与完备性 (续 )
Armstrong公理的完备性及有效性说明,
―蕴含,== ―导出,等价的概念
F+ ==由 F出发借助 Armstrong公理导出的函数依赖的集合
5,函数依赖集等价定义 5.14 如果 G+=F+,就说函数依赖集
F覆盖 G( F是 G的覆盖,或 G是 F的覆盖),
或 F与 G等价 。
函数依赖集等价的充要条件引理 5.3 F+ = G+ 的充分必要条件是
F? G+,和 G? F+
证,必要性显然,只证充分性。
( 1)若 F?G+,则 XF+? XG++ 。
( 2)任取 X→ Y?F+ 则有 Y? XF+? XG++ 。
所以 X→ Y? (G+) += G+。即 F+? G+。
( 3)同理可证 G+? F+,所以 F+ = G+。
函数依赖集等价
要判定 F? G+,只须逐一对 F中的函数依赖 X→ Y,考察 Y 是否属于 XG++ 就行了 。
因此引理 5.3 给出了判断两个函数依赖集等价的可行算法 。
6,最小依赖集定义 5.15 如果函数依赖集 F满足下列条件,则称 F为一个 极小函数依赖集 。 亦称为 最小依赖集 或 最小覆盖 。
(1) F中任一函数依赖的右部仅含有一个属性 。
(2) F中不存在这样的函数依赖 X→ A,使得 F与
F-{X→ A}等价 。
(3) F中不存在这样的函数依赖 X→ A,X有真子集 Z使得 F-{X→ A}∪ {Z→ A}与 F等价 。
最小依赖集
[例 2] 对于 5.l节中的关系模式 S<U,F>,其中:
U={ SNO,SDEPT,MN,CNAME,G },
F={ SNO→ SDEPT,SDEPT→ MN,
( SNO,CNAME) → G }
设 F’={SNO→ SDEPT,SNO→ MN,
SDEPT→ MN,(SNO,CNAME)→ G,
(SNO,SDEPT)→ SDEPT}
F是最小覆盖,而 F ’不是。
因为,F ’-{SNO→ MN}与 F ‘等价
F ’-{(SNO,SDEPT)→ SDEPT}也与 F ‘等价
F ’-{(SNO,SDEPT)→ SDEPT}
∪ {SNO→ SDEPT}也与 F ‘等价
7,极小化过程定理 5.3 每一个函数依赖集 F均等价于一个极小函数依赖集 Fm。 此 Fm称为 F的最小依赖集证,构造性证明,依据定义分三步对 F进行,极小化处理,,找出 F的一个最小依赖集 。
(1)逐一检查 F中各函数依赖 FDi,X→ Y,
若 Y=A1A2 … Ak,k > 2,
则用 { X→ Aj |j=1,2,…,k} 来取代 X→ Y。
引理 5.1保证了 F变换前后的等价性 。
极小化过程
(2)逐一检查 F中各函数依赖 FDi,X→ A,
令 G=F-{X→ A},
若 A?XG+,则从 F中去掉此函数依赖。
由于 F与 G =F-{X→ A}等价的充要条件是 A?XG+
因此 F变换前后是等价的。
极小化过程
(3)逐一取出 F中各函数依赖 FDi,X→ A,
设 X=B1B2… Bm,
逐一考查 Bi ( i=l,2,…,m),
若 A?( X-Bi ) F+,
则以 X-Bi 取代 X。
由于 F与 F-{X→ A}∪ {Z→ A}等价的充要条件是
A?ZF+,其中 Z=X-Bi
因此 F变换前后是等价的。
极小化过程由定义,最后剩下的 F就一定是极小依赖集。
因为对 F的每一次,改造,都保证了改造前后的两个函数依赖集等价,因此剩下的 F与原来的 F等价。 证毕
定理 5.3的证明过程 也是求 F极小依赖集的过程极小化过程
[例 3] F = {A→ B,B→ A,B→ C,
A→ C,C→ A}
Fm1,Fm2都是 F的最小依赖集:
Fm1= {A→ B,B→ C,C→ A}
Fm2= {A→ B,B→ A,A→ C,C→ A}
F的最小依赖集 Fm不一定是唯一的它与对各函数依赖 FDi 及 X→ A中 X各属性的处置顺序有关极小化过程
极小化过程 ( 定理 5.3的证明 )也是检验 F
是否为极小依赖集的一个算法
若改造后的 F与原来的 F相同,说明 F本身就是一个最小依赖集极小化过程
在 R<U,F>中可以用与 F等价的依赖集 G
来取代 F
原因:两个关系模式 R1 <U,F>,
R2<U,G>,如果 F与 G等价,那么 R1
的关系一定是 R2的关系。反过来,R2
的关系也一定是 R1的关系。
第五章 关系数据理论
5.1 数据依赖
5.2 规范化
5.3 数据依赖的公理系统
5.4 模式的分解
5.4 模式的分解
把低一级的关系模式分解为若干个高一级的关系模式的方法并不是唯一的
只有能够保证分解后的关系模式与原关系模式等价,分解方法才有意义关系模式分解的标准三种模式分解的等价定义
⒈ 分解具有无损连接性
⒉ 分解要保持函数依赖
⒊ 分解既要保持函数依赖,又要具有无损连接性模式的分解(续)
定义 5.16 关系模式 R<U,F>的一个分解:
ρ={ R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>}
U=U1∪ U2∪ … ∪ Un,且不存在 Ui? Uj,Fi 为 F在 Ui 上的投影定义 5.17 函数依赖集合 {X→ Y | X→ Y? F+∧ XY?Ui}
的一个 覆盖 Fi 叫作 F 在属性 Ui 上的投影模式的分解(续)
例,SL( Sno,Sdept,Sloc)
F={ Sno→ Sdept,Sdept→ Sloc,Sno→ Sloc}
SL? 2NF
存在插入异常,删除异常,冗余度大和修改复杂等问题分解方法可以有多种模式的分解(续)
SL ──────────────────
Sno Sdept Sloc
──────────────────
95001 CS A
95002 IS B
95003 MA C
95004 IS B
95005 PH B
──────────────────
模式的分解(续)
1,SL分解为下面三个关系模式:
SN(Sno)
SD(Sdept)
SO(Sloc)
分解后的关系为:
SN ────── SD ────── SO ──────
Sno Sdept Sloc
────── ────── ──────
95001 CS A
95002 IS B
95003 MA C
95004 PH ─────
95005 ──────
──────
模式的分解(续)
分解后的数据库 丢失了许多信息例如无法查询 95001学生所在系或所在宿舍 。
如果分解后的关系可以通过自然连接恢复为原来的关系,那么这种分解就没有 丢失信息模式的分解(续)
2,SL分解为下面二个关系模式:
NL(Sno,Sloc)
DL(Sdept,Sloc)
分解后的关系为:
NL ──────────── DL ────────────
Sno Sloc Sdept Sloc
──────────── ────────────
95001 A CS A
95002 B IS B
95003 C MA C
95004 B PH B
95005 B ────────────
──────────
模式的分解(续)
NL DL
─────────────
Sno Sloc Sdept
─────────────
95001 A CS
95002 B IS
95002 B PH
95003 C MA
95004 B IS
95004 B PH
95005 B IS
95005 B PH
模式的分解(续)
NL DL比原来的 SL关系多了 3个元组无法知道 95002,95004,95005
究竟是哪个系的学生元组增加了,信息丢失了第三种分解方法
3,将 SL分解为下面二个关系模式:
ND(Sno,Sdept)
NL(Sno,Sloc)
分解后的关系为:
模式的分解(续)
ND ──────────── NL ──────────
Sno Sdept Sno Sloc
──────────── ──────────
95001 CS 95001 A
95002 IS 95002 B
95003 MA 95003 C
95004 IS 95004 B
95005 PH 95005 B
──────────── ───────────
模式的分解(续)
ND NL
──────────────
Sno Sdept Sloc
──────────────
95001 CS A
95002 IS B
95003 MA C
95004 CS A
95005 PH B
──────────────
与 SL关系一样,因此没有丢失信息具有无损连接性的模式分解
关系模式 R<U,F>的一个分解 ρ={ R1<U1,F1>,
R2<U2,F2>,…,Rn<Un,Fn>}
若 R与 R1,R2,…,Rn自然连接的结果相等,则称关系模式 R的这个分解 ρ具有无损连接性( Lossless join)
具有无损连接性的分解保证不丢失信息
无损连接性不一定能解决插入异常、删除异常、修改复杂、数据冗余等问题模式的分解(续)
第三种分解方法具有无损连接性问题,
这种分解方法没有保持原关系中的函数依赖
SL中的函数依赖 Sdept→ Sloc
没有投影到关系模式 ND,NL上保持函数依赖的模式分解设关系模式 R<U,F>被分解为若干个关系模式
R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>
(其中 U=U1∪ U2∪ … ∪ Un,且不存在 Ui? Uj,Fi为 F在 Ui
上的投影),若 F所逻辑蕴含的函数依赖一定也由分解得到的某个关系模式中的函数依赖 Fi所逻辑蕴含,则称关系模式 R的这个分解是保持函数依赖的( Preserve
dependency)。
第四种分解方法将 SL分解为下面二个关系模式:
ND(Sno,Sdept)
DL(Sdept,Sloc)
这种分解方法就保持了函数依赖。
模式的分解(续)
如果一个分解具有无损连接性,则它能够保证不丢失信息。
如果一个分解保持了函数依赖,则它可以减轻或解决各种异常情况。
分解具有无损连接性和分解保持函数依赖是两个互相独立的标准。具有无损连接性的分解不一定能够保持函数依赖。同样,保持函数依赖的分解也不一定具有无损连接性。
模式的分解(续)
第一种分解方法既不具有无损连接性,也未保持函数依赖,它不是原关系模式的一个等价分解第二种分解方法保持了函数依赖,但不具有无损连接性第三种分解方法具有无损连接性,但未持函数依赖第四种分解方法既具有无损连接性,又保持了函数依赖分解算法
算法 5.2 判别一个分解的无损连接性
算法 5.3 ( 合成法 ) 转换为 3NF的保持函数依赖的分解 。
算法 5.4 转换为 3NF既有无损连接性又保持函数依赖的分解
算法 5.5 转换为 BCNF的无损连接分解 ( 分解法 )
算法 5.6 达到 4NF的具有无损连接性的分
解 P196 图 5,11
分解算法
解 P196 图 5,11
若要求分解具有无损连接性,那么模式分解一定能够达到 4NF。
若要求分解保持函数依赖,那么模式分解一定能够达到 3NF,但不一定能够达到 BCNF。
若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到 3NF,但不一定能够达到 BCNF。
泛关系假设
―假设已知一个模式 Sφ,它仅由单个关系模式组成,问题是要设计一个模式 SD,
它与 Sφ?等价 ’,但在某些方面更好一些,
从一个关系模式出发,而不是从一组关系模式出发实行分解
,等价,的定义也是一组关系模式与一个关系模式的,等价,
小结 (续 )
规范化理论为数据库设计提供了理论的指南和工具
也仅仅是指南和工具
并不是规范化程度越高,模式就越好
必须结合应用环境和现实世界的具体情况合理地选择数据库模式下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第六章 数据库设计第六章 数据库设计
6.1 数据库设计概述
6.2 需求分析
6.3 概念结构设计
6.4 逻辑结构设计
6.5 数据库的物理设计
6.6 数据库实施
6.7 数据库运行与维护
6.8 小结
6.1 数据库设计概述
6.1.1 数据库和信息系统
6.1.2 数据库设计的特点
6.1.3 数据库设计方法简述
6.1.4 数据库设计的基本步骤数据库设计概述(续)
什么是数据库设计
数据库设计是指对于一个给定的应用环境,
构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)
在数据库领域内,常常把使用数据库的各类系统统称为数据库应用系统。
6.1.1 数据库和信息系统
数据库是信息系统的核心和基础
把信息系统中大量的数据按一定的模型组织起来
提供存储、维护、检索数据的功能
使信息系统可以方便、及时、准确地从数据库中获得所需的信息
数据库是信息系统的各个部分能否紧密地结合在一起以及如何结合的关键所在
数据库设计是信息系统开发和建设的重要组成部分数据库设计人员应该具备的技术和知识
数据库的基本知识和数据库设计技术
计算机科学的基础知识和程序设计的方法和技巧
软件工程的原理和方法
应用领域的知识
6.1 数据库设计概述
6.1.1 数据库和信息系统
6.1.2 数据库设计的特点
6.1.3 数据库设计方法简述
6.1.4 数据库设计的基本步骤
6.1.2 数据库设计的特点
数据库建设是硬件、软件和干件的结合
三分技术,七分管理,十二分基础数据
技术与管理的界面称之为,干件,
数据库设计应该与应用系统设计相结合
结构(数据)设计:设计数据库框架或数据库结构
行为(处理)设计:设计应用程序、事务处理等数据库设计的特点(续)
结构和行为分离的设计
传统的软件工程忽视对应用中数据语义的分析和抽象,只要有可能就尽量推迟数据结构设计的决策
早期的数据库设计致力于数据模型和建模方法研究,忽视了对行为的设计数据库设计的特点(续)
现实世界概念模型设计子模式设计物理数据库设计逻辑数据库设计建立数据库数据分析 功能分析功能模型 功能说明事务设计程序说明应用程序设计程序编码调试
6.1 数据库设计概述
6.1.1 数据库和信息系统
6.1.2 数据库设计的特点
6.1.3 数据库设计方法简述
6.1.4 数据库设计的基本步骤
6.1.3 数据库设计方法简述
手工试凑法
设计质量与设计人员的经验和水平有直接关系
缺乏科学理论和工程方法的支持,工程的质量难以保证
数据库运行一段时间后常常又不同程度地发现各种问题,增加了维护代价数据库设计方法简述(续)
规范设计法
手工设计方法
基本思想
过程迭代和逐步求精数据库设计方法简述(续)
规范设计法 (续 )
典型方法
新奥尔良( New Orleans)方法
将数据库设计分为四个阶段
S.B.Yao方法
将数据库设计分为五个步骤
I.R.Palmer方法
把数据库设计当成一步接一步的过程数据库设计方法简述(续)
计算机辅助设计
ORACLE Designer 2000
SYBASE PowerDesigner
6.1 数据库设计概述
6.1.1 数据库和信息系统
6.1.2 数据库设计的特点
6.1.3 数据库设计方法简述
6.1.4 数据库设计的基本步骤
6.1.4 数据库设计的基本步骤一、数据库设计的准备工作选定参加设计的人员
1,数据库分析设计人员
数据库设计的核心人员
自始至终参与数据库设计
其水平决定了数据库系统的质量
6.1.4 数据库设计的基本步骤
2,用户
在数据库设计中也是举足轻重的
主要参加需求分析和数据库的运行维护
用户积极参与带来的好处
加速数据库设计
提高数据库设计的质量数据库设计的基本步骤(续)
3,程序员
在系统实施阶段参与进来,负责编制程序
4,操作员
在系统实施阶段参与进来,准备软硬件环境数据库设计的基本步骤(续)
二、数据库设计的过程 (六个阶段 )
⒈需求分析阶段
准确了解与分析用户需求(包括数据与处理)
是整个设计过程的基础,是最困难、最耗费时间的一步数据库设计的基本步骤(续)
⒉概念结构设计阶段
是整个数据库设计的关键
通过对用户需求进行综合、归纳与抽象,形成一个独立于具体 DBMS的概念模型数据库设计的基本步骤(续)
⒊ 逻辑结构设计阶段
将概念结构转换为某个 DBMS所支持的数据模型
对其进行优化数据库设计的基本步骤(续)
⒋ 数据库物理设计阶段
为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)
数据库设计的基本步骤(续)
⒌ 数据库实施阶段
运用 DBMS提供的数据语言、工具及宿主语言,根据逻辑设计和物理设计的结果
建立数据库
编制与调试应用程序
组织数据入库
并进行试运行数据库设计的基本步骤(续)
⒍ 数据库运行和维护阶段
数据库应用系统经过试运行后即可投入正式运行。
在数据库系统运行过程中必须不断地对其进行评价、调整与修改。
数据库设计的基本步骤(续)
设计一个完善的数据库应用系统往往是上述六个阶段的不断反复。
P206图 6.2
设计特点
在设计过程中把数据库的设计和对数据库中数据处理的设计紧密结合起来
将这两个方面的需求分析、抽象、设计、
实现在各个阶段同时进行,相互参照,
相互补充,以完善两方面的设计
设计过程各个阶段的设计描述,P208图
6.3
IPO表 ……
输入:
输出:
处理:
Creat……
Load……
Main( )
……
if……
then
……
end
分区 1
分区 2
……
概念结构设计逻辑结构设计物理设计设计阶段 设 计 描 述数 据 处 理需求分 析数据字典,全系统中数据项,
数据流,数据存储的描述数据流图和判定表 ( 判定树 ),数据字典中处理过程的描述概念模型 ( E-R图 )
数据字典系统说明书包括:
① 新系统要求,
方案和概图
② 反映新系统信息流的数据流图某种数据模型关系 非关系系统结构图
( 模块结构 )
存储安排方法选择存取路径建立模块设计
IPO表实施阶段编写模式装入数据数据库试运行程序编码,
编译联结,
测试运行,
维护 性能监测,转储 /恢复数据库重组和重构新旧系统转换,运行,维护 ( 修正性,
适应性,改善性维护 )
数据库设计的基本步骤(续)
数据库各级模式的形成过程 (P209图 6.4)
需求分析阶段
综合各个用户的应用需求
概念设计阶段
形成独立于机器特点,独立于各个 DBMS
产品的概念模式 (E-R图 )
数据库设计的基本步骤(续)
逻辑设计阶段
首先将 E-R图转换成具体的数据库产品支持的数据模型,如关系模型,形成数据库逻辑模式
然后根据用户处理的要求、安全性的考虑,
在基本表的基础上再建立必要的视图
(View),形成数据的外模式数据库设计的基本步骤(续)
物理设计阶段
根据 DBMS特点和处理的需要,进行物理存储安排,建立索引,形成数据库内模式第六章 数据库设计
6.1 数据库设计概述
6.2 需求分析
6.3 概念结构设计
6.4 逻辑结构设计
6.5 数据库的物理设计
6.6 数据库实施
6.7 数据库运行与维护
6.8 小结
6.2 需求分析
6.2.1 需求分析的任务
6.2.2 需求分析的方法
6.2.3 数据字典需求分析(续)
需求分析就是分析用户的需要与要求
需求分析是设计数据库的起点
需求分析的结果是否准确地反映了用户的实际要求,将直接影响到后面各个阶段的设计,
并影响到设计结果是否合理和实用
6.2 需求分析
6.2.1 需求分析的任务
6.2.2 需求分析的方法
6.2.3 数据字典
6.2.1 需求分析的任务一、需求分析的任务二、需求分析的重点三、需求分析的难点一、需求分析的任务
通过详细调查现实世界要处理的对象
(组织、部门、企业等),充分 了解原系统 (手工系统或计算机系统) 工作概况,明确用户的各种需求
在此基础上 确定新系统的功能 。新系统必须充分考虑今后可能的扩充和改变,
不能仅仅按当前应用需求来设计数据库二、需求分析的重点
需求分析的重点是调查、收集与分析用户在数据管理中的 信息要求、处理要求、安全性与完整性要求 。
信息要求
用户需要从数据库中获得信息的内容与性质
由用户的信息要求可以导出数据要求,即在数据库中需要存储哪些数据需求分析的重点(续)
处理要求
对处理功能的要求
对处理的响应时间的要求
对处理方式的要求 (批处理 / 联机处理 )
新系统的功能必须能够满足用户的信息要求、
处理要求、安全性与完整性要求。
三、需求分析的难点
确定用户最终需求的难点
用户 缺少计算机知识,开始时无法确定计算机究竟能为自己做什么,不能做什么,因此无法一下子准确地表达自己的需求,他们所提出的需求往往不断地变化。
设计人员 缺少用户的专业知识,不易理解用户的真正需求,甚至误解用户的需求。
新 的硬件、软件 技术的出现 也会使用户需求发生变化。
需求分析的难点 (续 )
解决方法
设计人员必须采用有效的方法,与用户不断深入 地进行 交流,才能逐步得以确定用户的实际需求
6.2 需求分析
6.2.1 需求分析的任务
6.2.2 需求分析的方法
6.2.3 数据字典
6.2.2 需求分析的方法
调查清楚用户的实际需求并进行初步分析
与用户达成共识
进一步分析与表达这些需求一,调查与初步分析用户需求
⑴ 调查组织机构情况
组织部门的组成情况
各部门的职责等调查与初步分析用户需求(续)
⑵ 调查各部门的业务活动情况。调查重点之一。
各个部门输入和使用什么数据
如何加工处理这些数据
输出什么信息
输出到什么部门
输出结果的格式是什么调查与初步分析用户需求(续)
⑶ 在熟悉业务活动的基础上,协助用户明确对新系统的各种要求。调查重点之二。
信息要求
处理要求
完全性与完整性要求调查与初步分析用户需求(续)
⑷ 对前面调查的结果进行初步分析
确定新系统的边界
确定哪些功能由计算机完成或将来准备让计算机完成
确定哪些活动由人工完成由计算机完成的功能就是新系统应该实现的功能。
二、常用调查方法
做需求调查时,往往需要同时采用多种方法
无论使用何种调查方法,都必须有用户的积极参与和配合
设计人员应该和用户取得共同的语言,帮助不熟悉计算机的用户建立数据库环境下的共同概念,并对设计工作的最后结果共同承担责任常用调查方法(续)
常用调查方法
⑴跟班作业
通过亲身参加业务工作了解业务活动的情况
能比较准确地理解用户的需求,但比较耗时
⑵开调查会
通过与用户座谈来了解业务活动情况及用户需求
⑶请专人介绍常用调查方法(续)
⑷ 询问
对某些调查中的问题,可以找专人询问
⑸设计调查表请用户填写
如果调查表设计合理,则很有效,且易于为用户接受
⑹查阅记录
查阅与原系统有关的数据记录三、进一步分析和表达用户需求
分析和表达用户的需求 的常用方法
自顶向下的结构化分析方法( Structured
Analysis,简称 SA方法)
SA方法从最上层的系统组织机构入手,采用逐层分解的方式分析系统,并用数据流图和数据字典描述系统。
进一步分析和表达用户需求(续)
1.首先把任何一个系统都抽象为:
数据流数据流数据存储 信息要求数据来源处理 数据输出 处理要求进一步分析和表达用户需求(续)
2.分解处理功能和数据
( 1)分解处理功能
将处理功能的具体内容分解为若干子功能,再将每个子功能继续分解,直到把系统的工作过程表达清楚为止。
( 2)分解数据
在处理功能逐步分解的同时,其所用的数据也逐级分解,形成若干层次的数据流图
数据流图表达了数据和处理过程的关系进一步分析和表达用户需求(续)
( 3)表达方法
处理过程:用判定表或判定树来描述
数据:用数据字典来描述进一步分析和表达用户需求(续)
3.将分析结果再次提交给用户,征得用户的认可四、需求分析小结
P211图 6.6
需求分析小结(续)
实例:假设我们要开发一个学校管理系统。
1.经过可行性分析和初步需求调查,抽象出该系统最高层数据流图,该系统由教师管理子系统、学生管理子系统、后勤管理子系统组成,每个子系统分别配备一个开发小组。
2.进一步细化各个子系统。
其中学生管理子系统开发小组通过进行进一步的需求调查,
明确了该子系统的主要功能是进行学籍管理和课程管理,
包括学生报到、入学、毕业的管理,学生上课情况的管理。
通过详细的信息流程分析和数据收集后,他们生成了该子系统的数据流图。
6.2 需求分析
6.2.1 需求分析的任务
6.2.2 需求分析的方法
6.2.3 数据字典
6.2.3 数据字典一、数据字典的用途二、数据字典的内容一、数据字典的用途
数据字典是各类数据描述的集合
数据字典是进行详细的数据收集和数据分析所获得的主要结果
数据字典在数据库设计中占有很重要的地位二、数据字典的内容
数据字典的内容
数据项
数据结构
数据流
数据存储
处理过程
数据项是数据的最小组成单位
若干个数据项可以组成一个数据结构
数据字典通过对数据项和数据结构的定义来描述数据流、数据存储的逻辑内容。
⒈ 数据项
数据项是不可再分的数据单位
对数据项的描述数据项描述={数据项名,数据项含义说明,
别名,数据类型,长度,取值范围,
取值含义,与其他数据项的逻辑关系}
取值范围、与其他数据项的逻辑关系定义了数据的完整性约束条件
⒉ 数据结构
数据结构反映了数据之间的组合关系。
一个数据结构可以由若干个数据项组成,也可以由若干个数据结构组成,或由若干个数据项和数据结构混合组成。
对数据结构的描述数据结构描述={数据结构名,含义说明,
组成,{数据项或数据结构}}
⒊ 数据流
数据流是数据结构在系统内传输的路径。
对数据流的描述数据流描述={数据流名,说明,数据流来源,
数据流去向,组成,{数据结构},
平均流量,高峰期流量}
数据流来源是说明该数据流来自哪个过程
数据流去向是说明该数据流将到哪个过程去
平均流量是指在单位时间(每天、每周、每月等)
里的传输次数
高峰期流量则是指在高峰时期的数据流量
⒋ 数据存储
数据存储是数据结构停留或保存的地方,也是数据流的来源和去向之一。
对数据存储的描述数据存储描述={数据存储名,说明,编号,
流入的数据流,流出的数据流,
组成,{数据结构},数据量,存取方式}
流入的数据流:指出数据来源
流出的数据流:指出数据去向
数据量:每次存取多少数据,每天(或每小时、每周等)
存取几次等信息
存取方法:批处理 / 联机处理;检索 / 更新;顺序检索 /
随机检索
⒌ 处理过程
处理过程的具体处理逻辑一般用判定表或判定树来描述。数据字典中只需要描述处理过程的说明性信息
处理过程说明性信息的描述处理过程描述={处理过程名,说明,
输入,{数据流},输出,{数据流},
处理,{简要说明}}
处理过程(续)
简要说明:主要说明该处理过程的功能及处理要求
功能:该处理过程用来做什么
处理要求:处理频度要求(如单位时间里处理多少事务,多少数据量);响应时间要求等
处理要求是后面物理设计的输入及性能评价的标准处理过程(续)
例:学生学籍管理子系统的数据字典。
数据项,以,学号,为例:
数据项,学号含义说明:唯一标识每个学生别名,学生编号类型,字符型长度,8
取值范围,00000000至 99999999
取值含义:前两位标别该学生所在年级,
后六位按顺序编号与其他数据项的逻辑关系:
处理过程(续)
数据结构 以,学生,为例
,学生,是该系统中的一个核心数据结构:
数据结构,学生含义说明,是学籍管理子系统的主体数据结构,定义了一个学生的有关信息组成,学号,姓名,性别,年龄,
所在系,年级处理过程(续)
数据流,体检结果,可如下描述:
数据流,体检结果说明,学生参加体格检查的最终结果数据流来源:体检数据流去向:批准组成,……
平均流量,……
高峰期流量,……
处理过程(续)
数据存储,学生登记表,可如下描述:
数据存储,学生登记表说明,记录学生的基本情况流入数据流,……
流出数据流,……
组成,……
数据量,每年 3000张存取方式,随机存取处理过程(续)
处理过程,分配宿舍,可如下描述:
处理过程:分配宿舍说明,为所有新生分配学生宿舍输入,学生,宿舍,
输出,宿舍安排处理,在新生报到后,为所有新生分配学生宿舍。要求同一间宿舍只能安排同一性别的学生,同一个学生只能安排在一个宿舍中。每个学生的居住面积不小于 3平方米。安排新生宿舍其处理时间应不超过 15分钟。
下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第六章 数据库设计 (续 -1)
6.3 概念结构设计
6.3.1 概念结构设计概述
6.3.2 概念结构设计的方法与步骤
6.3.3 数据抽象与局部视图设计
6.3.4 视图的集成
6.3.1 概念结构
什么是 概念结构设计
需求分析阶段描述的用户应用需求是现实世界的具体需求
将需求分析得到的用户需求抽象为信息结构即 概念模型 的过程就是概念结构设计
概念结构是各种数据模型的共同基础,它比数据模型 更独立于机器,更抽象,从而更加稳定。
概念结构设计是整个数据库设计的关键概念结构(续)
现实世界机器世界信息世界需求分析概念结构设计概念结构(续)
概念结构设计的特点
( 1)能真实、充分地反映现实世界,包括事物和事物之间的联系,能满足用户对数据的处理要求。是对现实世界的一个真实模型。
( 2) 易于理解,从而可以用它和不熟悉计算机的用户交换意见,用户的积极参与是数据库的设计成功的关键。
概念结构(续)
概念结构设计的特点 (续 )
( 3)易于更改,当应用环境和应用要求改变时,
容易对概念模型修改和扩充。
( 4) 易于向关系、网状、层次 等各种数据模型转换。
概念结构(续)
描述概念模型的工具
E-R模型
6.3 概念结构设计
6.3.1 概念结构设计概述
6.3.2 概念结构设计的方法与步骤
6.3.3 数据抽象与局部视图设计
6.3.4 视图的集成
6.3.2 概念结构设计的方法与步骤
设计概念结构的四类方法
自顶向下
首先定义全局概念结构的框架,然后逐步细化
自底向上
首先定义各局部应用的概念结构,然后将它们集成起来,得到全局概念结构概念结构设计的方法与步骤(续)
逐步扩张
首先定义最重要的核心概念结构,然后向外扩充,以滚雪球的方式逐步生成其他概念结构,直至总体概念结构
混合策略
将自顶向下和自底向上相结合,用自顶向下策略设计一个全局概念结构的框架,
以它为骨架集成由自底向上策略中设计的各局部概念结构。
概念结构设计的方法与步骤(续)
自顶向下策略概念结构设计的方法与步骤(续)
自底向上策略概念结构设计的方法与步骤(续)
逐步扩张概念结构设计的方法与步骤(续)
常用策略( P215图 6.8)
自顶向下地进行需求分析
自底向上 地设计概念结构
自底向上设计概念结构的步骤
( P216图 6.9)
第 1步,抽象数据并设计局部视图
第 2步,集成局部视图,得到全局概念结构
6.3 概念结构设计
6.3.1 概念结构设计概述
6.3.2 概念结构设计的方法与步骤
6.3.3 数据抽象与局部视图设计
6.3.4 视图的集成
6.3.3 数据抽象与局部视图设计
数据抽象
局部视图设计一、数据抽象
概念结构是对现实世界的一种抽象
从实际的人、物、事和概念中抽取所关心的共同特性,忽略非本质的细节
把这些特性用各种概念精确地加以描述
这些概念组成了某种模型数据抽象(续)
三种常用抽象
1,分类( Classification)
定义某一类概念作为现实世界中一组对象的类型
这些对象具有某些共同的特性和行为
它抽象了对象 值和型 之间的,is member of‖
的语义
在 E-R模型中,实体型就是这种抽象例,P216图 6.10
数据抽象(续)
2,聚集( Aggregation)
定义某一类型的组成成分
它抽象了对象内部类型和成分之间,is part
of‖的语义
在 E-R模型中若干属性的聚集组成了实体型,
就是这种抽象例,P217图 6.11,图 6.12
数据抽象(续)
3,概括( Generalization)
定义类型之间的一种子集联系
它抽象了类型之间的,is subset of‖的语义
概括有一个很重要的性质:继承性。子类继承超类上定义的所有抽象。
例,P217图 6.13
数据抽象(续)
注:原 E-R模型不具有概括,本书对 E-R模型作了扩充,允许定义超类实体型和子类实体型。
用双竖边的矩形框表示子类,
用直线加小圆圈表示超类 -子类的联系数据抽象(续)
数据抽象的用途
对需求分析阶段收集到的数据进行分类、组织(聚集),形成
实体
实体的 属性,标识实体的 码
确定实体之间的 联系类型 (1:1,1:n,m:n)
二、局部视图设计设计分 E-R图的步骤,
⒈ 选择局部应用
⒉逐一设计分 E-R图
⒈ 选择局部应用
需求分析阶段,已用多层数据流图和数据字典描述了整个系统。
设计分 E-R图首先需要根据系统的具体情况,
在多层的数据流图中 选择 一个 适当层次的数据流图,让这组图中每一部分对应一个局部应用,
然后以这一层次的数据流图为出发点,设计分
E-R图。
选择局部应用(续)
例:由于学籍管理、课程管理等都不太复杂,因此可以它们入手设计学生管理子系统的分 E-R图。如果局部应用比较复杂,
则可以从更下层的数据流图入手。
⒉ 逐一设计分 E-R图
任务
标定局部应用中的实体、属性、码,实体间的联系
将各局部应用涉及的数据分别从数据字典中抽取出来,参照数据流图,标定各局部应用中的实体、实体的属性、标识实体的码,确定实体之间的联系及其类型( 1:1,
1:n,m:n)
逐一设计分 E-R图(续)
如何抽象实体和属性
实体,现实世界中一组具有某些共同特性和行为的对象就可以抽象为一个实体。对象和实体之间是,is member of"的关系。
例:在学校环境中,可把张三、李四等对象抽象为学生实体。
逐一设计分 E-R图(续)
属性,对象类型的 组成成分 可以抽象为实体的属性。组成成分与对象类型之间是,is
part of"的关系。
例:学号、姓名、专业、年级等可以抽象为学生实体的属性。其中学号为标识学生实体的码。
逐一设计分 E-R图(续)
如何区分实体和属性
实体与属性是相对而言的 。同一事物,在一种应用环境中作为,属性,,在另一种应用环境中就必须作为,实体,。
例:学校中的系,在某种应用环境中,它只是作为,学生,实体的一个属性,表明一个学生属于哪个系;而在另一种环境中,由于需要考虑一个系的系主任、教师人数、学生人数、办公地点等,这时它就需要作为实体了。
逐一设计分 E-R图(续)
一般原则
属性不能再具有需要描述的性质。即属性必须是不可分的数据项,不能再由另一些属性组成。
属性不能与其他实体具有联系。联系只发生在实体之间。
符合上述两条特性的事物一般作为属性对待。
为了简化 E-R图的处置,现实世界中的事物凡能够作为属性对待的,应尽量作为属性。
逐一设计分 E-R图(续)
举例例 1:,学生,由学号、姓名等属性进一步描述,根据准则1,,学生,只能作为实体,
不能作为属性。
例 2:职称通常作为教师实体的属性,但在涉及住房分配时,由于分房与职称有关,也就是说职称与住房实体之间有联系,根据准则
2,这时把职称作为实体来处理会更合适些。
(教程P 194图 6-10)
逐一设计分 E-R图(续)
设计分 E-R图的步骤
( 1)以数据字典为出发点定义 E-R图。
数据字典中的,数据结构,,,数据流,
和,数据存储,等已是若干属性的有意义的聚合
( 2)按上面给出的准则进行必要的调整。
逐一设计分 E-R图(续)
例:学籍管理局部应用中主要涉及的实体包括学生、宿舍、档案材料、班级、班主任。
实体之间的联系:
由于一个宿舍可以住多个学生,而一个学生只能住在某一个宿舍中,因此宿舍与学生之间是 1:n的联系。
由于一个班级往往有若干名学生,而一个学生只能属于一个班级,因此班级与学生之间也是 1:n的联系 。
逐一设计分 E-R图(续)
由于班主任同时还要教课,因此班主任与学生之间存在指导联系,一个班主任要教多名学生,而一个学生只对应一个班主任,因此班主任与学生之间也是 1:n的联系。
而学生和他自己的档案材料之间,班级与班主任之间都是 1:1的联系。
学籍管理局部应用的分 E-R图草图:教程P
195图 6- 11
逐一设计分 E-R图(续)
接下来需要进一步斟酌该 E-R图,做适当调整。
(1) 在一般情况下,性别通常作为学生实体的属性,但在本局部应用中,由于宿舍分配与学生性别有关,根据准则2,应该把性别作为实体对待。
(2) 数据存储,学生登记表,,由于是手工填写,供存档使用,其中有用的部分已转入学生档案材料中,因此这里就不必作为实体了。
最后得到学籍管理局部应用的分 E-R图:教程P
195如图 6-12。
逐一设计分 E-R图(续)
该 E-R图中省略了各个实体的属性描述:
学生:{ 学号,姓名,出生日期}
性别:{ 性别 }
档案材料:{ 档案号,…… }
班级:{ 班级号,学生人数}
班主任:{ 职工号,姓名,性别,
是否为优秀班主任}
宿舍:{ 宿舍编号,地址,人数}
其中有下划线的属性为实体的码。
逐一设计分 E-R图(续)
同样方法可以得到课程管理局部应用的分 E-R图,
(图 6-13)
各实体的属性分别为:
学生:{姓名,学号,性别,年龄,所在系,
年级,平均成绩}
课程:{ 课程号,课程名,学分}
教师:{ 职工号,姓名,性别,职称}
教科书:{ 书号,书名,价钱}
教室:{ 教室编号,地址,容量}
题目
设有一局部应用,包括 3个实体,,科室,,,医生,和,病人,,且有以下事实:
每位医生属于且仅属于一个科室;每个科室有多位医生可接诊病人;病人根据自己的症状选择相应的科室就诊;一位病人在同一科室中多次看病时,每次可能由不同的医生为其诊断。
设科室的属性包括科室代码、科室名称,医生的属性包括工号、姓名、职称,病人的属性包括姓名、年龄、工作单位,试设计局部 ER图。
6.3 概念结构设计
6.3.1 概念结构
6.3.2 概念结构设计的方法与步骤
6.3.3 数据抽象与局部视图设计
6.3.4 视图的集成
6.3.4 视图的集成
各个局部视图即 分 E-R图 建立好后,还需要对它们进行 合并,集成为一个整体的数据概念结构即 总 E-R图 。
视图的集成(续)
视图集成的两种方式
一次集成( P224图 6.25(a))
一次集成多个分 E-R图
通常用于局部视图比较简单时
逐步累积式( P224图 6.25(b))
首先集成两个局部视图(通常是比较关键的两个局部视图)
以后每次将一个新的局部视图集成进来视图的集成(续)
集成局部 E-R图的步骤
1,合并
2,修改与重构视图的集成(续)
一、合并分 E-R图,生成初步 E-R图
各分E-R图存在冲突
各个局部应用所面向的问题不同由不同的设计人员进行设计各个分 E-R图之间必定会存在许多不一致的地方
合并分 E-R图的主要工作与关键所在:合理消除各分 E-R图的冲突合并分 E-R图,生成初步 E-R图(续)
冲突的种类
属性冲突
命名冲突
结构冲突
⒈ 属性冲突
两类属性冲突
属性域冲突,属性值的类型、取值范围或取值集合不同。
例 1,由于学号是数字,因此 某些部门 (即局部应用)将学号定义为整数形式,而由于学号不用参与运算,因此 另一些部门 (即局部应用)
将学号定义为字符型形式。
例 2,某些部门(即局部应用)以出生日期形式表示学生的年龄,而另一些部门(即局部应用)用整数形式表示学生的年龄。
属性冲突(续)
属性取值单位冲突 。
例:学生的身高,有的以米为单位,有的以厘米为单位,有的以尺为单位。
属性冲突(续)
属性冲突的解决方法
通常用讨论、协商等行政手段加以解决
⒉ 命名冲突
两类命名冲突
同名异义,不同意义的对象在不同的局部应用中具有相同的名字例,局部应用 A中将教室称为房间局部应用 B中将学生宿舍称为房间
异名同义(一义多名),同一意义的对象在不同的局部应用中具有不同的名字例,有的部门把教科书称为课本有的部门则把教科书称为教材命名冲突(续)
命名冲突可能发生在属性级、实体级、
联系级上。其中属性的命名冲突更为常见。
命名冲突的解决方法
通过讨论、协商等行政手段加以解决
⒊ 结构冲突
三类结构冲突
同一对象在不同应用中具有不同的抽象例,,课程,在某一局部应用中被当作实体在另一局部应用中则被当作属性
解决方法:通常是把属性变换为实体或把实体变换为属性,使同一对象具有相同的抽象。变换时要遵循两个准则。
结构冲突(续)
同一实体在不同局部视图中所包含的属性不完全相同,或者属性的排列次序不完全相同 。
产生原因:不同的局部应用关心的是该实体的不同侧面。
解决方法:使该实体的属性取各分 E-R图中属性的并集,再适当设计属性的次序 。
结构冲突(续)
学生学号 姓名 性别 平均成绩
(a)在局部应用 A中结构冲突(续)
学生学号姓名 出生日期 年级
(b)在局部应用 B中所在系结构冲突(续)
学生学号姓名 政治面貌
(c)在局部应用 C中结构冲突(续)
学生政治面貌学号出生日期 年级
(d)合并后所在系 平均成绩姓名 性别结构冲突(续)
实体之间的联系在不同局部视图中呈现不同的类型例 1,实体 E1与 E2在局部应用 A中是多对多联系,
而在局部应用 B中是一对多联系例 2,在局部应用 X中 E1与 E2发生联系,而在局部应用 Y中 E1,E2,E3三者之间有联系。
解决方法:根据应用语义对实体联系的类型进行综合或调整。 (P226图 6.27)
合并分 E-R图,生成初步 E-R图实例例:生成学校管理系统的初步 E-R图以合并学籍管理局部视图,课程管理局部视图为例这两个分 E-R图存在着多方面的冲突:
合并分 E-R图,生成初步 E-R图实例
(1) 班主任实际上也属于教师,也就是说学籍管理中的班主任实体与课程管理中的教师实体在一定程度上属于异名同义,可以应将学籍管理中的班主任实体与课程管理中的教师实体统一称为教师,统一后教师实体的属性构成为:
教师:{ 职工号,姓名,性别,职称,
是否为优秀班主任}
合并分 E-R图,生成初步 E-R图实例(续)
(2) 将班主任改为教师后,教师与学生之间的联系在两个局部视图中呈现两种不同的类型,一种是学籍管理中教师与学生之间的指导联系,
一种是课程管理中教师与学生之间的教学联系,
由于指导联系实际上可以包含在教学联系之中,
因此可以将这两种联系综合为教学联系。
合并分 E-R图,生成初步 E-R图实例(续)
(3) 性别在两个局部应用中具有不同的抽象,它在学籍管理中为实体,在课程管理中为属性,
按照前面提到的两个原则,在合并后的 E-R图中性别只能作为实体,否则它无法与宿舍实体发生联系。
合并分 E-R图,生成初步 E-R图实例(续)
(4) 在两个局部 E-R图中,学生实体属性组成及次序都存在差异,应将所有属性综合,并重新调整次序。假设调整结果为:
学生:{ 学号,姓名,出生日期,年龄,所在系,年级,平均成绩}
解决上述冲突后,学籍管理分 E-R图与课程管理分 E-R图合并为P 198图 6-16的形式。
二、修改与重构
基本任务
消除不必要的冗余,设计生成基本 E-R图合并初步 E-R图分 E-R图可能存在冗余的数据和冗余的实体间联系基本 E-R图消除不必要的冗余修改与重构(续)
1.冗余
2.消除冗余的方法
1.冗余
冗余的数据是指可由基本数据导出的数据,
冗余的联系是指可由其他联系导出的联系。
冗余数据和冗余联系容易破坏数据库的完整性,
给数据库维护增加困难
并不是所有的冗余数据与冗余联系都必须加以消除,有时为了提高某些应用的效率,不得不以冗余信息作为代价。
冗余(续)
设计数据库概念结构时,哪些冗余信息必须消除,哪些冗余信息允许存在,需要根据用户的整体需求来确定。
消除不必要的冗余后的初步 E-R图称为基本 E-
R图。
2.消除冗余的方法
分析方法
以数据字典和数据流图为依据,根据数据字典中关于数据项之间逻辑关系的说明来消除冗余。
消除冗余的方法 (续 )
例,教师工资单中包括该教师的基本工资、各种补贴、应扣除的房租水电费以及实发工资。
由于实发工资可以由前面各项推算出来,因此可以去掉,在需要查询实发工资时根据基本工资、各种补贴、应扣除的房租水电费数据临时生成。
消除冗余的方法(续)
如果是为了提高效率,人为地保留了一些冗余数据,则应把数据字典中数据关联的说明作为完整性约束条件。
一种更好的方法是把冗余数据定义在视图中消除冗余的方法(续)
规范化理论
函数依赖的概念提供了消除冗余联系的形式化工具消除冗余的方法(续)
方法
1,确定分 E-R图实体之间的数据依赖 FL 。实体之间一对一、一对多、多对多的联系可以用实体码之间的函数依赖来表示。
例:
班级和学生之间一对多的联系:
学号?班级号学生和课程之间多对多的联系:
(学号,课程号)?成绩消除冗余的方法(续)
2,求 FL的最小覆盖 GL,差集为
D = FL-GL。
逐一考察 D中的函数依赖,确定是否是冗余的联系,若是,就把它去掉。
消除冗余的方法(续)
由于规范化理论受到泛关系假设的限制,应注意下面两个问题:
1.冗余的联系一定在 D中,而 D中的联系不一定是冗余的;
2.当实体之间存在多种联系时要将实体之间的联系在形式上加以区分。
例 P229图 6.30中部门和职工之间两种联系表示为:
负责人,职工号?部门号部门号?负责人,职工号泛关系假设
假设存在着一个单一的关系模式
,假设已知一个模式 Sφ,它仅由单个关系模式组成,问题是要设计一个模式 SD,它与 Sφ‘等价 ’,但在某些方面更好一些,
从一个关系模式出发,而不是从一组关系模式出发实行分解
,等价,的定义也是一组关系模式与一个关系模式的,等价,
泛关系假设 (续 )
泛关系假设是运用规范化理论时的障碍
承认了泛关系假设,就等于承认了现实世界各实体间只能有一种联系消除冗余,设计生成基本 E-R图实例教程P 198图 6-16的初步 E-R图中存在着冗余数据和冗余联系:
(1) 学生实体中的年龄属性可以由出生日期推算出来,属于冗余数据,应该去掉。这样不仅可以节省存储空间,而且当某个学生的出生日期有误,进行修改后,无须相应修改年龄,减少了产生数据不一致的机会。
学生:{ 学号,姓名,出生日期,所在系,
年级,平均成绩}
消除冗余,设计生成基本 E-R图实例(续)
(2) 教室实体与班级实体的上课联系可以由教室与课程之间的开设联系、课程与学生之间的选修联系、学生与班级之间的组成联系三者推导出来,因此属于冗余联系,可以消去。
消除冗余,设计生成基本 E-R图实例(续)
(3) 学生实体中的平均成绩可以从选修联系中的成绩属性中推算出来
由于应用中需要经常查询某个学生的平均成绩,每次都进行这种计算效率就会太低,因此为提高效率,保留该冗余数据
但定义一个触发器来保证学生的平均成绩等于该学生各科成绩的平均值。
任何一科成绩修改后,或该学生学了新的科目并有成绩后,就触发该触发器去修改该学生的平均成绩属性值。
消除冗余,设计生成基本 E-R图实例(续)
教程P 200图 17是对图 16进行修改和重构后生成的基本 E-R图。
学生管理子系统的基本 E-R图与教师管理子系统以及后勤管理子系统的基本 E-R图合并后,生成整个学校管理系统的基本
E-R图三、验证整体概念结构
视图集成后形成一个整体的数据库概念结构,
对该整体概念结构还必须进行进一步验证,确保它能够满足下列条件,
整体概念结构内部必须具有一致性,不存在互相矛盾的表达。
整体概念结构能准确地反映原来的每个视图结构,包括属性、实体及实体间的联系。
整体概念结构能满足需要分析阶段所确定的所有要求。
验证整体概念结构(续)
整体概念结构最终还应该提交给用户,
征求用户和有关人员的意见,进行评审、
修改和优化,然后把它确定下来,作为数据库的概念结构,作为进一步设计数据库的依据 。
数据库设计
数据库的设计过程
需求分析
概念结构设计
逻辑结构设计
物理数据库设计
实施
运行维护设计过程中往往还会有许多反复。
概念结构设计小结
什么是概念结构设计现实世界机器世界信息世界需求分析概念结构设计概念结构设计小结
概念结构设计的步骤
抽象数据并设计局部视图
集成局部视图,得到全局概念结构
验证整体概念结构概念结构设计小结
数据抽象
分类
聚集
概括概念结构设计小结
设计局部视图
⒈ 选择局部应用
⒉ 逐一设计分 E-R图
标定局部应用中的实体、属性、码,实体间的联系
用 E-R图描述出来概念结构设计小结
集成局部视图
1.合并分 E-R图,生成初步 E-R图
消除冲突
属性冲突
命名冲突
结构冲突
2,修改与重构
消除不必要的冗余,设计生成基本 E-R图
分析方法
规范化理论下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第六章 数据库设计 (续 -2)
第六章 数据库设计
6.1 数据库设计概述
6.2 需求分析
6.3 概念结构设计
6.4 逻辑结构设计
6.5 数据库的物理设计
6.6 数据库实施
6.7 数据库运行与维护
6.8 小结
6.4 逻辑结构设计
逻辑结构设计的任务
概念结构是各种数据模型的共同基础
为了能够用某一 DBMS实现用户需求,还必须将概念结构进一步转化为相应的数据模型,
这正是数据库逻辑结构设计所要完成的任务。
6.4 逻辑结构设计
逻辑结构设计的步骤
将概念结构转化为一般的关系,网状,层次模型
将转化来的关系,网状,层次模型向特定
DBMS支持下的数据模型转换
对数据模型进行优化逻辑结构设计转化为一般数据模型转化为特定 DBMS
支持下的据模型优化模型概念结构设计数据库物理设计基本 E-R图转换规则特定
DBMS的特点与限制优化方法如规范化理论逻辑模型
6.4 逻辑结构设计
6.4.1 E-R图向关系模型的转换
6.4.2 向特定 DBMS规定的模型进行转换
6.4.3 数据模型的优化
6.4.4 设计用户子模式
6.4.1 E-R图向关系模型的转换
转换内容
转换原则
E-R图向关系模型的转换(续)
转换内容
E-R图由实体、实体的属性和实体之间的联系三个要素组成
关系模型的逻辑结构是一组关系模式的集合
将 E-R图转换为 关系模型,将实体、实体的属性和实体之间的联系转化为关系模式。
E-R图向关系模型的转换(续)
转换原则
⒈ 一个 实体型 转换为一个关系模式。
关系的属性,实体型的属性
关系的码,实体型的码例,学生实体可以转换为如下关系模式:
学生( 学号,姓名,出生日期,所在系,
年级,平均成绩)
性别、宿舍、班级、档案材料、教师、课程、教室、
教科书都分别转换为一个关系模式。
学生学号 出生日期 年级所在系 平均成绩姓名
E-R图向关系模型的转换(续)
⒉ 一个 m:n联系 转换为一个关系模式。
关系的属性,与该联系相连的各实体的码以及联系本身的属性
关系的码,各实体码的组合例,,选修,联系是一个 m:n联系,可以将它转换为如下关系模式,其中学号与课程号为关系的组合码:
选修( 学号,课程号,成绩)
E-R图向关系模型的转换(续)
⒊ 一个 1:n联系 可以转换为一个独立的关系模式,
也可以与 n端对应的关系模式合并。
1) 转换为一个独立的关系模式
关系的属性,与该联系相连的各实体的码以及联系本身的属性
关系的码,n端实体的码
E-R图向关系模型的转换(续)
2) 与 n端对应的关系模式合并
合并后关系的属性,在 n端关系中加入 1端关系的码和联系本身的属性
合并后关系的码,不变
可以减少系统中的关系个数,一般情况下更倾向于采用这种方法
E-R图向关系模型的转换(续)
例,,组成,联系为 1:n联系。
将其转换为关系模式的两种方法:
1)使其成为一个独立的关系模式:
组成( 学号,班级号)
2)将其学生关系模式合并:
学生( 学号,姓名,出生日期,所在系,
年级,班级号,平均成绩)
E-R图向关系模型的转换(续)
⒋ 一个 1:1联系可以转换为一个独立的关系模式,
也可以与任意一端对应的关系模式合并。
1) 转换为一个独立的关系模式
关系的属性,与该联系相连的各实体的码以及联系本身的属性
关系的候选码,每个实体的码均是该关系的候选码
E-R图向关系模型的转换(续)
2) 与某一端对应的关系模式合并
合并后关系的属性,加入对应关系的码和联系本身的属性
合并后关系的码,不变
E-R图向关系模型的转换(续)
例,,管理,联系为 1:1联系,可以有三种转换方法:
( 1)转换为一个独立的关系模式:
管理( 职工号,班级号)
或 管理(职工号,班级号 )
( 2),管理,联系与班级关系模式合并,则只需在班级关系中加入教师关系的码,即职工号:
班级:( 班级号,学生人数,职工号 )
( 3),管理,联系与教师关系模式合并,则只需在教师关系中加入班级关系的码,即班级号:
教师:( 职工号,姓名,性别,职称,班级号,
是否为优秀班主任)
E-R图向关系模型的转换(续)
注意:
从理论上讲,1:1联系可以与任意一端对应的关系模式合并。
但在一些情况下,与不同的关系模式合并效率会大不一样。因此究竟应该与哪端的关系模式合并需要依应用的具体情况而定。
由于连接操作是最费时的操作,所以一般应以尽量减少连接操作为目标。
例如,如果经常要查询某个班级的班主任姓名,则将管理联系与教师关系合并更好些。
E-R图向关系模型的转换(续)
⒌ 三个或三个以上实体间的一个 多元联系 转换为一个关系模式。
关系的属性,与该多元联系相连的各实体的码以及联系本身的属性
关系的码,各实体码的组合例,,讲授,联系是一个三元联系,可以将它转换为如下关系模式,其中课程号、职工号和书号为关系的组合码:
讲授( 课程号,职工号,书号 )
E-R图向关系模型的转换(续)
⒍ 同一实体集的实体间的联系,即 自联系,也可按上述 1:1,1:n和 m:n三种情况分别处理。
例,如果教师实体集内部存在领导与被领导的
1:n自联系,我们可以将该联系与教师实体合并,这时主码职工号将多次出现,但作用不同,
可用不同的属性名加以区分:
教师:{ 职工号,姓名,性别,职称,系主任 }
E-R图向关系模型的转换(续)
⒎ 具有相同码的关系模式可合并。
目的:减少系统中的关系个数。
合并方法:将其中一个关系模式的全部属性加入到另一个关系模式中,然后去掉其中的同义属性(可能同名也可能不同名),并适当调整属性的次序。
E-R图向关系模型的转换(续)
例,,拥有,关系模式:
拥有( 学号,性别)
与学生关系模式:
学生( 学号,姓名,出生日期,所在系,年级,
班级号,平均成绩)
都以学号为码,可以将它们合并为一个关系模式:
学生( 学号,姓名,性别,出生日期,所在系,
年级,班级号,平均成绩)
E-R图向关系模型的转换(续)
实例
按照上述七条原则,学生管理子系统中的 18个实体和联系可以转换为下列关系模型:
学生( 学号,姓名,性别,出生日期,所在系,
年级,班级号,平均成绩,档案号)
性别( 性别,宿舍楼)
宿舍( 宿舍编号,地址,性别,人数)
班级( 班级号,学生人数)
教师( 职工号,姓名,性别,职称,班级号,
是否为优秀班主任)
E-R图向关系模型的转换(续)
教学( 职工号,学号 )
课程( 课程号,课程名,学分,教室号)
选修( 学号,课程号,成绩)
教科书( 书号,书名,价钱)
教室( 教室编号,地址,容量)
讲授( 课程号,教师号,书号 )
档案材料( 档案号,…… )
E-R图向关系模型的转换(续)
该关系模型由 12个关系模式组成。
其中:
学生关系模式包含了,拥有,联系,,组成,
联系,,归档,联系所对应的关系模式
教师关系模式包含了,管理,联系所对应的关系模式;
宿舍关系模式包含了,住宿,联系所对应的关系模式;
课程关系模式包含了,开设,联系所对应的关系模式 。
6.4 逻辑结构设计
6.4.1 E-R图向关系模型的转换
6.4.2 向特定 DBMS规定的模型进行转换
6.4.3 数据模型的优化
6.4.4 设计用户子模式
6.4.2 向特定 DBMS规定的模型进行转换
一般的数据模型还需要向特定 DBMS规定的模型进行转换。
转换的主要依据是所选用的 DBMS的功能及限制。没有通用规则。
对于关系模型来说,这种转换通常都比较简单。
6.4 逻辑结构设计
6.4.1 E-R图向关系模型的转换
6.4.2 向特定 DBMS规定的模型进行转换
6.4.3 数据模型的优化
6.4.4 设计用户子模式
6.4.3 数据模型的优化
数据库逻辑设计的结果不是唯一的。
得到初步数据模型后,还应该适当地修改、调整数据模型的结构,以进一步提高数据库应用系统的性能,这就是数据模型的优化。
关系数据模型的优化通常以 规范化理论为指导。
数据模型的优化(续)
优化数据模型的方法
⒈ 确定数据依赖
按需求分析阶段所得到的语义,分别写出每个关系模式内部各属性之间的数据依赖以及不同关系模式属性之间数据依赖 。
数据模型的优化(续)
例,课程关系模式内部存在下列数据依赖:
课程号 → 课程名课程号 → 学分课程号 → 教室号选修关系模式中存在下列数据依赖:
(学号,课程号) → 成绩数据模型的优化(续)
⒉ 对于各个关系模式之间的数据依赖进行极小化处理,消除冗余的联系。
数据模型的优化(续)
⒊ 按照数据依赖的理论对关系模式逐一进行分析,
考查是否存在部分函数依赖、传递函数依赖、多值依赖等,确定各关系模式分别属于第几范式。
例如经过分析可知,课程关系模式属于 BC范式。
数据模型的优化(续)
⒋ 按照需求分析阶段得到的各种应用对数据处理的要求,分析对于这样的应用环境这些模式是否合适,确定是否要对它们进行 合并 或分解 。
数据模型的优化(续)
并不是规范化程度越高的关系就越优。
当一个应用的查询中经常涉及到两个或多个关系模式的属性时,系统必须经常地进行联接运算,而联系运算的代价是相当高的,可以说关系模型低效的主要原因就是做联接运算引起的,因此在这种情况下,第二范式甚至第一范式也许是最好的。
数据模型的优化(续)
非 BCNF的关系模式虽然从理论上分析会存在不同程度的更新异常,但如果在实际应用中对此关系模式只是查询,并不执行更新操作,则就不会产生实际影响。
对于一个具体应用来说,到底规范化进行到什么程度,需要权衡响应时间和潜在问题两者的利弊才能决定。一般说来,第三范式就足够了。
数据模型的优化(续)
例:在关系模式学生成绩单 (学号,英语,数学,语文,平均成绩 )
中存在下列函数依赖:
学号 → 英语学号 → 数学学号 → 语文学号 → 平均成绩
(英语,数学,语文 )→ 平均成绩数据模型的优化(续)
显然有:
学号 → (英语,数学,语文 )
因此该关系模式中存在传递函数信赖,是
2NF关系。
虽然平均成绩可以由其他属性推算出来,但如果应用中需要经常查询学生的平均成绩,
为提高效率,我们仍然可保留该冗余数据,
对关系模式不再做进一步分解。
数据模型的优化(续)
⒌ 按照需求分析阶段得到的各种应用对数据处理的要求,对关系模式进行必要的分解或合并,以提高数据操作的效率和存储空间的利用率
常用分解方法
水平分解
垂直分解数据模型的优化(续)
水平分解
什么是水平分解
把 (基本 )关系的元组分为若干子集合,
定义每个子集合为一个子关系,以提高系统的效率 。
数据模型的优化(续)
水平分解的适用范围
1,满足,80/20原则,的应用
80/20原则:一个大关系中,经常被使用的数据只是关系的一部分,约 20%
把经常使用的数据分解出来,形成一个子关系,可以减少查询的数据量 。
数据模型的优化(续)
水平分解的适用范围
2,并发事务经常存取不相交的数据
如果关系 R上具有 n个事务,而且多数事务存取的数据不相交,则 R可分解为少于或等于 n个子关系,使每个事务存取的数据对应一个关系 。
数据模型的优化(续)
水平分解
什么是水平分解
把 (基本 )关系的元组分为若干子集合,
定义每个子集合为一个子关系,以提高系统的效率 。
水平分解的适用范围
满足,80/20原则,的应用
并发事务经常存取不相交的数据数据模型的优化(续)
满足,80/20原则,的应用
80/20原则:一个大关系中,经常被使用的数据只是关系的一部分,约 20%
把经常使用的数据分解出来,形成一个子关系,可以减少查询的数据量 。
并发事务经常存取不相交的数据
如果关系 R上具有 n个事务,而且多数事务存取的数据不相交,则 R可分解为少于或等于 n个子关系,使每个事务存取的数据对应一个关系 。
数据模型的优化(续)
垂直分解
什么是垂直分解
把关系模式 R的属性分解为若干子集合,
形成若干子关系模式 。
垂直分解的原则
经常在一起使用的属性从 R中分解出来形成一个子关系模式 。
数据模型的优化(续)@
垂直分解的 优点
可以提高某些事务的效率
垂直分解的 缺点
可能使另一些事务不得不执行连接操作,从而降低了效率 。
数据模型的优化(续)
垂直分解的适用范围
取决于分解后 R上的所有事务的总效率是否得到了提高 。
进行垂直分解的方法
简单情况:直观分解
复杂情况:用第五章中的模式分解算法
垂直分解必须不损失关系模式的语义 (保持无损连接性和保持函数依赖 )。
6.4 逻辑结构设计
6.4.1 E-R图向关系模型的转换
6.4.2 向特定 DBMS规定的模型进行转换
6.4.3 数据模型的优化
6.4.4 设计用户子模式
6.4.4 设计用户子模式
定义数据库模式主要是从系统的时间效率、空间效率、易维护等角度出发。
定义 用户外模式 时应该更注重考虑用户的习惯与方便。包括三个方面:
设计用户子模式(续)
(1) 使用更符合用户习惯的别名
合并各分 E-R图曾做了消除命名冲突的工作,
以使数据库系统中同一关系和属性具有唯一的名字。这在设计数据库整体结构时是非常必要的。
但对于某些局部应用,由于改用了不符合用户习惯的属性名,可能会使他们感到不方便,
设计用户子模式(续)
因此在设计用户的子模式时可以重新定义某些属性名,使其与用户习惯一致。
当然,为了应用的规范化,我们也不应该一味地迁就用户。
例:负责学籍管理的用户习惯于称教师模式的职工号为教师编号。因此可以定义视图,
在视图中职工号重定义为教师编号设计用户子模式(续)
(2) 针对不同级别的用户定义不同的外模式,以满足系统对安全性的要求。
设计用户子模式(续)
例:
教师关系模式中包括职工号、姓名、性别、出生日期、婚姻状况、学历、学位、政治面貌、职称、
职务、工资、工龄、教学效果等属性。
学籍管理应用 只能查询教师的职工号、姓名、
性别、职称数据;
课程管理应用 只能查询教师的职工号、姓名、
性别、学历、学位、职称、教学效果数据;
教师管理应用 则可以查询教师的全部数据。
设计用户子模式(续)
定义两个外模式:
教师 _学籍管理 (职工号,姓名,性别,职称 )
教师 _课程管理 (工号,姓名,性别,学历,
学位,职称,教学效果 )
授权学籍管理应用只能访问教师 _学籍管理视图授权课程管理应用只能访问教师 _课程管理视图授权教师管理应用能访问教师表这样就可以防止用户非法访问本来不允许他们查询的数据,保证了系统的安全性。
设计用户子模式(续)
(3) 简化用户对系统的使用
如果某些局部应用中经常要使用某些很复杂的查询,为了方便用户,可以将这些复杂查询定义为视图。
逻辑结构设计 小结
任务
将概念结构转化为具体的数据模型
逻辑结构设计的步骤
将概念结构转化为一般的关系、网状、层次模型
将转化来的关系、网状、层次模型向特定 DBMS
支持下的数据模型转换
对数据模型进行优化
设计用户子模式逻辑结构设计小结
E-R图向关系模型的转换内容
将 E-R图转换为关系模型:将实体、实体的属性和实体之间的联系转化为关系模式。
逻辑结构设计小结
E-R图向关系模型的转换原则
⒈ 一个 实体型 转换为一个关系模式。
⒉ 一个 m:n联系 转换为一个关系模式。
⒊ 一个 1:n联系 可以转换为一个独立的关系模式,
也可以与 n端对应的关系模式合并。
⒋ 一个 1:1联系 可以转换为一个独立的关系模式,
也可以与任意一端对应的关系模式合并。
逻辑结构设计小结
⒌ 三个或三个以上实体间的一个 多元联系 转换为一个关系模式。
⒍ 同一实体集的实体间的联系,即 自联系,也可按上述 1:1,1:n和 m:n三种情况分别处理。
⒎ 具有 相同码 的关系模式可合并。
逻辑结构设计小结
优化数据模型的方法
⒈ 确定数据依赖
⒉ 对于各个关系模式之间的数据依赖进行极小化处理,消除冗余的联系。
⒊ 确定各关系模式分别属于第几范式。
⒋ 分析对于应用环境这些模式是否合适,确定是否要对它们进行合并或分解。
⒌ 对关系模式进行必要的分解或合并逻辑结构设计小结
设计用户子模式
1,使用更符合用户习惯的别名
2,针对不同级别的用户定义不同的外模式,以满足系统对安全性的要求。
3,简化用户对系统的使用第六章 数据库设计
6.1 数据库设计概述
6.2 需求分析
6.3 概念结构设计
6.4 逻辑结构设计
6.5 数据库的物理设计
6.6 数据库实施
6.7 数据库运行与维护
6.8 小结
6.5 数据库的物理设计
什么是数据库的物理设计
数据库在 物理设备 上的 存储结构 与 存取方法称为数据库的物理结构,它依赖于给定的计算机系统。
为一个给定的逻辑数据模型选取一个最适合应用环境的物理结构的过程,就是数据库的物理设计。
6.5 数据库的物理设计
数据库物理设计的步骤
确定数据库的物理结构
对物理结构进行评价,评价的重点是时间和空间效率
如果评价结果满足原设计要求则可进入到物理实施阶段,否则,就需要重新设计或修改物理结构,有时甚至要返回逻辑设计阶段修改数据模型。
数据库物理设计确定数据库的物理结构评价数据库的物理结构逻辑结构设计数据库实施物理模型逻辑模型
6.5 数据库的物理设计
6.5.1 数据库的物理设计的内容和方法
6.5.2 关系模式存取方法选择
6.5.3 确定数据库的存储结构
6.5.4 评价物理结构
6.5 数据库的物理设计
6.5.1 数据库的物理设计的内容和方法
6.5.2 关系模式存取方法选择
6.5.3 确定数据库的存储结构
6.5.4 评价物理结构
6.5.1 数据库的物理设计的内容和方法
设计物理数据库结构的准备工作
1,充分了解应用环境,详细分析要运行的事务,以获得选择物理数据库设计所需参数
2,充分了解所用 RDBMS的内部特征,特别是系统提供的存取方法和存储结构数据库的物理设计的内容和方法(续)
选择物理数据库设计所需参数
数据库查询事务
查询的关系
查询条件所涉及的属性
连接条件所涉及的属性
查询的投影属性数据库的物理设计的内容和方法(续)
选择物理数据库设计所需参数 (续 )
数据更新事务
被更新的关系
每个关系上的更新操作条件所涉及的属性
修改操作要改变的属性值
每个事务在各关系上运行的频率和性能要求数据库的物理设计的内容和方法(续)
关系数据库物理设计的内容
1,为关系模式选择 存取方法 (建立存取路径 )
2,设计关系、索引等数据库文件的 物理存储结构
6.5 数据库的物理设计
6.5.1 数据库的物理设计的内容和方法
6.5.2 关系模式存取方法选择
6.5.3 确定数据库的存储结构
6.5.4 评价物理结构
6.5.2 关系模式存取方法选择
数据库系统是多用户共享的系统,对同一个关系要建立多条存取路径才能满足多用户的多种应用要求。
物理设计的第一个任务就是要确定选择哪些存取方法,即建立哪些存取路径。
关系模式存取方法选择(续)
DBMS常用存取方法
索引方法,目前主要是 B+树索引方法
聚簇( Cluster)方法
HASH方法一、索引存取方法的选择
选择索引存取方法的主要内容根据应用要求确定
对哪些属性列建立索引
对哪些属性列建立组合索引
对哪些索引要设计为唯一索引索引存取方法的选择(续)
选择索引存取方法的一般规则
如果一个 (或一组 )属性经常在 查询 条件中出现,则考虑在这个 (或这组 )属性上建立索引
(或组合索引 )
如果一个属性经常作为 最大值和最小值 等聚集函数的参数,则考虑在这个属性上建立索引
如果一个 (或一组 )属性经常在 连接 操作的连接条件中出现,则考虑在这个 (或这组 )属性上建立索引索引存取方法的选择(续)
关系上定义的索引数 过多 会带来较多的额外开销
维护索引的开销
查找索引的开销二、聚簇存取方法的选择
什么是聚簇
为了提高某个属性(或属性组)的查询速度,
把这个或这些属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块称为聚簇
许多关系型 DBMS都提供了聚簇功能
聚簇存放与聚簇索引的区别建立聚簇索引 (复习)
聚簇索引
建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放 。 也即聚簇索引的索引项顺序与表中元组的物理顺序一致 。
例:
CREATE CLUSTER INDEX Stusname ON Student(Sname);
在 Student表的 Sname( 姓名 ) 列上建立一个聚簇索引,而且 Student表中的记录将按照 Sname值的升序存放建立聚簇索引 (复习)
在一个基本表上最多只能建立一个聚簇索引
聚簇索引的用途:对于某些类型的查询,可以提高查询效率
聚簇索引的适用范围
很少对基表进行增删操作
很少对其中的变长列进行修改操作聚簇存取方法的选择(续)
聚簇的用途
1,大大提高按聚簇属性进行查询的效率例:假设学生关系按所在系建有索引,现在要查询信息系的所有学生名单。
信息系的 500名学生分布在 500个不同的物理块上时,至少要执行 500次 I/O操作。
如果将同一系的学生元组集中存放,则每读一个物理块可得到多个满足查询条件的元组,
从而显著地减少了访问磁盘的次数。
聚簇存取方法的选择(续)
2,节省存储空间
聚簇以后,聚簇码相同的元组集中在一起了,因而聚簇码值不必在每个元组中重复存储,只要在一组中存一次就行了聚簇存取方法的选择(续)
聚簇的局限性
1,聚簇只能提高某些特定应用的性能
2,建立与维护聚簇的开销相当大
对已有关系建立聚簇,将导致关系中元组移动其物理存储位置,并使此关系上原有的索引无效,必须重建。
当一个元组的聚簇码改变时,该元组的存储位置也要做相应移动。
聚簇存取方法的选择(续)
聚簇的适用范围
1,既适用于单个关系独立聚簇,也适用于多个关系组合聚簇例:假设用户经常要按系别查询学生成绩单,这一查询涉及学生关系和选修关系的连接操作,即需要按学号连接这两个关系,为提高连接操作的效率,可以把具有相同学号值的学生元组和选修元组在物理上聚簇在一起。这就相当于把多个关系按,预连接,的形式存放,从而大大提高连接操作的效率。
聚簇存取方法的选择(续)
2,当通过聚簇码进行访问或连接是该关系的主要应用,与聚簇码无关的其他访问很少或者是次要的时,可以使用聚簇。
尤其当 SQL语句中包含有与聚簇码有关的
ORDER BY,GROUP BY,UNION,
DISTINCT等子句或短语时,使用聚簇特别有利,可以省去对结果集的排序操作聚簇存取方法的选择(续)
选择聚簇存取方法
1,设计候选聚簇
对经常在一起进行连接操作的关系可以建立组合聚簇;
如果一个关系的一组属性经常出现在相等比较条件中,则该单个关系可建立聚簇;
如果一个关系的一个 (或一组 )属性上的值重复率很高,则此单个关系可建立聚簇。
即对应每个聚簇码值的平均元组数不太少。
太少了,聚簇的效果不明显。
聚簇存取方法的选择(续)
2,检查候选聚簇中的关系,取消其中不必要的关系
从独立聚簇中删除经常进行全表扫描的关系;
从独立 /组合聚簇中删除更新操作远多于查询操作的关系;
从独立 /组合聚簇中删除重复出现的关系
当 一个关系同时加入多个聚簇 时,必须 从这多个聚簇方案 (包括不建立聚簇 )中选择一个较优的,即在这个聚簇上运行各种事务的总代价最小。
三,HASH存取方法的选择
选择 HASH存取方法的规则
当一个关系满足下列两个条件时,可以选择
HASH存取方法
该关系的属性主要出现在 等值连接 条件中或主要出现在 相等比较 选择条件中
该关系的大小可预知,而且不变;
或该关系的大小动态改变,但所选用的
DBMS提供了动态 HASH存取方法。
6.5 数据库的物理设计
6.5.1 数据库的物理设计的内容和方法
6.5.2 关系模式存取方法选择
6.5.3 确定数据库的存储结构
6.5.4 评价物理结构
6.5.3 确定数据库的存储结构
确定数据库物理结构的内容
1,确定数据的存放位置和存储结构
关系
索引
聚簇
日志
备份
2,确定系统配置
1,确定数据的存放位置
影响数据存放位置和存储结构的因素
硬件环境
应用需求
存取时间
存储空间利用率
维护代价这三个方面常常是相互矛盾的例:消除一切冗余数据虽能够节约存储空间和减少维护代价,但往往会导致检索代价的增加必须进行权衡,选择一个折中方案 。
确定数据的存放位置(续)
基本原则
根据应用情况将
易变 部分与 稳定 部分
存取频率较高 部分与 存取频率较低 部分分开存放,以提高系统性能确定数据的存放位置(续)
例:
数据库数据备份、日志文件备份等由于只在故障恢复时才使用,而且数据量很大,
可以考虑存放在磁带上。
如果计算机有多个磁盘,可以考虑将表和索引分别放在不同的磁盘上,在查询时,
由于两个磁盘驱动器分别在工作,因而可以保证物理读写速度比较快。
确定数据的存放位置(续)
例(续):
可以将比较大的表分别放在两个磁盘上,
以加快存取速度,这在多用户环境下特别有效。
可以将日志文件与数据库对象(表、索引等)放在不同的磁盘以改进系统的性能。
2,确定系统配置
DBMS产品一般都提供了一些存储分配参数
同时使用数据库的用户数
同时打开的数据库对象数
使用的缓冲区长度、个数
时间片大小
数据库的大小
装填因子
锁的数目
等等
6.5 数据库的物理设计
6.5.1 数据库的物理设计的内容和方法
6.5.2 关系模式存取方法选择
6.5.3 确定数据库的存储结构
6.5.4 评价物理结构
6.5.4 评价物理结构
评价内容
对数据库物理设计过程中产生的多种方案进行细致的评价,从中选择一个较优的方案作为数据库的物理结构
6.5.4 评价物理结构
评价方法
定量估算各种方案
存储空间
存取时间
维护代价
对估算结果进行权衡、比较,选择出一个较优的合理的物理结构
如果该结构不符合用户需求,则需要修改设计第六章 数据库设计
6.1 数据库设计概述
6.2 需求分析
6.3 概念结构设计
6.4 逻辑结构设计
6.5 数据库的物理设计
6.6 数据库实施
6.7 数据库运行与维护
6.8 小结
6.6 数据库的实施
数据库实施的工作内容
用 DDL定义数据库结构
组织数据入库
编制与调试应用程序
数据库试运行数据库实施定义数据库结构数据装载数据库试运行数据库物理设计 数据库运行和维护物理模型编制与调试应用程序数据库系统一、定义数据库结构
确定了数据库的逻辑结构与物理结构后,
就可以用所选用的 DBMS提供的数据定义语言( DDL)来严格描述数据库结构。
定义数据库结构(续)
例,对于前面的例子,可以用 SQL语句如下定义表结构:
CREATE TABLE 学生
(学号 CHAR(8),
……………
);
CREATE TABLE 课程
(
……………
);
……………
定义数据库结构(续)
接下来是在这些基本表上定义视图:
CREATE VIEW,...
(
……………
);
……………
如果需要使用聚簇,在建基本表之前,应先用
CREATE CLUSTER语句定义聚族。
二、数据装载
数据库结构建立好后,就可以向数据库中装载数据了。组织数据入库是数据库实施阶段最主要的工作。
数据装载方法
人工方法
计算机辅助数据入库数据装载(续)
人工方法:适用于小型系统
步骤
1) 筛选数据 。需要装入数据库中的数据通常都分散在各个部门的数据文件或原始凭证中,所以首先必须把需要入库的数据筛选出来。
2) 转换数据格式 。筛选出来的需要入库的数据,其格式往往不符合数据库要求,还需要进行转换。这种转换有时可能很复杂。
3) 输入数据 。将转换好的数据输入计算机中。
4) 校验数据 。检查输入的数据是否有误。
数据装载(续)
计算机辅助数据入库:适用于中大型系统
步骤
1) 筛选数据
2) 输入数据 。由录入员将原始数据直接输入计算机中。数据输入子系统应提供输入界面。
3) 校验数据 。数据输入子系统采用多种检验技术检查输入数据的正确性。
数据装载(续)
4) 转换数据 。数据输入子系统根据数据库系统的要求,从录入的数据中 抽取 有用成分,对其进行 分类,然后 转换 数据格式。
抽取、分类和转换数据是数据输入子系统的主要工作,也是数据输入子系统的复杂性所在。
5) 综合数据 。数据输入子系统对转换好的数据根据系统的要求进一步综合成最终数据 。
数据装载(续)
如果数据库是在老的文件系统或数据库系统的基础上设计的,则数据输入子系统只需要完成转换数据、综合数据两项工作,直接将老系统中的数据转换成新系统中需要的数据格式。
为了保证数据能够及时入库,应在数据库物理设计的同时编制数据输入子系统。
三、编制与调试应用程序
数据库应用程序的设计应该与数据设计并行进行。
在数据库实施阶段,当数据库结构建立好后,
就可以开始编制与调试数据库的应用程序。调试应用程序时由于数据入库尚未完成,可先使用模拟数据。
四、数据库试运行
应用程序调试完成,并且已有一小部分数据入库后,就可以开始数据库的试运行。
数据库试运行也称为联合调试,其主要工作包括:
1) 功能测试,实际运行应用程序,执行对数据库的各种操作,测试应用程序的各种功能。
2) 性能测试,测量系统的性能指标,分析是否符合设计目标 。
数据库试运行(续)
数据库性能指标的测量
数据库物理设计阶段在评价数据库结构估算时间、
空间指标时,作了许多简化和假设,忽略了许多次要因素,因此结果必然很粗糙。
数据库试运行则是要实际测量系统的各种性能指标(不仅是时间、空间指标),如果结果不符合设计目标,则需要返回物理设计阶段,调整物理结构,修改参数;有时甚至需要返回逻辑设计阶段,调整逻辑结构。
数据库试运行(续)
数据的分期入库
重新设计物理结构甚至逻辑结构,会导致数据重新入库。
由于数据入库工作量实在太大,所以可以采用分期输入数据的方法
先输入小批量数据供先期联合调试使用
待试运行基本合格后再输入大批量数据
逐步增加数据量,逐步完成运行评价数据库试运行(续)
数据库的转储和恢复
在数据库试运行阶段,系统还不稳定,硬、
软件故障随时都可能发生
系统的操作人员对新系统还不熟悉,误操作也不可避免
因此必须做好数据库的转储和恢复工作,尽量减少对数据库的破坏。
第六章 数据库设计
6.1 数据库设计概述
6.2 需求分析
6.3 概念结构设计
6.4 逻辑结构设计
6.5 数据库的物理设计
6.6 数据库实施
6.7 数据库运行与维护
6.8 小结
6.7 数据库运行与维护
数据库试运行结果符合设计目标后,数据库就可以真正投入运行了。
数据库投入运行标着开发任务的基本完成和维护工作的开始
对数据库设计进行评价、调整、修改等维护工作是一个长期的任务,也是设计工作的继续和提高。
应用环境在不断变化
数据库运行过程中物理存储会不断变化数据库运行与维护(续)
在数据库运行阶段,对数据库经常性的维护工作主要是由 DBA完成的,包括:
⒈数据库的转储和恢复
转储和恢复是系统正式运行后最重要的维护工作之一。
DBA要针对不同的应用要求制定不同的转储计划,
定期对数据库和日志文件进行备份。
一旦发生介质故障,即利用数据库备份及日志文件备份,尽快将数据库恢复到某种一致性状态。
数据库运行与维护(续)
⒉ 数据库的安全性、完整性控制
DBA必须根据用户的实际需要授予不同的操作权限
在数据库运行过程中,由于应用环境的变化,对安全性的要求也会发生变化,DBA需要根据实际情况修改原有的安全性控制。
由于应用环境的变化,数据库的完整性约束条件也会变化,也需要 DBA不断修正,以满足用户要求。
数据库运行与维护(续)
⒊ 数据库性能的监督、分析和改进
在数据库运行过程中,DBA必须监督系统运行,对监测数据进行分析,找出改进系统性能的方法。
利用监测工具获取系统运行过程中一系列性能参数的值
通过仔细分析这些数据,判断当前系统是否处于最佳运行状态
如果不是,则需要通过调整某些参数来进一步改进数据库性能数据库运行与维护(续)
⒋ 数据库的重组织和重构造
1)数据库的重组织
为什么要重组织数据库
数据库运行一段时间后,由于记录的不断增、删、改,会使数据库的物理存储变坏,
从而降低数据库存储空间的利用率和数据的存取效率,使数据库的性能下降。
数据库运行与维护(续)
重组织的形式
全部重组织
部分重组织
只对频繁增、删的表进行重组织
重组织的目标
提高系统性能数据库运行与维护(续)
重组织的工作
按原设计要求
重新安排存储位置
回收垃圾
减少指针链
数据库的重组织不会改变原设计的数据逻辑结构和物理结构数据库运行与维护(续)
2)数据库的重构造
为什么要进行数据库的重构造
数据库应用环境发生变化,会导致实体及实体间的联系也发生相应的变化,使原有的数据库设计不能很好地满足新的需求
增加新的应用或新的实体
取消某些已有应用
改变某些已有应用数据库运行与维护(续)
数据库重构造的主要工作
根据新环境调整数据库的模式和内模式
增加新的数据项
改变数据项的类型
改变数据库的容量
增加或删除索引
修改完整性约束条件数据库运行与维护(续)
重构造数据库的程度是有限的
若应用变化太大,已无法通过重构数据库来满足新的需求,或重构数据库的代价太大,则表明现有数据库应用系统的生命周期已经结束,应该重新设计新的数据库系统,开始新数据库应用系统的生命周期了。
第六章 数据库设计
6.1 数据库设计概述
6.2 需求分析
6.3 概念结构设计
6.4 逻辑结构设计
6.5 数据库的物理设计
6.6 数据库实施
6.7 数据库运行与维护
6.8 小结
6.8 小结
数据库的设计过程
需求分析
概念结构设计
逻辑结构设计
物理设计
实施
运行维护设计过程中往往还会有许多反复。
小结(续)
数据库各级模式的形成
数据库的各级模式是在设计过程中逐步形成的
需求分析阶段综合各个用户的应用需求(现实世界的需求)。
概念设计阶段形成独立于机器特点、独立于各个 DBMS产品的 概念模式 (信息世界模型),用 E-R图来描述。
小结(续)
在逻辑设计阶段将 E-R图转换成具体的数据库产品支持的数据模型如关系模型,形成数据库 逻辑模式 。然后根据用户处理的要求,
安全性的考虑,在基本表的基础上再建立必要的视图( VIEW)形成数据的 外模式 。
在物理设计阶段根据 DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库 内模式 。
复习题
1,ER图一般用于描述()阶段的工作成果。
A、需求分析
B、概念结构设计
C、逻辑结构设计
D、物理结构设计
2、下列模型中,适宜作为设计人员与用户间交流工具的是()
A、概念模型
B、逻辑模型
C、物理模型
D、关系模型
ER图的三要素是()
A、实体、属性、实体集
B、实体、键、联系
C、实体、属性、联系
D、实体、域、候选键设有两个实体集 A和 B,A中实体可能与 B中零个或多个实体相联系,而 B中实体至多和
A中一个实体有联系,则称 A和 B具有()
联系
A、一对一
B、一对多
C、多对多
D、多对一先从中层数据流图出发设计系统的局部 ER图,
再对各局部 ER图进行集成和优化,这种方法属于概念结构设计中的()方法
A、自顶向下
B、自底向上
C、自内向外
D、混合策略下列对 ER图设计的说法错误的是()
A、设计局部 ER图中,能作为属性处理的客观事物应尽量作为属性处理
B、局部 ER图中的属性均应为原子属性,即不能再细分为子属性的组合
C、对局部 ER图集成时既可以一次实现全部集成,
也可以两两集成,逐步进行
D、集成后所得的 ER图中可能存在冗余数据和冗余联系,应予以全部清除。
下列属于逻辑结构设计阶段任务的是()
A、生成数据字典
B、集成局部 ER图
C、将 ER图转换为一组关系模式
D、确定数据存取方法
若在两个局部 ER图中,实体,商品,的编号一个被定义为数值型,另一个被定义为字符型,则称之为()
A、属性冲突
B、命名冲突
C、联系冲突
D、结构冲突
在数据库的概念设计和逻辑设计之间起桥梁作用的是()
A、数据结构图
B、功能模块图
C、实体联系图
D、数据流图
将一个一对多联系型转换为一个独立关系模式时,应取()为关键字。
A、一端实体型的关键属性
B、多端实体型的关键属性
C、两个实体型的关键属性的组合
D、联系型的全体属性
将一个 M对 N( M>N)的联系型转换为关系模式时,应()
A、转换为一个独立的关系模式
B、与 M端的实体型所对应的关系模式合并
C、与 N端的实体型所对应的关系模式合并
D、以上都可以
在从 ER图到关系模式的转化过程中,下列说法错误的是()
A、一个一对一的联系可以转换为一个独立的关系模式
B、一个涉及到 3个以上实体的多元联系也可以转换为一个独立的关系模式
C、对关系模型优化时有些模式可能要进一步分解,
有些模式可能要合并
D、关系模式的规范化程度越高,查询的效率就越高。
设在一个 ER模型中有 6个不同的实体集和 9个不同的二元联系,其中包括 3个一对一联系,3
个一对多联系和 3个多对多联系,则将此 ER模型转换成关系模型时,至少得到()个关系模式。
A,6
B,9
C,12
D,15
对数据库的物理设计优劣评价的重点是
()
A、时空效率
B、动态和静态性能
C、用户界面的友好性
D、成本和效益数据库的物理结构设计的目的是()
A、找到一个有效、可实现的数据库存储结构
B、导出特定的 DBMS可以处理的数据库模式和外模式
C、产生反映企业组织信息需求的数据库概念结构
D、收集支持系统目标的基础数据及其处理方法
不属于数据库物理结构设计阶段任务的
()
A、确定选用的 DBMS
B、确定数据的存放位置
C、确定数据的存取方法
D、初步确定系统的配置画出 ER图
设有一商业企业的局部应用,包含 3个实体:
,顾客,,,商品,和,厂家,,且有如下事实:顾客可以根据自己的意愿选择要购买的商品;每种商品可以有多个厂家供应。若顾客的属性包括顾客姓名、电话号码,商品的属性包括代码、品名、单价,厂家的属性包括代码、名称、地址。试画出 ER图。
设某百货公司下设若干连锁店,每家连锁店有若干职工,每个职工只能服务于一家连锁店,每家连锁店经营若干商品,
各连锁店经营的商品不完全相同。试自行设计属性,画出该百货公司管理数据库的 ER图,并将 ER图转换为关系模型。
设有电影放映管理系统的一个局部 ER图,
试将其转化为关系模型,并根据语义确定各关系模式的关键字。
电影 影院摄制单位 票房总额 所在城市影院代码结束日期起始日期发行代号电影名称放映n m
作业设某商业集团数据库中有 3个实体集。一是,公司,实体集,属性有公司编号、公司名、地址等;二是,仓库,
实体集,属性有仓库编号、仓库名、地址等;三是
,职工,实体集,属性有职工编号、姓名、性别等。
公司与仓库间存在,隶属,联系,每个公司管辖若干仓库,每个仓库只能属于一个公司管辖;仓库与职工之间存在,聘用,联系,每个仓库可聘用多个职工,每个职工只能在一个仓库工作,仓库聘用职工有聘期和工资。
( 1)试画出 ER图,并在图上注明属性、联系的类型
( 2)将 ER图转换成关系模式集,并指出每个关系模式的主键和外键。
数据库系统概论
An Introduction to Database System
第七章 数据库恢复技术第三篇 系统篇
数据库系统中的数据是由 DBMS统一管理和控制的,为了适应数据共享的环境,DBMS必须提供数据保护能力,以保证数据库中数据的安全可靠和正确有效 。
数据保护
安全性
完整性
并发控制
数据库恢复第三篇 系统篇第七章 数据库恢复技术第八章 并发控制第九章 数据库安全性第十章 数据库完整性第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.1 事务的基本概念一、什么是事务二、如何定义事务三、事务的特性一、什么是事务
事务 (Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位
事务和程序是两个概念
在关系数据库中,一个事务可以是一条 SQL语句,
一组 SQL语句或整个程序
一个应用程序通常包含多个事务
事务是恢复和并发控制的基本单位二、如何定义事务
显式定义方式
BEGIN TRANSACTION BEGIN TRANSACTION
SQL 语句 1 SQL 语句 1
SQL 语句 2 SQL 语句 2
。。。。。 。。。。。
COMMIT ROLLBACK
隐式方式当用户没有显式地定义事务时,
DBMS按缺省规定自动划分事务事务结束
COMMIT
事务正常结束提交 事务的所有操作( 读 +更新 )
事务中所有对数据库的更新 永久 生效
ROLLBACK
事务异常终止
事务运行的过程中发生了故障,不能继续执行回滚事务的所有 更新 操作
事务滚回到 开始 时的状态三、事务的特性 (ACID特性 )
事务的 ACID特性:
原子性( Atomicity)
一致性( Consistency)
隔离性( Isolation)
持续性( Durability )
1,原子性
事务是数据库的逻辑工作单位
事务中包括的诸操作要么都做,要么都不做
2,一致性事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态一致性状态,
数据库中只包含成功事务提交的结果不一致状态,
数据库中包含失败事务的结果一 致性与原子性银行转帐:从帐号 A中取出一万元,存入帐号 B。
定义一个事务,该事务包括两个操作
这两个操作要么全做,要么全不做
全做或者全不做,数据库都处于一致性状态。
如果只做一个操作,数据库就处于不一致性状态 。
B=B+1
A=A-1
BA
3,隔离性对并发执行而言一个事务的执行不能被其他事务干扰
一个事务内部的操作及使用的数据对其他并发事务是隔离的
并发执行的各个事务之间不能互相干扰
T1的修改被 T2覆盖了!
读 A=16
A← A-3
写回 A=13
① 读 A=16
②
③ A← A-1
写回 A=15
④
T2T1
4,持续性
持续性也称永久性( Permanence)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
接下来的其他操作或故障不应该对其执行结果有任何影响。
事务的特性
保证事务 ACID特性是事务处理的任务
破坏事务 ACID特性的因素
多个事务并行运行时,不同事务的操作交叉执行
事务在运行过程中被强行停止第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.2 数据库恢复概述
故障是不可避免的
计算机硬件故障
系统软件和应用软件的错误
操作员的失误
恶意的破坏
故障的影响
运行事务非正常中断
破坏数据库数据库恢复概述(续)
数据库管理系统对故障的对策
DBMS提供恢复子系统
保证故障发生后,能把数据库中的数据从错误状态恢复到某种逻辑一致的状态
保证事务 ACID
恢复技术是衡量系统优劣的重要指标第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结一、事务故障
什么是事务故障
某个事务在运行过程中由于种种原因未运行至正常终止点就夭折了
事务故障的常见原因
输入数据有误
运算溢出
违反了某些完整性限制
某些应用程序出错
并行事务发生死锁
。。。。
事务故障的恢复
发生事务故障时,夭折的事务可能已把对数据库的部分修改写回磁盘
事务故障的恢复,撤消事务( UNDO)
强行回滚( ROLLBACK)该事务
清除该事务对数据库的所有修改,使得这个事务象根本没有启动过一样二、系统故障
什么是系统故障
整个系统的正常运行突然被破坏
所有正在运行的事务都非正常终止
内存中数据库缓冲区的信息全部丢失
外部存储设备上的数据未受影响系统故障的常见原因
操作系统或 DBMS代码错误
操作员操作失误
特定类型的硬件错误(如 CPU故障)
突然停电系统故障的恢复
清除尚未完成的事务对数据库的所有修改
系统 重新启动时,恢复程序要强行撤消
( UNDO)所有未完成事务
将缓冲区中已完成事务提交的结果写入数据库
系统 重新启动时,恢复程序需要重做
( REDO)所有已提交的事务
7.3 故障的种类
事务故障
系统故障
介质故障三、介质故障
硬件故障使存储在外存中的数据部分丢失或全部丢失
介质故障比前两类故障的可能性小得多,
但破坏性大得多介质故障的常见原因
硬件故障
磁盘损坏
磁头碰撞
操作系统的某种潜在错误
瞬时强磁场干扰介质故障的恢复
装入 数据库发生介质故障前某个时刻的数据 副本
重做自此时始的所有 成功事务,将这些事务已提交的结果重新记入数据库恢复操作的基本原理
恢复操作的基本原理,冗余
利用 存储在系统其它地方的 冗余数据 来 重建数据库中已被破坏或不正确的那部分数据
恢复的实现技术:复杂
一个大型数据库产品,恢复子系统的代码要占全部代码的 10%以上第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.4 恢复的实现技术恢复机制涉及的关键问题
1,如何建立冗余数据
数据转储( backup)
登录日志文件( logging)
2,如何利用这些冗余数据实施数据库恢复
7.4.1 数据转储一、什么是转储二、转储的用途三、转储方法一、什么是转储
转储是指 DBA将整个数据库复制到磁带或另一个磁盘上保存起来的过程。
这些备用的数据文本称为后备副本或后援副本。
转储故障发生点转储 运行事务 ↓
正常运行 ─┼───────┼─────────────
Ta Tb Tf
重装后备副本 重新运行事务恢复 ─┼───────┴ ----------- - →
三、转储方法
1.静态转储与动态转储
2.海量转储与增量转储
3.转储方法小结
1.静态转储
在系统中无运行事务时进行转储
转储开始时数据库处于一致性状态
转储期间不允许对数据库的任何存取、修改活动
优点,实现简单
缺点,降低了数据库的可用性
转储必须等用户事务结束
新的事务必须等转储结束利用静态转储副本进行恢复故障发生点静态 转储 运行事务 ↓
正常运行 ─┼───────┼─────────────
Ta Tb Tf
重装后备副本恢复 ─┼─────── ┥
动态转储
转储操作与用户事务并发进行
转储期间允许对数据库进行存取或修改
优点
不用等待正在运行的用户事务结束
不会影响新事务的运行
动态转储的缺点
不能保证副本中的数据正确有效动态转储
利用动态转储得到的副本进行故障恢复
需要把动态转储期间各事务对数据库的修改活动登记下来,建立日志文件
后备副本加上日志文件才能把数据库恢复到某一时刻的正确状态利用动态转储副本进行恢复运行事务 故障发生点动态 转储 运行事务 ↓
正常运行 ─┼───────┼─────────────
Ta Tb Tf
重装后备副本 利用日志文件恢复恢复 ━━━━━━╋ ━ ━ ━ ┥
利用动态转储副本进行恢复
Ta Tb Tf
动态 转储 运行事务 故障发生点正常运行 ─┼───────┼─────────────
登记日志文件 登记新日志文件
─────────┼─────────────
转储日志文件重装后备副本,然后利用转储的日志文件恢复恢复到一 ━━━━━━┥
致性状态
2.海量转储与增量转储
海量转储,每次转储全部数据库
增量转储,只转储上次转储后更新过的数据
海量转储与增量转储比较
从恢复角度看,使用海量转储得到的后备副本进行恢复往往更方便
但如果数据库很大,事务处理又十分频繁,
则增量转储方式更实用更有效
3.转储方法小结
转储方法分类转储状态动态转储 静态转储转储方式海量转储 动态海量转储 静态海量转储增量转储 动态增量转储 静态增量转储转储策略
应定期进行数据转储,制作后备副本。
但转储又是十分耗费时间和资源的,不能频繁进行。
DBA应该根据数据库使用情况确定适当的转储周期和转储方法。
例:
每天晚上进行动态增量转储
每周进行一次动态海量转储
每月进行一次静态海量转储
7.4 恢复的实现技术
7.4.1 数据转储
7.4.2 登记日志文件
7.4.2 登记日志文件一、日志文件的内容二、日志文件的用途三、登记日志文件的原则一、日志文件的内容
1,什么是日志文件日志文件 (log)是用来记录事务对数据库的更新操作的文件
2,日志文件的格式以记录为单位的日志文件以数据块为单位的日志文件日志文件的内容(续)
3,日志文件内容
各个事务的开始标记 (BEGIN TRANSACTION)
各个事务的结束标记 (COMMIT或 ROLLBACK)
各个事务的所有更新操作
与 事务有关的内部更新操作日志文件中的一个日志记录 (log record)
4,基于记录的日志文件每条日志记录的内容
事务标识
操作类型(插入、删除或修改)
操作对象(记录 ID,Block NO.)
更新前数据的旧值(对插入操作而言,此项为空值)
更新后数据的新值(对删除操作而言,此项为空值)
5,基于数据块的日志文件每条日志记录的内容
事务标识(标明是那个事务)
操作对象(记录 ID,Block NO.)
更新前数据所在的整个数据块的值(对插入操作而言,此项为空值)
更新后整个数据块的值(对删除操作而言,
此项为空值)
二、日志文件的用途
1.用途
进行事务故障恢复
进行系统故障恢复
协助后备副本进行介质故障恢复日志文件的用途(续)
2.与静态转储后备副本配合进行介质故障恢复
静态转储的数据已是一致性的数据
如果静态转储完成后,仍能定期转储日志文件,
则在出现介质故障重装数据副本后,可以利用这些日志文件副本对已完成的事务进行重做处理
这样不必重新运行那些已完成的事务程序就可把数据库恢复到故障前某一时刻的正确状态日志文件的用途(续)
故障发生点静态转储 运行事务 ↓
正常运行 ─┼──────┼──────────┼──
Ta Tb Tf
登记日志文件
└─────────── ┴ ──
重装后备副本 利用日志文件恢复事务 继续运行介质故障恢复 ─────────┴ ----- ─ ------- ┴──────
登记日志文件
└──────
日志文件的用途(续)
3,介质故障恢复,LOG FILE + 动态转储后备副本
动态转储数据库:同时转储同一时点的日志文件
后备副本与该日志文件结合起来才能将数据库恢复到一致性状态。
利用这些日志文件副本进一步恢复事务,避免重新运行事务程序。
三、登记日志文件的原则
为保证数据库是可恢复的,登记日志文件时必须遵循两条原则
登记的次序严格按并行事务执行的时间次序
必须先写日志文件,后写数据库
写日志文件操作:把表示这个修改的日志记录写到日志文件
写数据库操作:把对数据的修改写到数据库中登记日志文件的原则(续)
为什么要先写日志文件
写数据库和写日志文件是两个不同的操作
在这两个操作之间可能发生故障
如果先写了数据库修改,而在日志文件中没有登记下这个修改,则以后就无法恢复这个修改了
如果先写日志,但没有修改数据库,按日志文件恢复时只不过是多执行一次不必要的 UNDO操作,并不会影响数据库的正确性第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.5 恢复策略
7.5.1 事务故障的恢复
7.5.2 系统故障的恢复
7.5.3 介质故障的恢复
7.5.1 事务故障的恢复
事务故障:事务在运行至正常终止点前被中止
恢复方法
由恢复子系统应利用日志文件撤消( UNDO)
此事务已对数据库进行的修改
事务故障的恢复由系统自动完成,不需要用户干预事务故障的恢复步骤
1,反向扫描文件日志(即从最后向前扫描日志文件),
查找该事务的更新操作。
2,对该事务的更新操作执行逆操作。即将日志记录中
,更新前的值,( Befor Image,BI)写入数据库。
插入操作,,更新前的值,为空,则相当于做删除操作
删除操作,,更新后的值,为空,则相当于做插入操作
若是修改操作,则用 BI 代替 AI( After Image)
事务故障的恢复步骤
3,继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。
4,如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。
7.5.2 系统故障的恢复
系统故障造成数据库不一致状态的原因
一些未完成事务对数据库的更新已写入数据库
一些已提交事务对数据库的更新还留在缓冲区没来得及写入数据库
恢复方法
1,Undo 故障发生时未完成的事务
2,Redo 已完成的事务
系统故障的恢复由系统在 重新启动时 自动完成,
不需要用户干预系统故障的恢复 步骤
1.正向扫描日志文件(即从头扫描日志文件)
Redo队列,在故障发生前已经提交的事务
T1,T3,T8…,.
Undo队列,故障发生时尚未完成的事务
T2,T4,T5,T6,T7,T9 …,..
系统故障的恢复步骤
2,对 Undo队列事务进行 UNDO处理反向扫描日志文件,对每个 UNDO事务的更新操作执行逆操作
T2,T4,T5,T6,T7,T9 ……
3,对 Redo队列事务进行 REDO处理正向扫描日志文件,对每个 REDO事务重新执行登记的操作
T1,T3,T8…,.
7.5.3 介质故障的恢复
1,重装数据库,
使数据库恢复到一致性状态
2,重做已完成的事务
7.5.3 介质故障的恢复
恢复步骤
1,装入最新的后备数据库副本,使数据库恢复到最近一次转储时的一致性状态。
对于静态转储的数据库副本,装入后数据库即处于一致性状态
对于动态转储的数据库副本,还须同时装入转储时刻的日志文件副本,利用与恢复系统故障相同的方法(即 REDO+UNDO),才能将数据库恢复到一致性状态。
利用静态转储副本将数据库恢复到一致性状态故障发生点静态 转储 运行事务 ↓
正常运行 ─┼───────┼─────────────
Ta Tb Tf
登记日志文件
└─────────────
重装后备副本恢复 ━━━━━━┥
利用动态转储副本将数据库恢复到一致性状态
Ta Tb Tf
动态 转储 运行事务 故障发生点正常运行 ─┼───────┼─────────────
登记日志文件 登记新日志文件
─────────┼─────────────
转储日志文件重装后备副本,然后利用转储的日志文件恢复恢复到一 ━━━━━━┥
致性状态介质故障的恢复(续)
2,装入有关的日志文件副本,重做已完成的事务。
首先扫描日志文件,找出故障发生时已提交的事务的标识,将其记入重做队列。
然后正向扫描日志文件,对重做队列中的所有事务进行重做处理。即将日志记录中,更新后的值,写入数据库。
介质故障的恢复(续)
介质故障的恢复需要 DBA介入
DBA的工作
重装最近转储的数据库副本和有关的各日志文件副本
执行系统提供的恢复命令
具体的恢复操作仍由 DBMS完成第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.6 具有检查点的恢复技术一、问题的提出二、检查点技术三、利用检查点的恢复策略一、问题的提出
两个问题
搜索整个日志将耗费大量的时间
REDO处理:重新执行,浪费了大量时间解决方案
具有检查点( checkpoint)的恢复技术
在日志文件中增加检查点记录
( checkpoint)
增加重新开始文件
恢复子系统在登录日志文件期间动态地维护日志二、检查点技术
检查点记录的内容
1,建立检查点时刻所有正在执行的事务清单
2,这些事务最近一个日志记录的地址
重新开始文件的内容
记录各个检查点记录在日志文件中的地址在检查点 维护日志文件
1,将当前 日志 缓冲区中的所有日志记录写入磁盘的日志文件上。
2,在日志文件中写入一个检查点记录。
3,将当前 数据 缓冲区的所有数据记录写入磁盘的数据库中。
4,把检查点记录在日志文件中的地址写入一个重新开始文件。
建立检查点
定期
按照预定的一个时间间隔
不定期
按照某种规则,如日志文件已写满一半建立一个检查点三、利用检查点的恢复策略
当事务 T在一个检查点之前提交
T对数据库所做的修改已写入数据库
在进行恢复处理时,没有必要对事务 T执行 REDO操作利用检查点的恢复策略(续)
Tc (检查点 ) Tf(系统故障 )
REDO
UNDO
UNDO
REDO
T2
T3
T4
T5
不要 REDOT1
利用检查点的 恢复步骤
1,从重新开始文件中找到最后一个检查点记录在日志文件中的地址
2 由该地址在日志文件中找到最后一个检查点记录利用检查点的恢复策略(续)
2.由该检查点记录得到检查点建立时刻所有正在执行的事务清单 ACTIVE-LIST
建立两个事务队列
UNDO-LIST
REDO-LIST
把 ACTIVE-LIST暂时放入 UNDO-LIST队列,
REDO队列暂为空。
利用检查点的恢复策略(续)
3.从检查点开始正向扫描日志文件,直到日志文件结束
如有新开始的事务 Ti,把 Ti暂时放入 UNDO-
LIST队列
如有提交的事务 Tj,把 Tj从 UNDO-LIST队列移到 REDO-LIST队列
4.对 UNDO-LIST中的每个事务执行 UNDO操作,对
REDO-LIST中的每个事务执行 REDO操作第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.7 数据库镜像
介质故障是对系统影响最为严重的一种故障,
严重影响数据库的可用性
介质故障恢复比较费时
为预防介质故障,DBA必须周期性地转储数据库
提高数据库可用性的解决方案
数据库镜像( Mirror)
数据库镜像(续)
数据库镜像
DBMS自动把整个数据库或其中的关键数据复制到另一个磁盘上
DBMS自动保证镜像数据与主数据的一致性
(图 7.5a)
数据库镜像的用途
出现介质故障时
DBMS自动利用镜像磁盘数据进行数据库的恢复,不需要关闭系统和重装数据库副本
(图 7.5b)
没有出现故障时
可用于并发操作 (图 7.5a)
一个用户对数据加排他锁修改数据
其他用户可以读镜像数据库上的数据数据库镜像(续)
第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.8 Oracle的恢复技术
1,转储
2,登记日志文件
7.8 Oracle的恢复技术:转储
转储后备副本的方法
文件拷贝
EXPORT实用程序
用 SQL命令 SPOOL
自己编程实现重装后备副本的方法
文件拷贝
IMPORT实用程序
SQL*LOADER实用程序
自己编程实现
2,登记日志文件
ORACLE V.5:以数据块为单位
ORACLE V.7,REDO日志 + 回滚段
ORACLE V.5的恢复技术
日志文件以数据块为单位,恢复操作不是基于操作,而是基于数据块
将更新前的旧值与更新后的新值分别放在两个不同的日志文件中
记录数据库更新前旧值的日志文件称为数据库前像文件( Before Image,简称
BI文件)
记录数据库更新后新值的日志文件称为数据库的后像文件( After Image,简称
AI文件)
OracleV.5 的恢复技术(续)
BI文件是必须的,AI文件是任选的
没有 AI文件:只能执行 UNDO处理,不能执行 REDO处理
Oracle v.7的恢复技术(续)
REDO日志文件:更新数据的前像和后像
回滚段 (Rollback Segment):记录尚未完成的更新事务的更新数据的前像
事务故障恢复
根据回滚段中的数据,撤消该事务的操作
Oracle V.7 的恢复技术(续)
系统故障恢复
首先扫描 REDO日志文件,重做所有操作,
并对更新操作建立回滚段数据。当遇到提交记录,取消相应回滚段中数据。
再根据回滚段中的数据,撤消未正常提交的事务的操作(图 7.6)
优点:只需要扫描日志文件一遍
Oracle的恢复技术(续)
图 7.6 Oracle的恢复过程
(a) 发生故障,事务非正常终止
Ta Tf
T1 T3
T2 T44
时间
Oracle的恢复技术(续)
(b) 利用 REDO文件,重做所有操作时间
T1 T3
T2 T44
Oracle的恢复技术(续)
(c) 利用回滚段撤消未提交的事务数据库恢复到一致性状态时间
T1
T2
Oracle的恢复技术(续)
ORACLE V.7的恢复技术 (续 )
介质故障恢复
重装数据库后备副本文件,恢复到转储时的数据库一致性状态
利用在此之后转储的 REDO日志文件副本将数据库恢复到最近点 (类似于系统故障恢复 )
第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.9 小结
如果数据库只包含成功事务提交的结果,就说数据库处于一致性状态。保证数据一致性是对数据库的最基本的要求。
事务是数据库的逻辑工作单位
DBMS保证系统中一切事务的原子性、一致性、隔离性和持续性小结(续)
DBMS必须对事务故障、系统故障和介质故障进行恢复
恢复中最经常使用的技术:数据库转储和登记日志文件
恢复的基本原理:利用存储在后备副本、日志文件和数据库镜像中的冗余数据来重建数据库小结(续)
常用恢复技术
事务故障的恢复
UNDO
系统故障的恢复
UNDO + REDO
介质故障的恢复
重装备份并恢复到一致性状态 + REDO
小结(续)
提高恢复效率的技术
检查点技术
可以提高系统故障的恢复效率
可以在一定程度上提高利用动态转储备份进行介质故障恢复的效率
镜像技术
镜像 技术可以改善介质故障的恢复效率下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第八章 并发控制第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结并发控制概述多事务执行方式
(1)事务串行执行
每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行
不能充分利用系统资源,发挥数据库共享资源的特点并发控制(续)
(2)交叉并发方式 ( interleaved concurrency)
事务的并行执行是这些并行事务的并行操作轮流交叉运行
是单处理机系统中的并发方式,能够减少处理机的空闲时间,提高系统的效率并发控制(续)
(3)同时并发方式 ( simultaneous concurrency)
多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,
实现多个事务真正的并行运行
最理想的并发方式,但受制于硬件环境
更复杂的 并发方式机制事务并发执行带来的问题
可能会存取和存储不正确的数据,破坏事务的隔离性和数据库的一致性
DBMS必须提供并发控制机制
并发控制机制是衡量一个 DBMS性能的重要标志之一
8.1 并发控制概述
并发控制机制的任务
对并发操作进行正确调度
保证事务的隔离性
保证数据库的一致性
T1的修改被 T2覆盖了!
读 A=16
A← A-3
写回 A=13
① 读 A=16
②
③ A← A-1
写回 A=15
④
事务 T2事务 T1
数据不一致实例:飞机订票系统并发操作带来的数据不一致性
丢失修改 ( lost update)
不可重复读 ( non-repeatable read)
读,脏,数据 ( dirty read)
1,丢失修改丢失修改是指事务 1与事务 2从数据库中读入同一数据并修改事务 2的提交结果破坏了事务 1提交的结果,
导致事务 1的修改被丢失 。
2,不可重复读不可重复读是指事务 1读取数据后,事务 2
执行更新操作,使事务 1无法再现前一次读取结果 。
三类 不可重复读事务 1读取某一数据后:
1。 事务 2对其做了修改,当事务 1再次读该数据时,得到与前一次不同的值。
2,事务 2删除了其中部分记录,当事务 1再次读取数据时,发现某些记录神密地消失了。
3,事务 2插入了一些记录,当事务 1再次按相同条件读取数据时,发现多了一些记录。
后两种不可重复读有时也称为 幻影 现象( phantom
row)
3,读,脏,数据事务 1修改某一数据,并将其写回磁盘事务 2读取同一数据后事务 1由于某种原因被撤消,这时事务 1已修改过的数据恢复原值事务 2读到的数据就与数据库中的数据不一致,
是不正确的数据,又称为,脏,数据 。
图 8.1 三种数据不一致性
T1 T2
① 读 A=16
②
③ A← A-1
写回
A=15
④
读 A=16
A← A-1
写回 A=15
(a) 丢失修改图 8.1 三种数据不一致性 (续 )
读 B=100
B← B*2
写回 B=200
① 读 A=50
读 B=100
求和 =150
②
③ 读 A=50
读 B=200
求和 =250
(验算不对 )
T2T1
(b) 不可重复读图 8.1 三种数据不一致性 (续 )
读 C=200
① 读 C=100
C← C*2
写回 C
②
③ ROLLBACK
C恢复为 100
T2T1
(c) 读“脏”数据第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.2 封锁一、什么是封锁二、基本封锁类型三、基本锁的相容矩阵一、什么是封锁
封锁就是事务 T在对某个数据对象(例如表、
记录等)操作之前,先向系统发出请求,对其加锁
加锁后事务 T就对该数据对象有了一定的控制,
在事务 T释放它的锁之前,其它的事务不能更新此数据对象。
封锁是实现并发控制的一个非常重要的技术
8.2 封锁一、什么是封锁二、基本封锁类型三、基本锁的相容矩阵二、基本封锁类型
DBMS通常提供了多种类型的封锁。一个事务对某个数据对象加锁后究竟拥有什么样的控制是由封锁的类型决定的。
基本封锁类型
排它锁( eXclusive lock,简记为 X锁)
共享锁( Share lock,简记为 S锁)
排它锁
排它锁又称为写锁
若事务 T对数据对象 A加上 X锁,则只允许
T读取和修改 A,其它任何事务都不能再对 A加任何类型的锁,直到 T释放 A上的锁共享锁
共享锁又称为读锁
若事务 T对数据对象 A加上 S锁,则其它事务只能再对 A加 S锁,而不能加 X锁,直到
T释放 A上的 S锁
8.2 封锁一、什么是封锁二、基本封锁类型三、基本锁的相容矩阵三、锁的相容矩阵
Y=Yes,相容的请求
N=No,不相容的请求
T1
T2
X S -
X N N Y
S N Y Y
- Y Y Y
第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.3 封锁协议
在运用 X锁和 S锁对数据对象加锁时,需要约定一些规则:封锁协议( Locking Protocol)
何时申请 X锁或 S锁
持锁时间、何时释放
不同的封锁协议,在 不同的程度上 为并发操作的正确调度提供一定的保证
常用的封锁协议:三级封锁协议
1级封锁协议
事务 T在修改数据 R之前必须先对其加 X锁,
直到事务结束才释放
正常结束 ( COMMIT)
非正常结束 ( ROLLBACK)
1级封锁协议可防止丢失修改
在 1级封锁协议中,如果是读数据,不需要加锁的,所以它不能保证可重复读和不读,脏,
数据。
1级封锁协议
T1 T2
① Xlock A
获得
② 读 A=16
③ A← A-1
写回 A=15
Commit
Unlock A
④
⑤
Xlock A
等待等待等待等待获得 Xlock A
读 A=15
A← A-1
写回 A=14
Commit
Unlock A
没有丢失修改
1级封锁协议读 A=15
① Xlock A
获得
② 读 A=16
A← A-1
写回 A=15
③
④ Rollback
Unlock A
T2T1
读“脏”数据
1级封锁协议
Xlock B
获得读 B=100
B← B*2
写回 B=200
Commit
Unlock B
① 读 A=50
读 B=100
求和 =150
②
③ 读 A=50
读 B=200
求和 =250
(验算不对 )
T2T1
不可重复读
2级封锁协议
1级封锁协议 +事务 T在读取数据 R前必须 先加 S锁,读完后即可释放 S锁
2级封锁协议可以防止丢失修改和读,脏,
数据。
在 2级封锁协议中,由于读完数据后即可释放 S锁,所以它不能保证可重复读 。
2级封锁协议不可重复读
① Sclock A
获得读 A=50
Unlock A
② Sclock B
获得读 B=100
Unlock B
③ 求和 =150
Xlock B
等待等待获得 Xlock B
读 B=100
B← B*2
写回 B=200
Commit
Unlock B
T2T1
④ Sclock A
获得读 A=50
Unlock A
Sclock B
获得读 B=200
Unlock B
求和 =250
(验算不对 )
T2T1 (续 )
3级封锁协议
1级封锁协议 + 事务 T在读取数据 R之前必须先对其加 S锁,直到 事务结束才释放
3级封锁协议可防止丢失修改、读脏数据和不可重复读。
3级封锁协议T
1 T2
① Slock A
读 A=50
Slock B
读 B=100
求和 =150
②
③ 读 A=50
读 B=100
求和 =150
Commit
Unlock A
Unlock B
④
⑤
Xlock B
等待等待等待等待等待等待等待等待获得 Xlock B
读 B=100
B← B*2
写回 B=200
Commit
Unlock B
可重复读
3级封锁协议
T1 T2
① Xlock C
读 C= 100
C← C*2
写回 C=200
②
③ ROLLBACK
(C恢复为 100)
Unlock C
④
⑤
Slock C
等待等待等待等待获得 Slock C
读 C=100
Commit C
Unlock C
不读“脏”数据
4.封锁协议小结
三级协议的主要区别
什么操作需要申请封锁
何时释放锁(即持锁时间)
封锁协议小结 (续 )
第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.4 活锁和死锁
封锁技术可以有效地解决并行操作的一致性问题,但也带来一些新的问题
死锁
活锁
8.4.1 活锁如何避免活锁采用先来先服务的策略:
当多个事务请求封锁同一数据对象时
按请求封锁的先后次序对这些事务排队
该数据对象上的锁一旦释放,首先批准申请队列中第一个事务获得锁 。
8.4.2 死锁
T1 T2
Xlock R1
.
.
.
Xlock R2
等待等待等待
.
.
.
Xlock R2
.
.
Xlock R1
等待等待
.
解决死锁的方法两类方法
1,预防死锁
2,死锁的诊断与解除
1,死锁的预防
产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据对象加锁,从而出现死等待。
预防死锁的发生就是要破坏产生死锁的条件死锁的预防 (续)
预防死锁的方法
一次封锁法
顺序封锁法
( 1)一次封锁法
要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行
一次封锁法存在的问题:降低并发度
扩大封锁范围
将以后要用到的全部数据加锁,势必扩大了封锁的范围,从而降低了系统的并发度一次封锁法(续)
难于事先精确确定封锁对象
数据库中数据是不断变化的,原来不要求封锁的数据,在执行过程中可能会变成封锁对象,所以很难事先精确地确定每个事务所要封锁的数据对象
解决方法:将事务在执行过程中可能要封锁的数据对象全部加锁,这就进一步降低了并发度 。
( 2)顺序封锁法
顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
顺序封锁法存在的问题
维护成本高
数据库系统中可封锁的数据对象极其众多,
并且随数据的插入、删除等操作而不断地变化,要维护这样极多而且变化的资源的封锁顺序非常困难,成本很高顺序封锁法(续)
难于实现
事务的封锁请求可以随着事务的执行而动态地决定,很难事先确定每一个事务要封锁哪些对象,因此也就很难按规定的顺序去施加封锁。
例:规定数据对象的封锁顺序为 A,B,C,D,E。事务 T3起初要求封锁数据对象 B,C,E,但当它封锁了 B,C后,才发现还需要封锁 A,这样就破坏了封锁顺序,
死锁的预防(续)
结论
在操作系统中广为采用的预防死锁的策略并不很适合数据库的特点
DBMS在解决死锁的问题上更普遍采用的是诊断并解除死锁的方法
2,死锁的诊断与解除
允许死锁发生
解除死锁
由 DBMS的并发控制子系统定期检测系统中是否存在死锁
一旦检测到死锁,就要设法解除检测死锁,超时法
如果一个事务的等待时间超过了规定的时限,就认为发生了死锁
优点:实现简单
缺点
有可能误判死锁
时限若设置得太长,死锁发生后不能及时发现等待图法
用事务等待图动态反映所有事务的等待情况
事务等待图是一个有向图 G=(T,U)
T为结点的集合,每个结点表示正运行的事务
U为边的集合,每条边表示事务等待的情况
若 T1等待 T2,则 T1,T2之间划一条有向边,从 T1指向 T2
并发控制子系统周期性地(比如每隔 1 min)检测事务等待图,如果发现图中存在回路,则表示系统中出现了死锁。
死锁的诊断与解除(续)
解除死锁
选择一个处理死锁代价最小的事务,
将其撤消,释放此事务持有的所有的锁,使其它事务能继续运行下去。
第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.5 并发调度的可串行性一、什么样的并发操作调度是正确的二、如何保证并发操作的调度是正确的
8.5 并发调度的可串行性一、什么样的并发操作调度是正确的二、如何保证并发操作的调度是正确的一、什么样的并发操作调度是正确的
计算机系统对并行事务中并行操作的调度是的随机的,而不同的调度可能会产生不同的结果。
将所有事务串行起来的调度策略一定是正确的调度策略。
如果一个事务运行过程中没有其他事务在同时运行,也就是说它没有受到其他事务的干扰,那么就可以认为该事务的运行结果是正常的或者预想的什么样的并发操作调度是正确的(续)
以不同的顺序串行执行事务也有可能会产生不同的结果,但由于不会将数据库置于不一致状态,所以都可以认为是正确的。
几个事务的并行执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同。
这种并行调度策略称为可串行化( Serializable)
的调度。
什么样的并发操作调度是正确的(续)
可串行性是并行事务正确性的唯一准则例:现在有两个事务,分别包含下列操作:
事务 1:读 B; A=B+1;写回 A;
事务 2:读 A; B=A+1;写回 B;
假设 A的初值为 2,B的初值为 2。
什么样的并发操作调度是正确的(续)
对这两个事务的不同调度策略
串行执行
串行调度策略 1
串行调度策略 2
交错执行
不可串行化的调度
可串行化的调度
(a) 串行调度策略,正确的调度
Slock B
Y=B=2
Unlock B
Xlock A
A=Y+1
写回 A(=3)
Unlock A
Slock A
X=A=3
Unlock A
Xlock B
B=X+1
写回 B(=4)
Unlock B
T1 T2
(b) 串行调度策略,正确的调度
Slock B
Y=B=3
Unlock B
Xlock A
A=Y+1
写回 A(=4)
Unlock A
SlockA
X=A=2
Unlock A
Xlock B
B=X+1
写回 B(=3)
Unlock B
T1 T2
(c) 不可串行化的调度
Slock B
Y=B=2
Unlock B
Xlock A
A=Y+1
写回 A(=3)
Unlock A
Slock A
X=A=2
Unlock A
Xlock B
B=X+1
写回 B(=3)
Unlock B
T1 T2
(c) 不可串行化的调度 (续 )
由于其执行结果与 (a),(b)的结果都不同,
所以是错误的调度。
(d) 可串行化的调度
Slock B
Y=B=2
Unlock B
Xlock A
A=Y+1
写回 A(=3)
Unlock A
Slock A
等待等待等待
X=A=3
Unlock A
Xlock B
B=X+1
写回 B(=4)
Unlock B
T1 T2
(d) 可串行化的调度(续)
由于其执行结果与串行调度( a)的执行结果相同,所以是正确的调度。
8.5 并发调度的可串行性一、什么样的并发操作调度是正确的二、如何保证并发操作的调度是正确的二、如何保证并发操作的调度是正确的
为了保证并行操作的正确性,DBMS的并行控制机制必须提供一定的手段来保证调度是可串行化的。
从理论上讲,在某一事务执行时禁止其他事务执行的调度策略一定是可串行化的调度,这也是最简单的调度策略,但这种方法实际上是不可行的,因为它使用户不能充分共享数据库资源。
如何保证并发操作的调度是正确的(续)
保证并发操作调度正确性的方法
封锁方法,两段锁 ( Two-Phase Locking,
简称 2PL) 协议
时标方法
乐观方法第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.6 两段锁协议
两段锁协议的内容
1,在对任何数据进行读、写操作之前,
事务首先要获得对该数据的封锁
2,在释放一个封锁之后,事务不再获得任何其他封锁。
两段锁协议(续)
―两段,锁的含义
事务分为两个阶段
第一阶段是获得封锁,也称为扩展阶段;
第二阶段是释放封锁,也称为收缩阶段。
两段锁协议(续)
例:
事务 1的封锁序列:
Slock A,.,Slock B,.,Xlock C,.,Unlock B,.,Unlock A,.,
Unlock C;
事务 2的封锁序列:
Slock A,.,Unlock A,.,Slock B,.,Xlock C,.,Unlock C,.,
Unlock B;
事务 1遵守两段锁协议,而事务 2不遵守两段协议。
两段锁协议(续)
并行执行的所有事务均遵守两段锁协议,则对这些事务的所有并行调度策略都是可串行化的。
所有遵守两段锁协议的事务,其并行执行的结果一定是正确的
事务遵守两段锁协议是可串行化调度的 充分条件,
而不是必要条件
可串行化的调度中,不一定所有事务都必须符合两段锁协议。
两段锁协议(续)
T1
Slock B
读 B=2
Y=B
Xlock A
A=Y+1
写回 A=3
Unlock B
Unlock A
T2
Slock A
等待等待等待等待等待
Slock A
读 A=3
Y=A
Xlock B
B=Y+1
写回 B=4
Unlock B
Unlock A
T1
Slock B
读 B=2
Y=B
Unlock B
Xlock A
A=Y+1
写回 A=3
Unlock A
T2
Slock A
等待等待等待等待
Slock A
读 A=3
X=A
Unlock A
Xlock B
B=X+1
写回 B=4
Unlock B
(a) 遵守两段锁协议 (b) 不遵守两段锁协议
T1
Slock B
读 B=2
Y=B
Unlock B
Xlock A
A=Y+1
写回 A=3
Unlock A
T2
Slock A
读 A=2
X=A
Unlock A
Xlock B
等待
Xlock B
B=X+1
写回 B=3
Unlock B
(c) 不遵守两段锁协议两段锁协议(续)
两段锁协议与防止死锁的一次封锁法
一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,
因此一次封锁法遵守两段锁协议
但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁两段锁协议(续)
图 8.7 遵守两段锁协议的事务发生死锁
T1
Slock B
读 B=2
Xlock A
等待等待
T2
Slock A
读 A=2
Xlock A
等待两段锁协议(续)
两段锁协议与三级封锁协议
两类不同目的的协议
两段锁协议
保证并发调度的正确性
三级封锁协议
在不同程度上保证数据一致性
遵守第三级封锁协议必然遵守两段协议第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.7 封锁的粒度
8.7.1 封锁粒度
8.7.2 多粒度封锁
8.7.3 意向锁
8.7.1 封锁粒度一、什么是封锁粒度二、选择封锁粒度的原则一、什么是封锁粒度
X锁和 S锁都是加在某一个数据对象上的
封锁的对象,逻辑单元,物理单元例:在关系数据库中,封锁对象:
逻辑单元,属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库等
物理单元:页(数据页或索引页)、物理记录等什么是封锁粒度(续)
封锁对象可以很大也可以很小例,对整个数据库加锁对某个属性值加锁
封锁对象的大小称为封锁的粒度 (Granularity)
多粒度封锁 (multiple granularity locking)
在一个系统中同时支持多种封锁粒度供不同的事务选择
8.7.1 封锁粒度一、什么是封锁粒度二、选择封锁粒度的原则二、选择封锁粒度的原则
封锁的粒度越 大,小,
系统被封锁的对象 少,多,
并发度 小,高,
系统开销 小,大,
选择封锁粒度:
考虑封锁机构和并发度两个因素对系统开销与并发度进行权衡选择封锁粒度的原则(续)
需要处理多个关系的大量元组的用户事务:以数据库为封锁单位;
需要处理大量元组的用户事务:以关系为封锁单元;
只处理少量元组的用户事务:以元组为封锁单位
8.7 封锁的粒度
8.7.1 封锁粒度
8.7.2 多粒度封锁
8.7.3 意向锁
8.7.2 多粒度封锁
多粒度树
以树形结构来表示多级封锁粒度
根结点是整个数据库,表示最大的数据粒度
叶结点表示最小的数据粒度多粒度封锁(续)
例:三级粒度树。根结点为数据库,数据库的子结点为关系,关系的子结点为元组。
数据库关系 Rn关系 R1
元组 元组元组 元组
……
…………
多粒度 封锁协议
允许多粒度树中的每个结点被独立地加锁
对一个结点加锁意味着这个结点的所有后裔结点也被加以同样类型的锁
在多粒度封锁中一个数据对象可能以两种方式封锁,显式封锁和隐式封锁显式封锁和隐式封锁
显式封锁,直接加到数据对象上的封锁
隐式封锁,由于其上级结点加锁而使该数据对象加上了锁
显式封锁和隐式封锁的效果是一样的对某个数据对象加锁时系统检查的内容
该数据对象
有无显式封锁与之冲突
所有上级结点
检查本事务的显式封锁是否与该数据对象上的隐式封锁冲突,(由上级结点封锁造成的)
所有下级结点
看上面的显式封锁是否与本事务的隐式封锁 (将加到下级结点的封锁) 冲突。
8.7 封锁的粒度
8.7.1 封锁粒度
8.7.2 多粒度封锁
8.7.3 意向锁
8.7.3 意向锁
引进意向锁( intention lock)目的
提高对某个数据对象加锁时系统的检查效率什么是意向锁
对任一结点加基本锁,必须 先 对它的上层结点 加意向锁
如果对一个结点加意向锁,则说明该结点的 下层结点 正在被加锁意向锁 (续 )
例:对任一元组 r 加锁,先关系 R加意向锁
事务 T要对关系 R加 X锁,系统只要检查根结点数据库和关系 R是否已加了不相容的锁,
不需要搜索和检查 R中的每一个元组是否加了 X
锁常用意向锁
意向共享锁 (Intent Share Lock,简称 IS锁 )
意向排它锁 (Intent Exclusive Lock,简称 IX
锁 )
共享意向排它锁 (Share Intent Exclusive
Lock,简称 SIX锁 )
意向锁(续)
IS锁
如果对一个数据对象加 IS锁,表示它的后裔结点拟 ( 意向 ) 加 S锁 。
例:要对某个元组加 S锁,则要首先对关系和数据库加 IS锁意向锁(续)
IX锁
如果对一个数据对象加 IX锁,表示它的后裔结点拟(意向)加 X锁。
例:要对某个元组加 X锁,则要首先对关系和数据库加 IX锁。
意向锁(续)
SIX锁
如果对一个数据对象加 SIX锁,表示对它加 S
锁,再加 IX锁,即 SIX = S + IX。
例:对某个表加 SIX锁,则表示该事务要读整个表(所以要对该表加 S锁),同时会更新个别元组(所以要对该表加 IX锁)。
意向锁(续)
意向锁的相容矩阵
T1 T2 S X IS IX SIX -
S Y N Y N N Y
X N N N N N Y
IS Y N Y Y Y Y
IX N N Y Y N Y
SIX N N Y N N Y
- Y Y Y Y Y Y
意向锁(续)
锁的强度
锁的强度是指它对其他锁的排斥程度
一个事务在申请封锁时以强锁代替弱锁是安全的,反之则不然
SIX
X
S IX
-
IS
意向锁(续)
具有意向锁的多粒度封锁方法
申请封锁时应该按自上而下的次序进行;
释放封锁时则应该按自下而上的次序进行例:事务 T要对一个数据对象加锁,必须先对它的上层结点加意向锁第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.8 Oracle的并发控制
Oracle采用封锁技术保证并发操作的可串行性
Oracle锁的种类
字典锁
数据锁(亦称 DML锁)
1,字典锁
ORACLE DBMS内部用于对字典表的封锁
由 DBMS在必要的时候自动加锁和释放锁,用户无权控制
字典锁类型
语法分析锁
DDL锁
2,数据锁
数据锁类型
共享锁( S锁)
排它锁( X锁)
行级共享锁( RS锁)
行级排它锁( RX锁)
共享行级排它锁( SRX锁)
其中 RS锁,RX锁,SRX锁实际上就是 IS锁,IX锁、
SIX锁。
数据锁(续)
封锁粒度
行级
表级数据锁(续)
数据锁的相容矩阵
T1 T2 S X RS RX SRX -
S Y N Y N N Y Y=Yes,表示相容的请求
X N N N N N Y
RS Y N Y Y Y Y N=No,表示不相容的请求
RX N N Y Y N Y
SRX N N Y N N Y
- Y Y Y Y Y Y
数据锁(续)
数据封锁的两种方式
数据封锁由系统控制,对用户是透明的
允许用户用 LOCK TABLE语句显式对封锁对象加锁数据锁(续)
ORACLE数据锁的特点
缺省情况下,读数据不加锁
ORACLE通过回滚段( Rollback Segment)
来保证用户不读,脏,数据和可重复读。
优点:提高数据的并发度数据锁(续)
死锁
采用死锁诊断与解除法
周期性诊断系统中有无死锁
存在死锁,则撤消执行更新操作次数最少的事务第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.9 小结
数据共享与数据一致性是一对矛盾
数据库的价值在很大程度上取决于它所能提供的数据共享度。
数据共享在很大程度上取决于系统允许对数据并发操作的程度。
数据并发程度又取决于数据库中的并发控制机制
另一方面,数据的一致性也取决于并发控制的程度。
施加的并发控制愈多,数据的一致性往往愈好。
小结(续)
数据库的并发控制以事务为单位
数据库的并发控制通常使用封锁机制
两类最常用的封锁
不同级别的封锁协议提供不同的数据一致性保证,提供不同的数据共享度。
三级封锁协议小结(续)
并发控制机制调度并发事务操作是否正确的判别准则是可串行性
并发操作的正确性则通常由两段锁协议来保证。
两段锁协议是可串行化调度的充分条件,但不是必要条件小结(续)
对数据对象施加封锁,带来问题
活锁,先来先服务
死锁:
预防方法
一次封锁法
顺序封锁法
死锁的诊断与解除
超时法
等待图法小结(续)
不同的数据库管理系统提供的封锁类型、封锁协议、达到的系统一致性级别不尽相同。但是其依据的基本原理和技术是共同的。
下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第九章 数据库安全性第九章 数据库安全性
问题的提出
数据库的一大特点是数据可以共享
但数据共享必然带来数据库的安全性问题
数据库系统中的数据共享不能是无条件的共享例:军事秘密,国家机密,新产品实验数据,
市场需求分析,市场营销策略,销售计划,
客户档案,医疗档案,银行储蓄数据数据库安全性(续)
数据库中数据的共享是在 DBMS统一的严格的控制之下的共享,即只允许有合法使用权限的用户访问允许他存取的数据
数据库系统的安全保护措施是否有效是数据库系统主要的性能指标之一数据库安全性(续)
什么是数据库的安全性
数据库的安全性是指保护数据库,防止因用户非法使用数据库造成数据泄露,更改或破坏 。
什么是数据的保密
数据保密是指用户合法地访问到机密数据后能否对这些数据保密 。
通过制订法律道德准则和政策法规来保证 。
第九章 数据库安全性
9.1 计算机安全性概论
9.2 数据库安全性控制
9.3 统计数据库安全性
9.4 Oracle数据库的安全性措施
9.5 小结第九章 数据库安全性
9.1 计算机安全性概论
9.2 数据库安全性控制
9.3 统计数据库安全性
9.4 Oracle数据库的安全性措施
9.5 小结
9.1 计算机安全性概论
9.1.1 计算机系统的三类安全性问题
9.1.2 可信计算机系统评测标准
9.1 计算机安全性概论
9.1.1 计算机系统的三类安全性问题
9.1.2 可信计算机系统评测标准
9.1.1 计算机系统的三类安全性问题
什么是计算机系统安全性
为计算机系统建立和采取的各种安全保护措施,以保护计算机系统中的 硬件,软件 及 数据,防止其因偶然或恶意的原因使系统遭到破坏,数据遭到更改或泄露等。
计算机系统的三类安全性问题(续)
计算机安全涉及问题
计算机系统本身的技术问题
计算机安全理论与策略
计算机安全技术
管理问题
安全管理
安全评价
安全产品计算机系统的三类安全性问题(续)
计算机安全涉及问题 (续 )
法学
计算机安全法律
犯罪学
计算机犯罪与侦察
安全监察
心理学计算机系统的三类安全性问题(续)
三类计算机系统安全性问题
技术安全类
管理安全类
政策法律类计算机系统的三类安全性问题(续)
技术安全
指计算机系统中采用具有一定 安全性的 硬件、软件 来实现 对计算机系统及其所存数据的安全保护,当计算机系统受到无意或恶意的攻击时仍能保证系统正常运行,保证系统内的数据不增加、不丢失、不泄露。
计算机系统的三类安全性问题(续)
管理安全
软硬件意外故障、场地的意外事故、
管理不善导致的计算机设备和数据介质的物理破坏、丢失等安全问题计算机系统的三类安全性问题(续)
政策法律类
政府部门建立的有关计算机犯罪、数据安全保密的法律道德准则和政策法规、法令
9.1 计算机安全性概论
9.1.1 计算机系统的三类安全性问题
9.1.2 可信计算机系统评测标准
9.1.2 可信计算机系统评测标准
为降低进而消除对系统的安全攻击,各国引用或制定了一系列安全标准
TCSEC (桔皮书 )
TDI (紫皮书 )
可信计算机系统评测标准(续)
1985年美国国防部( DoD)正式颁布,DoD可信计算机系统评估标准,(简称 TCSEC或 DoD85)
TCSEC又称桔皮书
TCSEC标准的目的
提供一种标准,使 用户 可以对其计算机系统内敏感信息安全操作的 可信程度 做 评估 。
给计算机行业的 制造商 提供 一种可循的 指导规则,
使其产品能够更好地满足敏感应用的安全需求。
可信计算机系统评测标准(续)
1991年 4月美国 NCSC(国家计算机安全中心)
颁布了,可信计算机系统评估标准关于可信数据库系统的解释,( Trusted Database
Interpretation 简称 TDI)
TDI又称紫皮书。它将 TCSEC扩展到数据库管理系统。
TDI中定义了数据库管理系统的设计与实现中需满足和用以进行安全性级别评估的标准。
可信计算机系统评测标准(续)
TDI/TCSEC标准的基本内容
TDI与 TCSEC一样,从 四个方面 来描述安全性级别划分的指标
安全策略
责任
保证
文档可信计算机系统评测标准(续)
R1 安全策略( Security Policy)
R1.1 自主存取控制 ( Discretionary Access
Control,简记为
DAC)
R1.2 客体重用( Object Reuse)
R1.3 标记( Labels)
R1.4 强制存取控制( Mandatory Access
Control,简记为
MAC)
可信计算机系统评测标准(续)
R2 责任( Accountability)
R2.1 标识与鉴别( Identification &
Authentication)
R2.2 审计( Audit)
R3 保证( Assurance)
R3.1 操作保证( Operational Assurance)
R3.2 生命周期保证( Life Cycle Assurance)
可信计算机系统评测标准(续)
R4 文档( Documentation)
R4.1 安全特性用户指南( Security Features
User's Guide)
R4.2 可信设施手册( Trusted Facility
Manual)
R4.3 测试文档( Test Documentation)
R4.4 设计文档( Design Documentation)
可信计算机系统评测标准(续)
TCSEC/TDI安全级别划分安 全 级 别 定 义
A1 验证设计 ( Verified Design)
B3 安全域 ( Security Domains)
B2 结构化保护 ( Structural Protection)
B1 标记安全保护 ( Labeled Security Protection)
C2 受控的存取保护 ( Controlled Access Protection)
C1 自主安全保护 ( Discretionary Security Protection)
D 最小保护 ( Minimal Protection)
可信计算机系统评测标准(续)
四组 (division)七个等级
D
C( C1,C2)
B( B1,B2,B3)
A( A1)
按系统可靠或可信程度逐渐增高
各安全级别之间具有一种偏序向下兼容的关系,
即较高安全性级别提供的安全保护要包含较低级别的所有保护要求,同时提供更多或更完善的保护能力。
可信计算机系统评测标准(续)
D级
将一切不符合更高标准的系统均归于 D组
典型例子,DOS是安全标准为 D的操作系统
DOS在安全性方面几乎没有什么专门的机制来保障可信计算机系统评测标准(续)
C1级
非常初级的自主安全保护
能够实现对用户和数据的分离,进行自主存取控制( DAC),保护或限制用户权限的传播。
可信计算机系统评测标准(续)
C2级
安全产品的最低档次
提供受控的存取保护,将 C1级的 DAC进一步细化,以个人身份注册负责,并实施审计和资源隔离
达到 C2级的产品在其名称中往往不突出,安全,(Security)这一特色可信计算机系统评测标准(续)
典型例子
操作系统
Microsoft的 Windows NT 3.5,
数字设备公司的 Open VMS VAX 6.0和 6.1
数据库
Oracle公司的 Oracle 7
Sybase公司的 SQL Server 11.0.6
可信计算机系统评测标准(续)
B1级
标记安全保护。,安全,(Security)或,可信的,(Trusted)产品。
对系统的数据加以标记,对标记的主体和客体实施强制存取控制( MAC)、审计等安全机制可信计算机系统评测标准(续)
典型例子
操作系统
数字设备公司的 SEVMS VAX Version 6.0
惠普公司的 HP-UX BLS release 9.0.9+
数据库
Oracle公司的 Trusted Oracle 7
Sybase公司的 Secure SQL Server version 11.0.6
Informix公司的 Incorporated INFORMIX-
OnLine / Secure 5.0
可信计算机系统评测标准(续)
B2级
结构化保护
建立形式化的安全策略模型并对系统内的所有主体和客体实施 DAC和 MAC。
经过认证的 B2级以上的安全系统非常稀少可信计算机系统评测标准(续)
典型例子
操作系统
只有 Trusted Information Systems公司的
Trusted XENIX一种产品
标准的网络产品
只有 Cryptek Secure Communications公司的 LLC
VSLAN一种产品
数据库
没有符合 B2标准的产品可信计算机系统评测标准(续)
B3级
安全域。
该级的 TCB必须满足访问监控器的要求,审计跟踪能力更强,并提供系统恢复过程。
可信计算机系统评测标准(续)
A1级
验证设计,即提供 B3级保护的同时给出系统的形式化设计说明和验证以确信各安全保护真正实现。
可信计算机系统评测标准(续)
B2以上的系统
还处于理论研究阶段
应用多限于一些特殊的部门如军队等
美国正在大力发展安全产品,试图将目前仅限于少数领域应用的 B2安全级别下放到商业应用中来,并逐步成为新的商业标准。
可信计算机系统评测标准(续)
可信计算机系统评测标准(续)
表示该级不提供对该指标的支持;
表示该级新增的对该指标的支持;
表示该级对该指标的支持与相邻低一级的等级一样;
表示该级对该指标的支持较下一级有所增加或改动 。
第九章 数据库安全性
9.1 计算机安全性概论
9.2 数据库安全性控制
9.3 统计数据库安全性
9.4 Oracle数据库的安全性措施
9.5 小结
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.1 数据库安全性控制概述
非法使用数据库的情况
用户编写一段合法的程序绕过 DBMS及其授权机制,通过操作系统直接存取、修改或备份数据库中的数据;
直接或编写应用程序执行非授权操作;
数据库安全性控制概述(续)
通过多次合法查询数据库从中推导出一些保密数据例:某数据库应用系统禁止查询单个人的工资,但允许查任意一组人的平均工资。用户甲想了解张三的工资,于是他:
首先查询包括张三在内的一组人的平均工资然后查用自己替换张三后这组人的平均工资从而推导出张三的工资
破坏安全性的行为可能是无意的,故意的,
恶意的。
计算机系统中的安全模型应用 DBMS OS DB
低高安全性控制层次方法,用户标识和鉴定存取控制审计视图操作系统安全保护 密码存储数据库安全性控制概述(续)
数据库安全性控制的常用方法
用户标识和鉴定
存取控制
视图
审计
密码存储
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.2 用户标识与鉴别
用户标识与鉴别( Identification &
Authentication)
系统提供的最外层安全保护措施
9.2.2 用户标识与鉴别基本方法
系统提供一定的方式让用户标识自己的名字或身份;
系统内部记录着所有合法用户的标识;
每次用户要求进入系统时,由系统核对用户提供的身份标识;
通过鉴定后才提供机器使用权。
用户标识和鉴定可以重复多次用户标识自己的名字或身份
用户名 /口令
简单易行,容易被人窃取
每个用户预先约定好一个 计算过程 或者 函数
系统提供一个随机数
用户根据自己预先约定的计算过程或者函数进行计算
系统根据用户计算结果是否正确鉴定用户身份
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.3 存取控制
存取控制机制的功能
存取控制机制的组成
定义存取权限
检查存取权限用户权限定义和合法权检查机制一起组成了 DBMS的安全子系统存取控制(续)
定义存取权限
在数据库系统中,为了保证用户只能访问他有权存取的数据,必须预先对每个用户定义存取权限。
检查存取权限
对于通过鉴定获得上机权的用户(即合法用户),系统根据他的存取权限定义对他的各种操作请求进行控制,确保他只执行合法操作。
存取控制(续)
常用存取控制方法
自主存取控制 ( Discretionary Access
Control,简称 DAC)
C2级
灵活
强制存取控制 ( Mandatory Access Control,
简称 MAC)
B1级
严格自主存取控制方法
同一用户对于不同的数据对象有不同的存取权限
不同的用户对同一对象也有不同的权限
用户还可将其拥有的存取权限转授给其他用户强制存取控制方法
每一个数据对象被标以一定的密级
每一个用户也被授予某一个级别的许可证
对于任意一个对象,只有具有合法许可证的用户才可以存取
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.4 自主存取控制方法
定义存取权限
存取权限
存取权限由两个要素组成
数据对象
操作类型自主存取控制方法(续)
关系系统中的存取权限
类型数据对象 操作类型模 式 模 式 建立、修改、删除、检索外模式 建立、修改、删除、检索内模式 建立、删除、检索数 据 表 查找、插入、修改、删除属性列 查找、插入、修改、删除自主存取控制方法(续)
关系系统中的存取权限 (续 )
定义方法
GRANT/REVOKE
自主存取控制方法(续)
关系系统中的存取权限 (续 )
例,一张授权表用户名 数据对象名 允许的操作类型王 平 关系 Student SELECT
张明霞 关系 Student UPDATE
张明霞 关系 Course ALL
张明霞 SC,Grade UPDATE
张明霞 SC,Sno SELECT
张明霞 SC,Cno SELECT
自主存取控制方法(续)
检查存取权限
对于获得上机权后又进一步发出存取数据库操作的用户
DBMS查找数据字典,根据其存取权限对操作的合法性进行检查
若用户的操作请求超出了定义的权限,系统将拒绝执行此操作自主存取控制方法(续)
授权粒度
授权粒度是指可以定义的数据对象的范围
它是衡量授权机制是否灵活的一个重要指标。
授权定义中数据对象的粒度越细,即可以定义的数据对象的范围越小,授权子系统就越灵活。
自主存取控制方法(续)
关系数据库中授权的数据对象粒度
数据库
表
属性列
行
能否提供与数据值有关的授权反映了授权子系统精巧程度自主存取控制方法(续)
实现与数据值有关的授权
利用存取谓词
存取谓词可以很复杂
可以引用系统变量,如终端设备号,系统时钟等,实现与时间地点有关的存取权限,
这样用户只能在某段时间内,某台终端上存取有关数据例:规定,教师只能在每年 1月份和 7月份星期一至星期五上午 8点到下午 5点处理学生成绩数据,。
自主存取控制方法(续)
例:扩充后的授权表用户名 数据对象名 允许的操作类型 存取谓词王平 关系 Student SELECT Sdept=?CS?
张明霞 关系 Student UPDATE Sname=?张明霞?
张明霞 关系 Course ALL 空自主存取控制方法(续)
自主存取控制小结
定义存取权限
用户
检查存取权限
DBMS
自主存取控制方法(续)
自主存取控制小结 (续 )
授权粒度
数据对象粒度:数据库、表、属性列、行
数据值粒度:存取谓词
授权粒度越细,授权子系统就越灵活,能够提供的安全性就越完善。但另一方面,因数据字典变大变复杂,系统定义与检查权限的开销也会相应地增大。
自主存取控制方法(续)
自主存取控制小结 (续 )
优点
能够通过授权机制有效地控制其他用户对敏感数据的存取自主存取控制方法(续)
自主存取控制小结 (续 )
缺点
可能存在数据的,无意泄露,
原因:这种机制仅仅通过对数据的存取权限来进行安全控制,而数据本身并无安全性标记。
解决:对系统控制下的所有主客体实施强制存取控制策略
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.5 强制存取控制方法
什么是强制存取控制
强制存取控制 (MAC)是指系统为保证更高程度的安全性,按照 TDI/TCSEC标准中安全策略的要求,所采取的强制存取检查手段。
MAC不是用户能直接感知或进行控制的。
MAC适用于对数据有严格而固定密级分类的部门
军事部门
政府部门强制存取控制方法(续)
主体与客体
在 MAC中,DBMS所管理的全部实体被分为主体和客体两大类
主体 是系统中的活动实体
DBMS所管理的实际用户
代表用户的各进程
客体 是系统中的被动实体,是受主体操纵的
文件
基表
索引
视图强制存取控制方法(续)
敏感度标记
对于主体和客体,DBMS为它们每个实例
(值)指派一个敏感度标记( Label)
敏感度标记分成若干级别
绝密( Top Secret)
机密( Secret)
可信( Confidential)
公开( Public)
强制存取控制方法(续)
主体的敏感度标记称为许可证级别
( Clearance Level)
客体的敏感度标记称为密级( Classification
Level)
MAC机制就是通过对比主体的 Label和客体的 Label,最终确定主体是否能够存取客体强制存取控制方法(续)
强制存取控制规则
当某一用户(或某一主体)以标记 label注册入系统时,系统要求他对任何客体的存取必须遵循下面两条规则:
( 1)仅当主体的许可证级别 大于或等于 客体的密级时,该主体才能 读 取相应的客体;
( 2)仅当主体的许可证级别 等于 客体的密级时,该主体才能 写 相应的客体。
强制存取控制方法(续)
修正规则:
主体的许可证级别 <=客体的密级主体能写客体
用户可为写入的数据对象赋予高于自己的许可证级别的密级
一旦数据被写入,该用户自己也不能再读该数据对象了。
强制存取控制方法(续)
规则的共同点禁止了拥有高许可证级别的主体更新低密级的数据对象强制存取控制方法(续)
强制存取控制的特点
MAC是对数据本身进行密级标记
无论数据如何复制,标记与数据是一个不可分的整体
只有符合密级标记要求的用户才可以操纵数据
从而提供了更高级别的安全性
MAC与 DAC
DAC与 MAC共同构成 DBMS的安全机制
原因:较高安全性级别提供的安全保护要包含较低级别的所有保护
先进行 DAC检查,通过 DAC检查的数据对象再由系统进行 MAC检查,只有通过
MAC检查的数据对象方可存取。
强制存取控制方法(续)
DAC + MAC安全检查示意图
SQL语法分析 & 语义检查
DAC 检 查安全检查
MAC 检 查继 续
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.6 视图机制
视图机制把要保密的数据对无权存取这些数据的用户隐藏起来,
视图机制更主要的功能在于提供数据独立性,
其安全保护功能太不精细,往往远不能达到应用系统的要求。
视图机制(续)
视图机制与授权机制配合使用,
首先用视图机制屏蔽掉一部分保密数据
视图上面再进一步定义存取权限
间接实现了支持存取谓词的用户权限定义视图机制(续)
例:王平只能检索计算机系学生的信息先建立计算机系学生的视图 CS_Student
CREATE VIEW CS_Student
AS
SELECT
FROM Student
WHERE Sdept='CS';
视图机制(续)
在视图上进一步定义存取权限
GRANT SELECT
ON CS_Student
TO 王平 ;
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.7 审计
什么是审计
启用一个专用的审计日志( Audit Log)
将用户对数据库的所有操作记录在上面
DBA可以利用审计日志中的追踪信息找出非法存取数据的人
C2以上安全级别的 DBMS必须具有审计功能审计(续)
审计功能的可选性
审计很费时间和空间
DBA可以根据应用对安全性的要求,
灵活地打开或关闭审计功能。
审计(续)
强制性机制,
用户识别和鉴定、存取控制、视图
预防监测手段,
审计技术
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.8 数据加密
数据加密
防止数据库中数据在存储和传输中失密的有效手段
加密的基本思想
根据一定的算法将原始数据(术语为明文,
Plain text)变换为不可直接识别的格式(术语为密文,Cipher text)
不知道解密算法的人无法获知数据的内容数据加密(续)
加密方法
替换方法
使用密钥( Encryption Key)将明文中的每一个字符转换为密文中的一个字符
置换方法
将明文的字符按不同的顺序重新排列
混合 方法美国 1977年制定的官方加密标准:数据加密标准
( Data Encryption Standard,简称 DES)
数据加密(续)
DBMS中的数据加密
有些数据库产品提供了数据加密例行程序
有些数据库产品本身未提供加密程序,但提供了接口数据加密(续)
数据加密功能通常也作为可选特征,允许用户自由选择
数据加密与解密是比较费时的操作
数据加密与解密程序会占用大量系统资源
应该只对高度机密的数据加密第九章 数据库安全性
9.1 计算机安全性概论
9.2 数据库安全性控制
9.3 统计数据库安全性
9.4 Oracle数据库的安全性措施
9.5 小结
9.3 统计数据库安全性
统计数据库的特点
允许用户查询 聚集 类型的信息(例如合计、
平均值等)
不允许查询 单个 记录信息例:允许查询,程序员的平均工资是多少?,
不允许查询,程序员张勇的工资?,
统计数据库安全性(续)
统计数据库中特殊的安全性问题
隐蔽的信息通道
从合法的查询中推导出不合法的信息统计数据库安全性(续)
例 1:下面两个查询都是合法的:
1.本公司共有多少女高级程序员?
2.本公司女高级程序员的工资总额是多少?
如果第一个查询的结果是,1‖,
那么第二个查询的结果显然就是这个程序员的工资数。
规则 1:任何查询至少要涉及 N(N足够大 )个以上的记录统计数据库安全性(续)
例 2:用户 A发出下面两个合法查询:
1.用户 A和其他 N个程序员的工资总额是多少?
2.用户 B和其他 N个程序员的工资总额是多少?
若第一个查询的结果是 X,第二个查询的结果是 Y,
由于用户 A知道自己的工资是 Z,
那么他可以计算出用户 B的工资 =Y-(X-Z)。
原因:两个查询之间有很多重复的数据项规则 2:任意两个查询的相交数据项不能超过 M个统计数据库安全性(续)
可以证明,在上述两条规定下,如果想获知用户 B
的工资额
A至少需要进行 1+(N-2)/M次查询规则 3:任一用户的查询次数不能超过 1+(N-2)/M
如果两个用户合作查询就可以使这一规定失效统计数据库安全性(续)
数据库安全机制的设计目标:
试图破坏安全的人所花费的代价 >>
得到的利益第九章 数据库安全性
9.1 计算机安全性概论
9.2 数据库安全性控制
9.3 统计数据库安全性
9.4 Oracle数据库的安全性措施
9.5 小结
9.4 Oracle数据库的安全性措施
ORACLE的安全措施,
用户标识和鉴定
授权和检查机制
审计技术
用户通过触发器灵活定义自己的安全性措施一,ORACLE的用户标识和鉴定
ORACLE允许用户重复标识三次
如果三次仍未通过,系统自动退出二,ORACLE的授权与检查机制
ORACLE授权和检查机制的特色
ORACLE的权限包括 系统权限 和 数据库对象的权限
采用非集中式的授权机制
每个用户授予与回收自己创建的数据库对象的权限
DBA负责授予与回收系统权限,也可以授予与回收所有数据库对象的权限
允许重复授权,即可将某一权限多次授予同一用户,
系统不会出错
允许无效回收,即用户不具有某权限,但回收此权限的操作仍是成功的。
1.系统权限
80多种系统权限
创建会话
创建表
创建视图
创建用户系统权限(续)
DBA在创建一个用户时需要将其中的一些权限授予该用户
角色
一组系统权限的集合,目的在于简化权限管理。
ORACLE允许 DBA定义角色
ORACLE提供的预定义角色
CONNECT
RESOURCE
DBA
系统权限(续)
CONNECT角色
允许用户登录数据库并执行数据查询和操纵
ALTER TABLE
CREATE VIEW / INDEX
DROP TABLE / VIEW / INDEX
GRANT,REVOKE
INSERT,UPDATE,DELETE
SELETE
AUDIT / NOAUDIT
系统权限(续)
RESOURCE角色
允许用户建表,即执行 CREATE TABLE操作
由于创建表的用户将拥有该表,因此他具有对该表的任何权限系统权限(续)
DBA角色
允许用户执行授权命令,建表,对任何表的数据进行操纵。
DBA角色涵盖了前两种角色,此外还可以执行一些管理操作。
DBA角色拥有最高级别的权限。
系统权限(续)
例,DBA建立一用户 U12后,欲将 ALTER TABLE、
CREATE VIEW,CREATE INDEX,DROP TABLE、
DROP VIEW,DROP INDEX,GRANT,REVOKE、
INSERT,SELETE,UPDATE,DELETE,AUDIT、
NOAUDIT等系统权限授予 U12
GRANT CONNECT TO U12;
这样就可以省略十几条 GRANT语句
ORACLE的授权与检查机制(续)
ORACLE的权限
系统权限
数据库对象的权限
2.数据库对象的权限
ORACLE可以授权的数据库对象
基本表
视图
序列
同义词
存储过程
函数数据库对象的权限(续)
基本表的安全性级别
表级
行级
列级数据库对象的权限(续)
表级权限
ALTER,修改表定义
DELETE:删除表记录
INDEX,在表上建索引
INSERT,向表中插入数据记录
SELECT:查找表中记录
UPDATE:修改表中的数据
ALL,上述所有权限数据库对象的权限(续)
表级授权使用 GRANT/ REVOKE语句例,GRANT SELECT ON SC TO U12;
数据库对象的权限(续)
行级安全性
ORACLE行级安全性由视图间接实现数据库对象的权限(续)
例:用户 U1只允许用户 U12查看自己创建的
Student表中有关信息系学生的信息,则首先创建视图信息系学生视图 S_IS:
CREATE VIEW S_IS
AS
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student
WHERE Sdept='IS';
然后将关于该视图的 SELECT权限授予 U12用户:
GRANT SELECT ON S_IS TO U12;
数据库对象的权限(续)
列级安全性
实现方法
由视图间接实现
直接在基本表上定义数据库对象的权限(续)
列级安全性 (续 )
借助视图实现列级安全性
CREATE VIEW S_V
AS
SELECT Sno.Sname
FROM Student;
GRANT SELECT ON S_V TO U12;
数据库对象的权限(续)
列级安全性 (续 )
直接在基本表上定义列级安全性例,GRANT UPDATE(Sno,Cno) ON SC TO U12;
数据库对象的权限(续)
上一级对象的权限制约下一级对象的权限例:当一个用户拥有了对某个表的 UPDATE权限相当于在表的所有列了都拥有
UPDATE 权限数据库对象的权限(续)
ORACLE对数据库对象的权限采用分散控制方式
允许具有 WITH GRANT OPTION的用户把相应权限或其子集传递授予其他用户
ORACLE不允许循环授权
U1 ───→ U2 ───→ U3 ───→ U4
↑ │
└─────── × ─────────┘
ORACLE的授权与检查机制(续)
ORACLE的权限 信息记录在数据字典中
当用户进行数据库操作时
ORACLE首先根据数据字典中的权限信息,
检查操作的合法性
9.4 Oracle数据库的安全性措施
ORACLE的安全措施,
用户标识和鉴定
授权和检查机制
审计技术
用户通过触发器灵活定义自己的安全性措施三,ORACLE的审计技术
审计分类
用户级审计
系统级审计三,ORACLE的审计技术
用户级审计
由用户设置
用户针对自己创建的数据库表或视图进行审计
审计内容
所有用户对这些表或视图的一切 成功 和/或 不成功的访问要求
所有用户对这些表或视图的各类 SQL操作
ORACLE的审计技术 (续 )
系统级审计
DBA设置
审计对象和内容
成功或失败的登录要求
GRANT和 REVOKE操作
其他数据库级权限下的操作
ORACLE的 审计设置可以自由设置
AUDIT:设置审计功能例,AUDIT ALTER,UPDATE ON SC;
NOAUDIT:取消审计功能例,NOAUDIT ALL ON SC;
对哪些表进行审计
对哪些操作进行审计
ORACLE的审计技术(续)
与审计功能有关的数据字典表
SYS.TABLES:审计设置
SYS.AUDIT_TRAIL:审计内容
SYSTEM.AUDIT_ACTION
ORACLE的审计技术(续)
SYS.TABLES:
TAB$NAME,表名;
TAB$OWNER:表的拥有者(即创建者)
TAB$AUDIT,审计设置
9.4 Oracle数据库的安全性措施
ORACLE的安全措施,
用户标识和鉴定
授权和检查机制
审计技术
用户通过触发器灵活定义自己的安全性措施四、用户定义的安全性措施
用数据库级 触发器 定义用户级安全性例:规定只能在工作时间内更新 Student表可以定义如下触发器:
用户定义的安全性措施(续)
CREATE OR REPLACE TRIGGER secure_student
BEFORE INSERT OR UPDATE OR DELETE ON Student
BEGIN
IF (TO_CHAR(sysdate,'DY') IN ('SAT','SUN'))
OR (TO_NUMBER(sysdate,'HH24') NOT
BETWEEN 8 AND 17)
THEN
RAISE_APPLICATION_ERROR(-20506,'You may
only change data during normal business
hours.')
END IF;
END;
用户定义的安全性措施(续)
触发器存放在数据字典中
用户每次对 Student表执行 INSERT、
UPDATE或 DELETE自动触发该触发器
系统检查当时的系统时间,如是周六或周日,
或者不是 8点至 17点,系统会拒绝执行用户的更新操作,并提示出错信息。
用户定义的安全性措施(续)
利用触发器进一步细化审计规则,使审计操作的粒度更细第九章 数据库安全性
9.1 计算机安全性概论
9.2 数据库安全性控制
9.3 统计数据库安全性
9.4 Oracle数据库的安全性措施
9.5 小结
9.5 小结
随着计算机网络的发展,数据的共享日益加强,
数据的安全保密越来越重要
DBMS是管理数据的核心,因而其自身必须具有一整套完整而有效的安全性机制。
小结(续)
,可信计算机系统评测标准,TCSEC/TDI是目前各国所引用或制定的一系列安全标准中最重要的一个。
CSEC/TDI从 安全策略,责任,保证 和 文档 四个方面描述了安全性级别的指标小结(续)
实现数据库系统安全性的技术和方法有多种,最重要的是 存取控制 技术和 审计 技术。
目前许多大型 DBMS 达到了 C2级,其安全版本达到了 B1
C2级 的 DBMS必须具有 自主存取控制 功能和 初步的审计 功能
B1级 的 DBMS必须具有 强制存取控制 和 增强的审计 功能
自主存取控制功能一般是通过 SQL 的 GRANT语句和 REVOKE语句来实现的下课了。。。
休息一会儿。。。
中国人民大学信息学院计算机系数据库系统概论
An Introduction to Database System
第十章 数据库完整性第十章 数据库完整性什么是数据库的完整性
数据的正确性和相容性
防止不合语义的数据进入数据库 。
例,学生的年龄必须是整数,取值范围为 14--29;
学生的性别只能是男或女;
学生的学号一定是唯一的;
学生所在的系必须是学校开设的系;
完整性:否真实地反映现实世界完整性控制机制
1.完整性约束条件定义机制
2.完整性检查机制
3.违约反应完整性约束条件定义
完整性约束条件:数据模型的组成部分约束数据库中数据的语义
DBMS应提供定义数据库完整性约束条件,
并把它们作为模式的一部分存入数据库中完整性控制机制
检查用户发出的操作请求是否违背了完整性约束条件违约反应
如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。
第十章 数据库完整性
10.1 完整性约束条件
10.2 完整性控制
10.3 Oracle的完整性
10.4 小结完整性约束条件(续)
完整性约束条件作用的对象
列:对属性的取值类型、范围、精度等的约束条件
元组:对元组中各个属性列间的联系的约束
关系:对若干元组间、关系集合上以及关系之间的联系的约束完整性约束条件(续)
静态
对静态对象的约束是反映数据库状态合理性的约束
动态
对动态对象的约束是反映数据库状态变迁的约束完整性约束条件分类六类完整性约束条件
静态列级约束
静态元组约束
静态关系约束
动态列级约束
动态元组约束
动态关系约束完整性约束条件(续)
对象状态动态列级约束 动态元组约束 动态关系约束动态 ④ ⑤ ⑥
静态列级约束 静态元组约束 静态关系约束静态 ① ② ③
列 元组 关系 对象粒度完整性约束条件(续)
1,静态列级约束
静态列级约束:对的取值域的说明
最常见、最简单、最容易实现的一类完整性约束完整性约束条件(续)
五类静态列级约束
1) 数据类型约束:数据的类型、长度、单位、精度等例:学生姓名的数据类型为字符型,长度为 8
2) 对数据格式的约束例:
学号:前两位表示入学年份,后四位为顺序编号日期,YY.MM.DD。
完整性约束条件(续)
3) 取值范围或取值集合的约束例:规定成绩的取值范围为 0-100
年龄的取值范围为 14-29
性别的取值集合为 [男,女 ]
4) 对空值的约束空值:未定义或未知的值空值:与零值和空格不同有的列允许空值,有的则不允许,如成绩可为空值
5) 其他约束例:关于列的排序说明,组合列等完整性约束条件(续)
2,静态元组约束规定元组的各个列之间的约束关系例:订货关系中发货量 <=订货量教师关系中教授的工资 >=700元静态元组约束只局限在元组上完整性约束条件(续)
3,静态关系约束关系的各个元组之间或若干关系之间存在的各种联系或约束常见静态关系约束:
1) 实体完整性约束
2) 参照完整性约束
3) 函数依赖约束
4) 统计约束函数依赖约束
关系字段间存在的函数依赖例:在学生-课程-教师关系
SJT(S,J,T) 的函数依赖:
( (S,J) → T,T→ J )
主码,(S,J)
统计约束
定义某个字段值一个关系多个元组的统计值之间的约束关系
例:职工平均工资的 2倍 <=部门经理的工资 <=
职工平均工资的 5倍职工平均工资值,统计值完整性约束条件(续)
4,动态列级约束动态列级约束是修改列定义或列值时应满足的约束条件完整性约束条件(续)
1) 修改列 定义 时的约束例:将原来允许空值的列改为不允许空值时,
该列目前已存在空值,则拒绝这种修改
2) 修改列值时的约束修改列值时新旧值之间要满足的约束条件例:职工工资调整 >= 原来工资年龄只能增长完整性约束条件(续)
5,动态元组约束修改元组值,各个字段之间要满足的约束条件例,职工工资调整不得低于其原来工资 + 工龄 *1.5
完整性约束条件(续)
6,动态关系约束关系变化前后状态:限制条件例:事务一致性、原子性等约束条件完整性约束条件小结粒 度 状态 列 级 元 组 级 关 系 级静 态 列定义
·类型
·格式
·值域
·空值元组值应满足的条件实体完整性约束参照完整性约束函数依赖约束统计约束动 态 改变列定义或列值 元组新旧值之间应满足的约束条件关系新旧状态间应满足的约束条件第十章 数据库完整性
10.1 完整性约束条件
10.2 完整性控制
10.3 Oracle的完整性
10.4 小结
10.2 完整性控制一,DBMS的完整性控制机制二、关系系统三类完整性的实现三、参照完整性的实现一,DBMS的完整性控制机制
1,定义功能一个完善的完整性控制机制应该允许用户定义各类完整性约束条件。
DBMS的完整性控制机制(续)
2,检查功能
立即执行的约束 (Immediate constraints)
语句执行完后立即检查是否违背完整性约束
延迟执行的约束 (Deferred constrainsts)
完整性检查延迟到整个事务执行结束后进行
DBMS的完整性控制机制(续)
例:银行数据库中,借贷总金额应平衡,的约束就应该是延迟执行的约束
从账号 A转一笔钱到账号 B为一个事务,从账号 A转出去钱后账就不平了,必须等转入账号 B后账才能重新平衡,这时才能进行完整性检查。
DBMS的完整性控制机制(续)
3,违约反应
拒绝该操作
其他处理方法
DBMS的完整性控制机制(续)
完整性规则五元组表示,
(D,O,A,C,P)
D( Data) 约束作用的 数据对象 ;
O( Operation) 触发完整性检查的 数据库操作当用户发出什么操作请求时需要检查该完整性规则是立即检查还是延迟检查;
A( Assertion) 数据对象必须满足的 断言 或 语义约束这是规则的主体;
C( Condition) 选择 A作用的数据对象值的 谓词 ;
P( Procedure) 违反完整性规则时触发的 过程 。
DBMS的完整性控制机制(续)
例 1:在,学号不能为空,的约束中
D 约束作用的对象为 Sno属性
O 插入或修改 Student 元组时
A Sno不能为空
C 无( A可作用于所有记录的 Sno属性)
P 拒绝执行该操作
DBMS的完整性控制机制(续)
例 2:在,教授工资不得低于 1000元,的约束中
D 约束作用的对象为工资 Sal属性
O 插入或修改职工元组时
A Sal不能小于 1000
C 职称 =′教授 ′
(A仅作用于职称 =?教授 ’ 的记录 )
P 拒绝执行该操作二、关系系统三类完整性的实现
关系数据库系统都提供了定义和检查实体完整性、参照完整性和用户定义的完整性的功能
违反实体完整性规则和用户定义的完整性规则的操作:
一般是拒绝执行
违反参照完整性的操作:
拒绝执行
接受这个操作,同时执行一些附加的操作,以保证数据库的状态正确三、参照完整性的实现例,职工-部门数据库包含职工表 EMP和部门表 DEPT
1 DEPT关系的主码为部门号 Deptno
2 EMP关系的主码为职工号 Empno,外码为部门号 Deptno
称 DEPT为被参照关系或目标关系,EMP为参照关系
RDBMS实现参照完整性时需要考虑以下 4方面:
1,外码是否可以接受空值的问题
外码是否能够取空值:依赖于应用环境的语义
实现参照完整性:
系统提供定义外码的机制定义外码列是否允许空值的机制
1,外码是否可以接受空值的问题例 1:在职工-部门数据库中,
EMP关系包含有外码 Deptno
某元组的这一列若为空值,表示这个职工尚未分配到任何具体的部门工作和应用环境的语义是相符
1,外码是否可以接受空值的问题例 2:学生-选课数据库
Student关系为被参照关系,其主码为 Sno。
SC为参照关系,外码为 Sno。
若 SC的 Sno为空值:表明尚不存在的某个学生,或者某个不知学号的学生,选修了某门课程,其成绩记录在 Grade中与学校的应用环境是不相符的,因此 SC的 Sno列不能取空值。
2.在被参照关系中删除元组时的问题出现违约操作的情形:
删除被参照关系的某个元组( student)
而参照关系有若干元组 (SC)的外码值与被删除的被参照关系的主码值相同
2.在被参照关系中删除元组时的问题
违约反应:可有三种策略
级联删除( CASCADES)
受限删除( RESTRICTED)
置空值删除( NULLIFIES)
这三种处理方法,哪一种是正确的,要依应用环境的语义来定
2.在被参照关系中删除元组时的问题
级联删除将参照关系中外码值与被参照关系中要删除元组主码值相对应的元组一起删除
受限删除当参照关系中没有任何元组的外码值与要删除的被参照关系的元组的主码值相对应时,系统才执行删除操作,否则拒绝此删除操作
2.在被参照关系中删除元组时的问题
置空值删除删除被参照关系的元组,并将参照关系中与被参照关系中被删除元组主码值相等的外码值置为空值。
2.在被参照关系中删除元组时的问题例:要删除 Student关系中 Sno=950001的元组,
而 SC关系中有 4个元组的 Sno都等于 950001。
级联删除:将 SC关系中所有 4个
Sno=950001的元组一起删除。如果参照关系同时又是另一个关系的被参照关系,则这种删除操作会继续级联下去
受限删除:系统将拒绝执行此删除操作。
2.在被参照关系中删除元组时的问题
置空值删除:将 SC关系中所有 Sno=950001
的元组的 Sno值置为空值。
在学生选课数据库中,显然第一种方法和第二种方法都是对的。第三种方法不符合应用环境语义。
3.在参照关系中插入元组时的问题
出现违约操作的情形
需要在参照关系中插入元组,而被参照关系不存在相应的元组
违约反应
受限插入
递归插入
3.在参照关系中插入元组时的问题
受限插入
仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。
递归插入
首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。
3.在参照关系中插入元组时的问题例:向 SC关系插入( 99001,1,90)元组,
而 Student关系中尚没有 Sno=99001的学生
受限插入:系统将拒绝向 SC关系插入
( 99001,1,90)元组
递归插入:系统将首先向 Student关系插入
Sno=99001的元组,然后向 SC关系插入
( 99001,1,90)元组。
4,修改被参照关系中主码的问题
两种策略
(1)不允许修改主码
(2)允许修改主码允许修改主码策略
违约操作
要 修改被参照关系 中某些元组的主码值,而参照关系中有些元组的外码值正好等于被参照关系要修改的主码值
要 修改参照关系 中某些元组的主码值,
而被参照关系中没有任何元组的外码值等于被参照关系修改后的主码值允许修改主码策略
违约反应 (1)
修改的关系是被参照关系:与删除类似
级联修改
受限修改
置空值修改允许修改主码策略
级联修改
修改被参照关系中主码值同时,用相同的方法修改参照关系中相应的外码值。
受限修改
拒绝此修改操作。只当参照关系中没有任何元组的外码值等于被参照关系中某个元组的主码值时,这个元组的主码值才能被修改。
置空值修改
修改被参照关系中主码值,同时将参照关系中相应的外码值置为空值。
允许修改主码策略例:将 Student关系中 Sno=950001的元组中
Sno值改为 960123。而 SC关系中有 4个元组的 Sno=950001
级联修改:将 SC关系中 4个 Sno=950001元组中的 Sno值也改为 960123。如果参照关系同时又是另一个关系的被参照关系,则这种修改操作会继续级联下去。
允许修改主码策略
受限修改:只有 SC中没有任何元组的
Sno=950001时,才能修改 Student表中
Sno=950001的元组的 Sno值改为 960123。
置空值修改:将 Student表中 Sno=950001的元组的 Sno值改为 960123。而将 S表中所有
Sno=950001的元组的 Sno值置为空值。
在学生选课数据库中只有第一种方法是正确的。
允许修改主码策略
违约反应 (2)
修改的关系是参照关系:与插入类似
受限插入
递归插入参照完整性的实现
RDBMS在实现参照完整性时,
需要向用户提供定义主码、外码的机制
向用户提供按照自己的应用要求选择处理依赖关系中对应的元组的方法第十章 数据库完整性
10.1 完整性约束条件
10.2 完整性控制
10.3 Oracle的完整性
10.4 小结
10.3 Oracle的完整性一,Oracle中的实体完整性二,Oracle中的参照完整性三,Oracle中用户定义的完整性一,ORACLE中的实体完整性
ORACLE在 CREATE TABLE语句中提供了
PRIMARY KEY子句,供用户在建表时指定关系的主码列。
在列级使用 PRIMARY KEY子句
在表级使用 PRIMARY KEY子句
ORACLE中的实体完整性(续)
例 1:在学生选课数据库中,要定义 Student表的 Sno属性为主码
CREATE TABLE Student
(Sno NUMBER(8),
Sname VARCHAR(20),
Sage NUMBER(20),
CONSTRAINT PK_SNO PRIMARY KEY (Sno));
或,
CREATE TABLE Student
(Sno NUMBER(8) PRIMARY KEY,
Sname VARCHAR(20),
Sage NUMBER(20));
ORACLE中的实体完整性(续)
例 2:要在 SC表中定义 (Sno,Cno)为主码
CREATE TABLE SC
(Sno NUMBER(8),
Cno NUMBER(2),
Grade NUMBER(2),
CONSTRAINT PK_SC PRIMARY KEY (Sno,Cno));
ORACLE中的实体完整性(续)
用户程序对主码列进行更新操作时,系统自动进行完整性检查
违约操作
使主属性值为空值的操作
使主码值在表中不唯一的操作
违约反应
系统拒绝此操作,从而保证了实体完整性二,ORACLE中的参照完整性定义参照完整性
FOREIGN KEY子句:定义外码列
REFERENCES子句:外码相应于哪个表的主码
ON DELETE CASCADE子语:
在删除被参照关系的元组时,同时删除参照关系中 外码值等于被参照关系的元组中主码值的元组
ORACLE中的参照完整性(续)
例 1:建立表 EMP表
CREATE TABLE EMP
(Empno NUMBER(4),
Ename VARCHAR(10),
Job VERCHAR2(9),
Mgr NUMBER(4),
Sal NUMBER(7,2),
Deptno NUMBER(2),
CONSTRAINT FK_DEPTNO
FOREIGN KEY (Deptno)
REFERENCES DEPT(Deptno));
ORACLE中的参照完整性(续)
或:
CREATE TABLE EMP
(Empno NUMBER(4),
Ename VARCHAR(10),
Job VERCHAR2(9),
Mgr NUMBER(4),
Sal NUMBER(7,2),
Deptno NUMBER(2) CONSTRAINT FK_DEPTNO
FOREIGN KEY REFERENCES DEPT(Deptno));
ORACLE中的参照完整性(续)
这时 EMP表中外码为 Deptno,它相应于 DEPT
表中的主码 Deptno。
当要修改 DEPT表中的 DEPTNO值时,先要检查
EMP表中有无元组的 Deptno值与之对应
若没有,系统接受这个修改操作
否则,系统拒绝此操作
ORACLE中的参照完整性(续)
当要删除 DEPT表中某个元组时,系统要检查
EMP表,若找到相应元组即将其随之删除。
当要插入 EMP表中某个元组时,系统要检查
DEPT表,先要检查 DEPT表中有无元组的
Deptno值与之对应
若没有,系统拒绝此插入操作
否则,系统接受此操作三,ORACLE中用户定义的完整性
ORACLE中定义用户完整性的两类方法
用 CREATE TABLE语句在建表时定义用户完整性约束
通过触发器来定义用户的完整性规则
ORACLE中用户定义的完整性(续)
1,用 CREATE TABLE语句在建表时定义用户完整性约束可定义三类完整性约束
列值非空( NOT NULL短语)
列值唯一( UNIQUE短语)
检查列值是否满足一个布尔表达式( CHECK
短语)
ORACLE中用户定义的完整性(续)
例 1:建立部门表 DEPT,要求部门名称 Dname列取值唯一,部门编号 Deptno列为主码
CREATE TABLE DEPT
(Deptno NUMBER,
Dname VARCHAR(9) CONSTRAINT U1 UNIQUE,
Loc VARCHAR(10),
CONSTRAINT PK_DEPT PRIMARY KEY (Deptno));
其中 CONSTRAINT U1 UNIQUE 表示约束名为 U1,
该约束要求 Dname列值唯一。
ORACLE中用户定义的完整性(续)
例 2,建立学生登记表 Student,要求学号在
900000至 999999之间,年龄 <29,性别只能是 ‘ 男 ’ 或 ‘ 女 ’,姓名非空
CREATE TABLE Student
(Sno NUMBER(5)
CONSTRAINT C1 CHECK
(Sno BETWEEN 10000 AND 99999),
Sname VARCHAR(20) CONSTRAINT C2 NOT NULL,
Sage NUMBER(3) CONSTRAINT C3 CHECK (Sage < 29),
Ssex VARCHAR(2)
CONSTRAINT C4 CHECK (Ssex IN ('男 ','女 '));
ORACLE中用户定义的完整性(续)
例 3,建立职工表 EMP,要求每个职工的应发工资不得超过 3000元。 应发工资实际上就是实发工资列 Sal与扣除项 Deduct之和。
CREATE TABLE EMP
(Eno NUMBER(4)
Ename VARCHAR(10),
Job VARCHAR(8),
Sal NUMBER(7,2),
Deduct NUMBER(7,2)
Deptno NUMBER(2),
CONSTRAINTS C1 CHECK (Sal + Deduct <=3000));
ORACLE中用户定义的完整性(续)
2,通过触发器来定义用户的完整性规则
定义其它的完整性约束时,需要用数据库触发器( Trigger)来实现。
数据库触发器:一类靠事务驱动的特殊过程
一旦由某个用户定义,任何用户对该数据的增、
删、改操作均由服务器自动激活相应的触发子,
在核心层进行集中的完整性控制
定义数据库触发器的语句
CREATE [OR REPLACE] TRIGGER
ORACLE中用户定义的完整性(续)
例 4,为教师表 Teacher定义完整性规则
,教授的工资不得低于 800元,如果低于 800元,
自动改为 800元,
ORACLE中用户定义的完整性(续)
CREATE TRIGGER UPDATE_SAL
BEFORE INSERT OR UPDATE OF Sal,Pos ON Teacher
FOR EACH ROW
WHEN (:new.Pos='教授 ')
BEGIN
IF,new.sal<800
THEN
:new.Sal:=800;
END IF;
END;
Oracle完整性小结
ORACLE提供定义完整性约束条件
CREATE TABLE语句
CREATE TRIGGER语句可以定义很复杂的完整性约束条件
ORACLE自动执行相应的完整性检查对于违反完整性约束条件的操作:
拒绝执行或者执行事先定义的操作第十章 数据库完整性
10.1 完整性约束条件
10.2 完整性控制
10.3 Oracle的完整性
10.4 小结
10.4 小结
数据库的完整性是为了保证数据库中存储的数据是正确的,所谓正确的是指符合现实世界语义的。
DBMS完整性实现的机制
完整性约束定义机制
完整性检查机制
违背完整性约束条件时 DBMS应采取的动作小结
完整性机制的实施会极大地影响系统性能
不同的数据库产品对完整性的支持策略和支持程度是不同的
许多数据库管理系统对完整性机制的支持比对安全性的支持要晚得多也弱得多
数据库厂商对完整性的支持越来越好,不仅在能保证实体完整性和参照完整性而且能在 DBMS核心定义、检查和保证用户定义的完整性约束条件下课了。。。
休息一会儿。。。
An Introduction to Database System
教材及参考书
教材
萨师煊,王珊,数据库系统概论 (第三版 ),
高等教育出版社,2000 中国人民大学教材及参考书 (2)
参考书
施伯乐,丁宝康,数据库系统教程,高教出版社,2003
学习方式
听课
(启发式、讨论式)
读书
(预习、复习)
评分标准:
平时表现 5%平时测试 15%个人研究报告 8%集体项目
12%期末考试 60%
研究报告(第 15周交)
题目自拟,与数据库有关,偏重理论而不是具体软件的操作。题目于五一节前定好。
包括以下要点:
1)从问题入手,该技术是解决什么问题
2)该技术的发展历史
3)该技术的要点是什么,如何一步一步做的
4)该技术的发展方向
5)个人对该技术的看法,比如新思想,建议算法的改变等等。
6)索引,reference,必须要有并且标记在文中。
7)准备 10分钟的 ppt文件。以便抽查演讲。
集体项目:
提供用 access或者 mysql为数据库,编程选用 c++,java,php,visual basic,
若用其他语言或数据库,请准备好演示环境。
5- 8人一组。自由分组。第六周组好
题目将于第七周公布。
上交时,软件,项目说明书,以及 20分钟
ppt。
内容安排 (1)
基础篇
第一章:绪论
第二章:关系数据库
第三章:关系数据库标准语言 SQL
第四章:关系系统及其查询优化
第五章:关系数据理论
设计篇
第六章:数据库设计内容安排 (2)
系统篇
第七章:数据库恢复技术
第八章:并发控制
第九章:数据库安全性
第十章:数据库完整性数据库系统概论
An Introduction to Database System
第一章 绪论第一章 绪论
1.1 数据库系统概述
1.2 数据模型
1.3 数据库系统结构
1.4 数据库系统的组成
1.5 数据库技术的研究领域
1.6 小结
1.1 数据库系统概述
1.1.1 数据库的地位
1.1.2 四个基本概念
1.1.3 数据管理技术的产生与发展数据库的地位
数据库技术产生于六十年代末,是数据管理的最新技术,是计算机科学的重要分支
数据库技术是信息系统的核心和基础,它的出现极大地促进了计算机应用向各行各业的渗透
数据库的建设规模、数据库信息量的大小和使用频度已成为衡量一个国家信息化程度的重要标志
1.1 数据库系统概述
1.1.1 数据库的地位
1.1.2 四个基本概念
1.1.3 数据管理技术的产生与发展
1.1.2 四个基本概念
数据 (Data)
数据库 (Database)
数据库管理系统 (DBMS)
数据库系统 (DBS)
一、数据
数据 (Data)是数据库中存储的基本对象
数据的定义
描述事物的符号记录
数据的种类
文字、图形、图象、声音
数据的特点
数据与其语义是不可分的数据举例
学生档案中的学生记录
(李明,男,1972,江苏,计算机系,1990)
数据的形式不能完全表达其内容
数据的解释
语义:学生姓名、性别、出生年月、籍贯、所在系别、入学时间
解释:李明是个大学生,1972年出生,江苏人,
1990年考入计算机系
请给出另一个解释和语义二、数据库(举例)
学生登记表学 号 姓 名 年 令 性 别 系 名 年 级
95004 王小明 19 女 社会学 95
95006 黄大鹏 20 男 商品学 95
95008 张文斌 18 女 法律学 95
… … … … … …
二、数据库 (续 )
人们收集并抽取出一个应用所需要的大量数据之后,应将其保存起来以供进一步加工处理,进一步抽取有用信息
数据库的定义
数据库 (Database,简称 DB)是 长期 储存在计算机内,有 组织 的,可 共享 的 大量 数据集合二、数据库 (续 )
数据库的特征
数据按一定的数据模型组织,描述和储存
可为各种用户共享
冗余度较小
数据独立性较高
易扩展三、数据库管理系统
什么是 DBMS
数据库管理系统 ( Database
Management System,简称 DBMS) 是位于用户与操作系统之间的一层数据管理软件 。
DBMS的用途
科学地组织和存储数据,高效地获取和维护数据
DBMS的主要功能
数据定义功能提供数据定义语言 (DDL)
定义数据库中的数据对象
数据操纵功能,提供数据操纵语言 (DML)
操纵数据实现对数据库的基本操作
(查询,插入,删除和修改 )
DBMS的主要功能
数据库的运行管理保证数据的安全性,完整性,
多用户对数据的并发使用发生故障后的系统恢复
数据库的建立和维护功能 (实用程序 )
数据库数据批量装载数据库转储介质故障恢复数据库的重组织性能监视等四、数据库系统
什么是数据库系统
数据库系统 ( Database System,简称 DBS) 是指在计算机系统中引入数据库后的系统构成 。
在不引起混淆的情况下常常把数据库系统简称为数据库 。
数据库系统的构成
由数据库,数据库管理系统 ( 及其开发工具 ),应用系统,数据库管理员 ( 和用户 ) 构成 。
数据库系统 (续 )
数据库系统构成图示
参看教材 page_5 图 1.1
数据库系统在计算机系统中的位置图示
参看教材 page_ 5 图 1.2
1.1 数据库系统概述
1.1.1 数据库的地位
1.1.2 四个基本概念
1.1.3 数据管理技术的产生与发展
1.1.3 数据管理技术的产生和发展
什么是数据管理
对数据进行分类,组织,编码,存储,检索和维护,是数据处理的中心问题
数据管理技术的发展过程
人工管理阶段 (40年代中 --50年代中 )
文件系统阶段 (50年代末 --60年代中 )
数据库系统阶段 (60年代末 --现在 )
数据管理技术的产生和发展 (续 )
数据管理技术的发展动力
应用需求的推动
计算机硬件的发展
计算机软件的发展一、人工管理
时期
40年代中 --50年代中
产生的背景
应用需求 科学计算
硬件水平 无直接存取存储设备
软件水平 没有操作系统
处理方式 批处理人工管理 (续 )
特点
数据的管理者:应用程序,数据不保存 。
数据面向的对象:某一应用程序
数据的共享程度:无共享、冗余度极大
数据的独立性:不独立,完全依赖于程序
数据的结构化:无结构
数据控制能力:应用程序自己控制应用程序与数据的对应关系 (人工管理 )
应用程序1 数据集1
应用程序2 数据集2
应用程序n 数据集 n
...…,..…
二、文件系统
时期
50年代末 --60年代中
产生的背景
应用需求 科学计算、管理
硬件水平 磁盘、磁鼓
软件水平 有文件系统
处理方式 联机实时处理、批处理文件系统 (续 )
特点数据的管理者:文件系统,数据可长期保存数据面向的对象:某一应用程序数据的共享程度:共享性差、冗余度大数据的结构化:记录内有结构,整体无结构数据的独立性:独立性差,数据的逻辑结构改变必须修改应用程序数据控制能力:应用程序自己控制应用程序与数据的对应关系 (文件系统 )
应用程序1 文件1
应用程序2 文件 2
应用程序n 文件 n
存取方法
...…,..…
文件系统中数据的结构
记录内有结构。
数据的结构是靠程序定义和解释的。
数据只能是定长的。
可以间接实现数据变长要求,但访问相应数据的应用程序复杂了。
文件间是独立的,因此数据整体无结构。
可以间接实现数据整体的有结构,但必须在应用程序中对描述数据间的联系 。
数据的最小存取单位是记录。
三、数据库系统
时期
60年代末以来
产生的背景
应用背景 大规模管理
硬件背景 大容量磁盘
软件背景 有数据库管理系统
处理方式 联机实时处理,分布处理,批处理
数据管理技术进入数据库阶段的标志是 20世纪 60
年代末的三件大事:
① 1968年美国 IBM公司推出层次模型的 IMS系统 。
② 1969年美国 CODASYL组织发布了 DBTG报告,总结了当时各式各样的数据库,提出网状模型。
③ 1970年美国 IBM公司的 E.F.Codd 连续发表论文,
提出关系模型,奠定了关系数据库的理论基础。
数据库系统 (续 )
特点
数据的管理者,DBMS
数据面向的对象:现实世界
数据的共享程度:共享性高
数据的独立性:高度的物理独立性和一定的逻辑独立性
数据的结构化:整体结构化
数据控制能力:由 DBMS统一管理和控制应用程序与数据的对应关系 (数据库系统 )
DBMS
应用程序 1
应用程序 2
数据库
…
数据的高共享性的好处
降低数据的冗余度,节省存储空间
避免数据间的不一致性
使系统易于扩充数据独立性
物理独立性
指用户的应用程序与存储在磁盘上的数据库中数据是相互独立的。当数据的物理存储改变了,应用程序不用改变 。
逻辑独立性
指用户的应用程序与数据库的逻辑结构是相互独立的 。 数据的逻辑结构改变了,用户程序也可以不变 。
数据结构化
整体 数据的结构化是数据库的主要特征之一。
数据库中实现的是数据的真正结构化
数据的结构用 数据模型 描述,无需程序定义和解释。
数据可以 变长 。
数据的最小存取单位是 数据项 。
DBMS对数据的控制功能
数据的安全性 ( Security) 保护
使每个用户只能按指定方式使用和处理指定数据,保护数据以防止不合法的使用造成的数据的泄密和破坏 。
数据的完整性 ( Integrity) 检查
将数据控制在有效的范围内,或保证数据之间满足一定的关系 。
DBMS对数据的控制功能
并发 ( Concurrency) 控制
对多用户的并发操作加以控制和协调,防止相互干扰而得到错误的结果 。
数据库恢复 ( Recovery)
将数据库从错误状态恢复到某一已知的正确状态 。
程序和数据间的联系
文件系统阶段信息处理的传统方式应用程序 n
应用程序 1
.
.
.
数据库管理系统 D BMS 数据库输入 程序 输出要求报表查询处理程序 报表生成程序数据库应用程序 应用程序输入输出输入输出联机终端数据库阶段信息处理方式的演变第一章 绪论
1.1 数据库系统概述
1.2 数据模型
1.3 数据库系统结构
1.4 数据库系统的组成
1.5 数据库技术的研究领域
1.6 小结数据模型
在数据库中用数据模型这个工具来 抽象、表示和处理 现实世界中的数据和信息。通俗地讲数据模型就是现实世界的模拟
数据模型应满足三方面要求
能比较 真实 地模拟现实世界
容 易 为人所 理解
便于在计算机上 实现数据模型 (续 )
数据模型分成两个不同的层次
(1) 概念模型 也称信息模型,它是按用户的观点来对数据和信息建模。
(2) 数据模型 主要包括网状模型、层次模型、关系模型等,它是按计算机系统的观点对数据建模 。
数据模型 (续 )
客观对象的抽象过程 ---两步抽象
现实世界中的客观对象抽象为概念模型;
把概念模型转换为某一 DBMS支持的数据模型 。
概念模型是现实世界到机器世界的一个中间层次 。
1.2 数据模型
1.2.1 数据模型的组成要素
1.2.2 概念模型
1.2.3 常用逻辑数据模型
1.2.4 层次模型
1.2.5 网状模型
1.2.6 关系模型
1.2.1 数据模型的组成要素
数据结构
数据操作
数据的约束条件
1,数据结构
什么是数据结构
对象类型的集合
两类对象
与数据类型,内容,性质有关的对象
与数据之间联系有关的对象
数据结构是对系统静态特性的描述
2.数据操作
数据操作
对数据库中各种对象 ( 型 ) 的实例 ( 值 ) 允许执行的 操作 及有关的 操作规则
数据操作的类型
检索
更新 ( 包括插入,删除,修改 )
数据操作 (续 )
数据模型对操作的定义
操作的确切含义
操作符号
操作规则 ( 如优先级 )
实现操作的语言
数据操作是对系统动态特性的描述 。
3.数据的约束条件
数据的约束条件
一组完整性规则的集合。
完整性规则是给定的数据模型中数据及其联系所具有的制约和储存规则,用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效、相容 。
数据的约束条件 (续 )
数据模型对约束条件的定义
反映和规定本 数据模型 必须遵守的基本的通用的完整性约束条件。例如在关系模型中,任何关系必须满足实体完整性和参照完整性两个条件。
提供定义完整性约束条件的机制,以反映 具体应用所涉及的数据必须遵守的特定的语义约束条件 。
1.2.2 概念模型
1,概念模型
2,信息世界中的基本概念
3,概念模型的表示方法
1,概念模型
概念模型的用途
概念模型用于信息世界的建模
是现实世界到机器世界的一个中间层次
是数据库设计的有力工具
数据库设计人员和用户之间进行交流的语言
对概念模型的基本要求
较强的语义表达能力,能够方便,直接地表达应用中的各种语义知识
简单,清晰,易于用户理解 。
2,信息世界中的基本概念
(1) 实体 ( Entity)
客观存在并可相互区别的事物称为实体 。
可以是具体的人,事,物或抽象的概念 。
(2) 属性 ( Attribute)
实体所具有的某一特性称为属性 。
一个实体可以由若干个属性来刻画 。
(3) 码 ( Key)
唯一标识实体的属性集称为码 。
信息世界中的基本概念 (续 )
(4) 域 ( Domain)
属性的取值范围称为该属性的域 。
(5) 实体型 ( Entity Type)
用实体名及其属性名集合来抽象和刻画同类实体称为实体型
(6) 实体集 ( Entity Set)
同型实体的集合称为实体集信息世界中的基本概念 (续 )
(7) 联系 ( Relationship)
现实世界中事物内部以及事物之间的联系在信息世界中反映为实体内部的联系和实体之间的联系实体型间联系两个实体型 一对一联系 ( 1:1)
三个实体型 一对多联系 ( 1:n)
一个实体型 多对多联系 ( m:n)
两个实体型间的联系实体型 1
联系名实体型 2
1
1
1:1联系实体型 1
联系名实体型 2
m
n
m:n联系实体型 1
联系名实体型 2
1
n
1:n联系数据联系的描述图 1,一对一联系图 1.9 一对多联系图 1.10 多对多联系两个实体型间的联系
一对一联系
如果对于实体集 A中的每一个实体,实体集 B中至多有一个实体与之联系,反之亦然,则称实体集 A
与实体集 B具有一对一联系 。 记为 1:1。
实例班级与班长之间的联系:
一个班级只有一个正班长一个班长只在一个班中任职两个实体型间的联系 (续 )
一对多联系
如果对于实体集 A中的每一个实体,实体集 B中有 n个实体 ( n≥0) 与之联系,反之,对于实体集 B中的每一个实体,实体集 A中至多只有一个实体与之联系,则称 实体集 A与实体集 B有一对多联系记为 1:n
实例班级与学生之间的联系:
一个班级中有若干名学生,
每个学生只在一个班级中学习两个实体型间的联系 (续 )
多对多联系 ( m:n)
如果对于实体集 A中的每一个实体,实体集 B中有 n个实体 ( n≥0) 与之联系,反之,对于实体集 B中的每一个实体,实体集 A中也有 m个实体
( m≥0) 与之联系,则称实体集 A与实体 B具有多对多联系 。 记为 m:n
实例课程与学生之间的联系:
一门课程同时有若干个学生选修一个学生可以同时选修多门课程多个实体型间的联系 (续 )
多个实体型间的一对多联系
若实体集 E1,E2,...,En存在联系,对于实体集 Ej( j=1,2,...,i-1,i+1,...,n)
中的给定实体,最多只和 Ei中的一个实体相联系,则我们说 Ei与 E1,E2,...,Ei-1,
Ei+1,...,En之间的联系是一对多的。
多个实体型间的联系 (续 )
实例课程、教师与参考书三个实体型如果一门课程可以有若干个教师讲授,使用若干本参考书,每一个教师只讲授一门课程,每一本参考书只供一门课程使用课程与教师、参考书之间的联系是一对多的
多个实体型间的一对一联系
多个实体型间的多对多联系同一实体集内各实体间的联系
一对多联系
实例职工实体集内部具有领导与被领导的联系某一职工(干部),领导,若干名职工一个职工仅被另外一个职工直接领导这是一对多的联系
一对一联系
多对多联系三元联系 一元联系
3,概念模型的表示方法
概念模型的表示方法很多
实体-联系方法 (E-R方法 )
用 E-R图来描述现实世界的概念模型
E-R方法也称为 E-R模型
E-R图
实体型
用矩形表示,矩形框内写明实体名。
学生 教师
E-R图 (续 )
属性
用椭圆形表示,并用无向边将其与相应的实体连接起来学生学号 年龄性别姓名
E-R图 (续 )
联系
联系本身,用菱形表示,菱形框内写明联系名,
并用无向边分别与有关实体连接起来,同时在无向边旁标上联系的类型( 1:1,1:n或 m:n)
联系的属性,联系本身也是一种实体型,也可以有属性。如果一个联系具有属性,则这些属性也要用无向边与该联系连接起来联系的表示方法实体型 1
联系名实体型 2
1
1
1:1联系实体型 1
联系名实体型 2
m
n
m:n联系实体型 1
联系名实体型 2
1
n
1:n联系联系的表示方法 (续 )
实体型 1
联系名
m n
同一实体型内部的 m:n联系实体型 1
联系名实体型 2
1
m
多个实体型间的 1:n联系实体型 3
n
联系的表示方法示例班级班级 -班长班长
1
1
1:1联系课程选修学生
m
n
m:n联系班级组成学生
1
n
1:n联系联系的表示方法示例 (续 )
职工领导
1 n
同一实体型内部的 1:n联系课程讲授教师
1
m
多个实体型间的 1:n联系参考书
n
联系属性的表示方法课程选修学生
m
n
成绩实体联系模型(实例)
为仓库管理设计一个 ER模型。仓库主要管理零件的采购和供应等事项。仓库根据需要向外面供应商订购零件,而许多工程项目需要仓库提供零件。
首先确定实体类型。本问题有三个实体类型:零件 PART,工程项目 PROJECT,零件供应商
SUPPLIER。
确定联系类型。 PROJECT和 PART之间是 M:N
联系,PART和 SUPPLIER之间也是 M:N联系,
分别命名为 P_P和 P_S.
把实体类型和联系类型组合成 ER图。
确定实体类型和联系类型的属性。
确定实体类型的键,在 ER图中属于码的属性名下画一条横线。
J #
P ROJ ECT
P _ P
JN A M E
DA T E
P #
P NA M E
COL OR
W EI G H T S #
S NA M E
S A DD R
T OT AL QU A NT I T Y
P _ S
P A R T P ROJ ECT
M M NN
图 1.14 ER图实例
1.2.3 常用数据模型
非关系模型
层次模型( Hierarchical Model)
网状模型 (Network Model )
数据结构:以基本层次联系为基本单位基本层次联系:两个记录以及它们之间的一对多
( 包括一对一 )的联系常用数据模型 (续 )
关系模型 (Relational Model)
数据结构:表
面向对象模型 (Object Oriented Model)
数据结构:对象
1.2 数据模型
1.2.1 数据模型的组成要素
1.2.2 概念模型
1.2.3 常用数据模型
1.2.4 层次模型
1.2.5 网状模型
1.2.6 关系模型
1.2.4 层次模型
1,层次数据模型的数据结构
2,层次数据模型的数据操纵
3,层次数据模型的与完整性约束
4,层次数据模型的存储结构
5,层次数据模型的优缺点
6,典型的层次数据库系统
1,层次数据模型的数据结构
层次模型满足下面两个条件的基本层次联系的集合为层次模型 。
1,有且只有一个结点没有双亲结点,这个结点称为根结点
2,根以外的其它结点有且只有一个双亲结点
层次模型中的几个术语
根结点,双亲结点,兄弟结点,叶结点层次数据模型的数据结构 (续)
R 1 根结点
R 2 兄弟结点 R 3
叶结点
R 4 兄弟结点 R 5
叶结点 叶结点层次数据模型的数据结构 (续)
表示方法实体型,用记录类型描述 。
每个结点表示一个记录类型 。
属性,用字段描述 。 每个记录类型可包含若干个字段 。
联系,用结点之间的连线表示记录 ( 类 ) 型之间的一对多的联系实例,教员 -学生数据模型( P23)
层次数据模型的数据结构 (续)
特点
结点的双亲是唯一的
只能直接处理一对多的实体联系
每个记录类型定义一个排序字段,也称为码字段
任何记录值只有按其路径查看时,才能显出它的全部意义
没有一个子女记录值能够脱离双亲记录值而独立存在层次数据模型的数据结构 (续)
多对多联系在层次模型中的表示
用层次模型 间接 表示多对多联系
方法将多对多联系 分解 成一对多联系
分解方法
冗余结点法
虚拟结点法
2,层次模型的数据操纵
查询
插入
删除
更新
3,层次模型的完整性约束
无相应的双亲结点值就不能插入子女结点值
如果删除双亲结点值,则相应的子女结点值也被同时删除
更新操作时,应更新所有相应记录,以保证数据的一致性
4.层次数据模型的存储结构
邻接法按照层次树前序遍历的顺序把所有记录值依次邻接存放,即通过物理空间的位置相邻来实现层次顺序
链接法用指引元来反映数据之间的层次联系
子女-兄弟链接法 P26
层次序列链接法 P26
5,层次模型的优缺点
优点
层次数据模型简单,对具有一对多的层次关系的部门描述自然,直观,容易理解
性能优于关系模型,不低于网状模型
层次数据模型提供了良好的完整性支持
缺点
多对多联系表示不自然
对插入和删除操作的限制多
查询子女结点必须通过双亲结点
层次命令趋于程序化
6,典型的层次数据库系统
IMS数据库管理系统
第一个大型商用 DBMS
1968年推出
IBM公司研制第一章 绪论
1.1 数据库系统概述
1.2 数据模型
1.3 数据库系统结构
1.4 数据库系统的组成
1.5 数据库技术的研究领域
1.6 小结
1.2 数据模型
1.2.1 概念模型
1.2.2 数据模型的组成要素
1.2.3 最常用的数据模型
1.2.4 层次模型
1.2.5 网状模型
1.2.6 关系模型
1.2.5 网状模型
1,网状数据模型的数据结构
2,网状数据模型的数据操纵
3,网状数据模型的完整性约束
4,网状数据模型的存储结构
5,网状数据模型的优缺点
6,典型的网状数据库系统
1.网状数据模型的数据结构
网状模型满足下面两个条件的基本层次联系的集合为网状模型 。
1,允许一个以上的结点无双亲;
2,一个结点可以有多于一个的双亲 。
网状数据模型的数据结构
R 1 R 2
R3
L1 L2
R1 R2
L3
L1 L2 R3
L4
R4 R5
网状数据模型的数据结构 (续)
表示方法 ( 与层次数据模型相同 )
实体型,用记录类型描述 。
每个结点表示一个记录类型 。
属性,用字段描述 。
每个记录类型可包含若干个字段 。
联系,用结点之间的连线表示记录 ( 类 ) 型之间的 一对多的父子联系 。
网状数据模型的数据结构 (续)
特点
只能直接处理一对多的实体联系
每个记录类型定义一个排序字段,也称为码字段
任何记录值只有按其路径查看时,才能显出它的全部意义网状数据模型的数据结构 (续)
网状模型与层次模型的区别
网状模型允许多个结点没有双亲结点
网状模型允许结点有多个双亲结点
网状模型允许两个结点之间有多种联系(复合联系)
网状模型可以更直接地去描述现实世界
层次模型实际上是网状模型的一个特例网状数据模型的数据结构 (续)
R 1 R 2
R3
L1 L2
R1 R2
L3
L1 L2 R3
L4
R4 R5
网状数据模型的数据结构 (续)
R 1
L1 L2
R2
网状数据模型的数据结构 (续)
学生宿舍学生 教研室系教师网状数据模型的数据结构 (续)
父母人子女树种植砍伐养育赡养网状数据模型的数据结构 (续)
多对多联系在网状模型中的表示
用网状模型 间接 表示多对多联系
方法将多对多联系 直接 分解成一对多联系
2,网状模型的数据操纵
查询
插入
删除
更新
3.网状数据模型的完整性约束网状数据库系统(如 DBTG)对数据操纵加了一些限制,提供了一定的完整性约束
码
双亲结点与子女结点之间是一对多联系
属籍类别
加入类别 (自动的,手工的 )
移出类别 (固定的,必须 的,随意的 )
3,网状数据模型的完整性约束
完整性约束条件
允许插入尚未确定双亲结点值的子女结点值
允许只删除双亲结点值
4.网状数据模型的存储结构
关键
实现记录之间的联系
常用方法
单向链接
双向链接
环状链接
向首链接例,P29
5.网状模型的优缺点
优点
能够更为直接地描述现实世界,如一个结点可以有多个双亲
具有良好的性能,存取效率较高
缺点
结构比较复杂,而且随着应用环境的扩大,数据库的结构就变得越来越复杂,不利于最终用户掌握
DDL,DML语言复杂,用户不容易使用
6,典型的网状数据库系统
DBTG系统,亦称 CODASYL系统
由 DBTG提出的一个系统方案
奠定了数据库系统的基本概念,方法和技术
70年代推出
实际系统
Cullinet Software Inc.公司的 IDMS
Univac公司的 DMS1100
Honeywell公司的 IDS/2
HP公司的 IMAGE
1.2 数据模型
1.2.1 概念模型
1.2.2 数据模型的组成要素
1.2.3 最常用的数据模型
1.2.4 层次模型
1.2.5 网状模型
1.2.6 关系模型
1.2.6 关系模型
1,关系数据模型的数据结构
2,关系数据模型的操纵
3,关系数据模型的完整性约束
4,关系数据模型的存储结构
5,关系数据模型的优缺点
6,典型的关系数据库系统关系模型
最重要的一种数据模型 。 也是目前主要采用的数据模型
1970年由美国 IBM公司 San Jose研究室的研究员 E.F.Codd提出
本课程的重点关系数据模型的数据结构
在 用户观点 下,关系模型中数据的逻辑结构是一张二维表,它由行和列组成 。
学生登记表学 号 姓 名 年 令 性 别 系 名 年 级
95004 王小明 19 女 社会学 95
95006 黄大鹏 20 男 商品学 95
95008 张文斌 18 女 法律学 95
… … … … … …
关系模型的基本概念
关系 ( Relation)
一个关系对应通常说的一张表 。
元组 ( Tuple)
表中的一行即为一个元组 。
属性 ( Attribute)
表中的一列即为一个属性,给每一个属性起一个名称即属性名 。
关系模型的基本概念
主码 ( Key)
表中的某个属性组,它可以唯一确定一个元组 。
域 ( Domain)
属性的取值范围 。
分量元组中的一个属性值 。
关系模式对关系的描述关系名(属性 1,属性 2,…,属性 n)
学生(学号,姓名,年龄,性别,系,年级)
关系数据模型的数据结构 (续)
实体及实体间的联系的表示方法
实体型,直接用关系(表)表示。
属性,用属性名表示。
一对一联系,隐含在实体对应的关系中。
一对多联系,隐含在实体对应的关系中。
多对多联系,直接用关系表示 。
关系数据模型的数据结构 (续)
例 1
学生,系,系与学生之间的一对多联系:
学生 ( 学号,姓名,年龄,性别,系号,年级 )
系 (系号,系名,办公地点 )
例 2
系,系主任,系与系主任间的一对一联系关系数据模型的数据结构 (续)
例 3
学生,课程,学生与课程之间的多对多联系:
学生 ( 学号,姓名,年龄,性别,系号,年级 )
课程 ( 课程号,课程名,学分 )
选修 ( 学号,课程号,成绩 )
关系数据模型的数据结构 (续)
关系必须是规范化的,满足一定的规范条件最基本的规范条件:关系的每一个分量必须是一个不可分的数据项 。
工 资 扣 除职 工号姓名职称 基 本 工 龄 职 务 房 租 水 电实发
86051 陈 平 讲 师 105 9,5 15 6 12 115,5
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2.关系模型的数据操纵
查询,插入,删除,更新
数据操作是集合操作,操作对象和操作结果都是关系,即若干元组的集合
存取路径对用户隐蔽,用户只要指出
,干什么,,不必详细说明,怎么干,
3.关系模型的完整性约束
实体完整性
参照完整性
用户定义的完整性
4.关系数据模型的存储结构
表以文件形式存储
有的 DBMS一个表对应一个操作系统文件
有的 DBMS自己设计文件结构图 关系模型的例子
PART模式 ( P#,PNAME,COLOR,WEIGHT)
PROJECT模式 ( J#,JNAME,DATE)
SUPPLIER模式 ( S#,SNAME,SADDR)
P_P模式 ( J#,P#,TOTAL)
P_S模式 ( P#,S#,QUANTITY)
100S2P4BEIJINGFADCS2
300S2P3SHANGHAIPICCS1
150S1P2SADDRSNAMES#
200S2P2SUPPLIER关系
100S1P191-3JCJ3
QUANTITYS#P#90.5JBJ2
P_S关系89.1JAJ1
18P3J1DATEJNAMEJ#
25P3J2PROJECT关系
65P2J119REDSCREWP4
6P3J312REDNUTP3
15P2J217GREENBOLTP2
50P1J114BLUESCREWP1
TOTALP#J#WEIGHTCOLORPNAMEP#
P_P关系PART关系关系关系关系
5.关系模型的优缺点
优点
建立在严格的数学概念的基础上
概念单一 。 数据结构简单,清晰,用户易懂易用
实体和各类联系都用关系来表示 。
对数据的检索结果也是关系 。
关系模型的存取路径对用户透明
具有更高的数据独立性,更好的安全保密性
简化了程序员的工作和数据库开发建立的工作关系模型的优缺点(续)
缺点存取路径对用户透明导致查询效率往往不如非关系数据模型为提高性能,必须对用户的 查询请求进行优化增加了开发数据库管理系统的难度
6,典型的关系数据库系统
ORACLE
SYBASE
INFORMIX
DB/2
COBASE
PBASE
EasyBase
DM/2
OpenBase
对象模型
对象( object)是现实世界中实体的模型化,与实体概念相仿,但远比实体复杂。
将属性集和方法集相同的所有对象组合在一起,构成了一个类( class)。
层次模型 网状模型 关系模型 面向对象模型创始 1968年 IBM公司的IMS系统 1969年 CODASYL的 DBTG报告 (71年通过 ) 1970年 F.Codd提出关系模型 20世纪 80年代数据结构 复杂(树结构) 复杂(有向图结构) 简单(二维表) 复杂(嵌套递归)
数据联系 通过指针 通过指针 通过表间的公共属性 通过对象标识查询语言 过程性语言 过程性语言 非过程性语言 面向对象语言典型产品 IMS
IDS/Ⅱ
IMAGE/3000
IDMS
TOTAL
Oracle
Sybase
DB2
SQL Server
Informix
ONTOS DB
盛行期 20世纪 70年代 70年代至 80年代中期 80年代至现在 90年代至现在图 四种逻辑数据模型的比较第一章 绪论
1.1 数据库系统概述
1.2 数据模型
1.3 数据库系统结构
1.4 数据库系统的组成
1.5 数据库技术的研究领域
1.6 小结
1.3 数据库系统结构
1.3.1数据库系统内部的 模式 结构从 数据库管理系统 角度看
1.3.2数据库系统外部的体系结构从 数据库最终用户 角度看
1.3.1 数据库系统的模式结构
数据库系统模式的概念
数据库系统的三级模式结构
数据库的二级映象功能与数据独立性
小结数据库系统模式的概念
―型,和,值,的概念
型 ( Type)
对某一类数据的结构和属性的说明
值 ( Value)
是型的一个具体赋值例如:学生记录记录 型,
( 学号,姓名,性别,系别,年龄,籍贯 )
该记录型的一个记录 值,
( 900201,李明,男,计算机,22,江苏 )
数据库系统模式的概念(续)
模式( Schema)- 型
数据库 逻辑结构和特征的描述
是型的描述
反映的是数据的结构及其联系
模式是相对稳定的
模式的一个实例( Instance)- 值
模式的一个具体值
反映数据库某一时刻的状态
同一个模式可以有很多实例
实例随数据库中的数据的更新而变动
1.3.1 数据库系统的模式结构
数据库系统模式的概念
数据库系统的三级模式结构
数据库的二级映象功能与数据独立性
小结数据库系统的三级模式结构应用 A 应用 B 应用 C 应用 D 应用 E
外模式 1 外模式 2 外模式 3
外模式 / 模式映象模式模式 / 内模式映象内模式数据库讲解
1、何为模式、外模式、内模式?
2、处在什么样的地位?
3、他有什么样的作用?
4、什么描述语言?
1.模式( Schema)
模式 ( 也称逻辑模式 )
数据库中 全体 数据的逻辑结构和特征的描述
所有用户 的公共数据视图,综合了 所有用户的需求
一个数据库只有 一 个模式
模式的地位:是数据库系统模式结构的 中间 层
与数据的物理存储细节和硬件环境 无关
与具体的应用程序,开发工具及高级程序设计语言 无关
模式的定义-内容
数据的逻辑结构 ( 数据项的名字,类型,
取值范围等 )
数据之间的联系
数据有关的安全性,完整性要求
模式描述语言 ( 模式 DDL)
2,外模式( External Schema)
外模式 ( 也称子模式或用户模式 )
数据库 用户 ( 包括应用程序员和最终用户 ) 使用的局部 数据的逻辑结构和特征的描述
数据库用户的数据视图,是与某一应用有关的数据的逻辑表示外模式(续)
外模式的 地位,介于模式与应用之间
模式与外模式的关系,一对多
外模式通常是模式的子集
一个数据库可以有多个外模式 。 反映了不同的用户的应用需求,看待数据的方式,
对数据保密的要求 。
对模式中同一数据,在外模式中的结构,
类型,长度,保密级别等都可以不同
外模式与应用的关系,一对多
同一外模式也可以为某一用户的多个应用系统所使用,
但一个应用程序只能使用一个外模式 。
外模式(续)
外模式的用途保证数据库 安全性 的一个有力措施 。
每个用户只能看见和访问所对应的外模式中的数据
子模式描述语言 ( 子模式 DDL)
3.内模式( Internal Schema)
内模式 ( 也称存储模式 )
是数据物理结构和存储方式的描述
是数据在数据库内部的表示方式
记录的存储方式 ( 顺序存储,按照 B树结构存储,
按 hash方法存储 )
索引的组织方式
数据是否压缩存储
数据是否加密
数据存储记录结构的规定
一个数据库只有 一 个内模式
注意:内部记录并不涉及到物理设备的约束。比内模式更接近物理存储和访问的那些软件机制是操作系统的一部分
(文件系统),例如从磁盘读数据或写数据到磁盘上的操作等。
内模式描述语言(内模式 DDL、存储 DDL)
数据按 外模式 的描述提供给 用户,
按 内模式 的描述 存储 在磁盘中,
而 模式 提供了连接这两级的相对稳定的中间 观点,并使得两级中任何一级的改变不受另一级的牵制。
1.3.1 数据库系统的模式结构
数据库系统模式的概念
数据库系统的三级模式结构
数据库的二级映象功能与数据独立性
小结三级模式与二级映象
三级模式是对数据的三个抽象级别
二级映象在 DBMS内部实现这三个抽象层次的联系和转换
数据独立性:是指应用程序和数据库的数据结构之间相互独立,不受影响 。
数据独立性 物理数据独立性
逻辑数据独立性数据库系统的三级模式结构应用 A 应用 B 应用 C 应用 D 应用 E
外模式 1 外模式 2 外模式 3
外模式 / 模式映象模式模式 / 内模式映象内模式数据库
1.外模式/模式映象
1,定义外模式与模式之间的对应关系
2,每一个外模式都对应一个外模式/模式映象
3,映象定义通常包含在各自外模式的描述中外模式/模式映象的用途
4,保证数据的 逻辑独立性
当 模式 改变时,数据库管理员修改有关的外模式/模式映象,使外模式保持不变
应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性 。
数据库系统的三级模式结构应用 A 应用 B 应用 C 应用 D 应用 E
外模式 1 外模式 2 外模式 3
外模式 / 模式映象模式模式 / 内模式映象内模式数据库
2.模式/内模式映象
模式/内模式映象定义了数据全局逻辑结构与存储结构之间的对应关系 。 例如,说明逻辑记录和字段在内部是如何表示的
数据库中模式/内模式映象是唯一的
该映象定义通常包含在模式描述中模式/内模式映象的用途保证数据的 物理独立性
当数据库的存储结构改变了 ( 例如选用了另一种存储结构 ),数据库管理员修改模式/
内模式映象,使模式保持不变
应用程序不受影响 。 保证了数据与程序的物理独立性,简称数据的物理独立性 。
数据库系统的三级模式结构应用 A 应用 B 应用 C 应用 D 应用 E
外模式 1 外模式 2 外模式 3
外模式 / 模式映象模式模式 / 内模式映象内模式数据库数据库的三级体系结构
1.3.1 数据库系统的模式结构
数据库系统模式的概念
数据库系统的三级模式结构
数据库的二级映象功能与数据独立性
小结小结
模式
是数据库的中心与关键
独立于数据库的其它层次
设计数据库模式结构时应首先确定数据库的逻辑模式小结(续)
内模式
依赖于全局逻辑结构,但独立于数据库的用户视图即外模式,也独立于具体的存储设备 。
它将全局逻辑结构中所定义的数据结构及其联系按照一定的物理存储策略进行组织,
以达到较好的时间与空间效率 。
小结(续)
外模式
面向具体的应用程序,定义在逻辑模式之上,但独立于存储模式和存储设备
设计外模式时应充分考虑到应用的扩充性 。
当应用需求发生较大变化,相应外模式不能满足其视图要求时,该外模式就得做相应改动小结(续)
应用程序
在外模式描述的数据结构上编制的,它依赖于特定的外模式,与数据库的模式和存储结构独立 。
不同的应用程序有时可以共用同一个外模式 。
小结(续)
二级映象
保证了数据库外模式的稳定性,从而从底层保证了应用程序的稳定性,除非应用需求本身发生变化,否则应用程序一般不需要修改 。
数据与程序之间的独立性,使得数据的定义和描述可以从应用程序中分离出去 。
1.3 数据库系统结构
1.3.1数据库系统内部的模式结构
从数据库管理系统角度看
1.3.2数据库系统外部的体系结构
从数据库最终用户角度看
1.3.2 数据库系统外部的体系结构
单用户结构
主从式结构
分布式结构
客户 /服务器结构
1,单用户数据库系统
整个数据库系统 (应用程序,DBMS,数据 )
装在一台计算机上,为一个用户独占,
不同机器之间不能共享数据 。
早期的最简单的数据库系统
2,主从式结构的数据库系统
一个主机带多个终端的多用户结构
数据库系统,包括应用程序,DBMS,数据,都集中存放在主机上,所有处理任务都由主机来完成
各个用户通过主机的终端并发地存取数据库,
共享数据资源主从式结构的数据库系统主机终端主从式结构的数据库系统 (续)
优点
易于管理,控制与维护 。
缺点
当终端用户数目增加到一定程度后,主机的任务会过分繁重,成为瓶颈,从而使系统性能下降 。
系统的可靠性依赖主机,当主机出现故障时,
整个系统都不能使用 。
3,分布式结构的数据库系统
数据库中的数据在 逻辑上是一个整体,
但 物理地分布 在计算机网络的不同结点上 。
网络中的每个结点都可以独立处理本地数据库中的数据,执行 局部应用
同时也可以同时存取和处理多个异地数据库中的数据,执行 全局应用分布式结构的数据库系统(续)
优点
适应了地理上分散的公司,团体和组织对于数据库应用的需求 。
缺点
数据的分布存放给数据的处理,管理与维护带来困难 。
当用户需要经常访问远程数据时,系统效率会明显地受到网络传输的制约 。
4.客户/服务器结构的数据库系统
把 DBMS功能和应用分开
网络中某个 ( 些 ) 结点上的计算机专门用于执行 DBMS功能,称为数据库服务器,
简称服务器
其他结点上的计算机安装 DBMS的外围应用开发工具,用户的应用系统,称为客户机客户/服务器数据库系统的种类
集中的服务器结构一台数据库服务器,多台客户机
分布的服务器结构
在网络中有多台数据库服务器
分布的服务器结构是客户/服务器与分布式数据库的结合客户/服务器结构的优点
客户端的用户请求被传送到数据库服务器,数据库服务器进行处理后,只将结果返回给用户,
从而显著减少了数据传输量
数据库更加开放
客户与服务器一般都能在多种不同的硬件和软件平台上运行
可以使用不同厂商的数据库应用开发工具第一章 绪论
1.1 数据库系统概述
1.2 数据模型
1.3 数据库系统结构
1.4 数据库系统的组成
1.5 数据库技术的研究领域
1.6 小结
1.4 数据库系统的组成
数据库- 仓库
数据库管理系统 ( 及其开发工具 ) - 管理制度,运行规则
应用系统- 使用仓库的公司
数据库管理员- 仓库管理员
( 用户 ) - 使用仓库的公司的人员一、硬件平台及数据库
数据库系统对硬件资源的要求
(1) 足够大的内存- 运行
操作系统
DBMS的核心模块
数据缓冲区
应用程序数据库系统对硬件资源的要求
(2) 足够大的外存- 存储
磁盘
操作系统
DBMS
应用程序
数据库及其备份
光盘,磁带,软盘
数据备份
(3) 较高的通道能力,提高数据传送率- 传输二、软件
DBMS
操作系统
与数据库接口的高级语言及其编译系统
以 DBMS为核心的应用开发工具
为特定应用环境开发的数据库应用系统三、人员
数据库管理员-运行中的管理人员
系统分析员
数据库设计人员 开发人员
应用程序员
(最终用户 )
1,数据库管理员 (DBA)
决定数据库中的信息内容和结构
决定数据库的存储结构和存取策略
定义数据的安全性要求和完整性约束条件数据库管理员 (续 )
监控数据库的使用和运行
周期性转储数据库
数据文件
日志文件
系统故障恢复
介质故障恢复
监视审计文件数据库管理员 (续 )
数据库的改进和重组
性能监控和调优
数据重组
数据库重构
2,系统分析员
负责应用系统的需求分析和规范说明
与用户及 DBA( 数据库管理员 ) 协商,
确定系统的硬软件配置
参与数据库系统的概要设计
3,数据库设计人员
参加用户需求调查和系统分析
确定数据库中的数据
设计数据库各级模式
4,应用程序员
设计和编写应用系统的程序模块
进行调试和安装
5,用户
偶然用户
企业或组织机构的高中级管理人员
简单用户
银行的职员,机票预定人员,旅馆总台服务员用户(续)
复杂用户
工程师,科学家,经济学家,科技工作者等
直接使用数据库语言访问数据库,甚至能够基于数据库管理系统的 API编制自己的应用程序第一章 绪论
1.1 数据库系统概述
1.2 数据模型
1.3 数据库系统结构
1.4 数据库系统的组成
1.5 数据库技术的研究领域
1.6 小结
1.5 数据库技术的研究领域
数据库管理系统软件的研制
数据库设计--我们的应用重点
数据库理论--需要掌握的知识数据库管理系统软件的研制
DBMS核心
一组相互联系的软件系统
工具软件
中间件数据库设计
数据库设计方法
设计工具
设计理论
数据模型和数据建模数据库理论
关系的规范化理论
关系数据理论第一章 绪论
1.1 数据库系统概述
1.2 数据模型
1.3 数据库系统结构
1.4 数据库系统的组成
1.5 数据库技术的研究领域
1.6 小结小结
数据库系统 概述
数据库的基本概念
数据管理的发展过程
数据模型
数据模型的三要素
概念模型,E-R 模型
三种主要数据模型小结 (续 )
数据库系统的 结构
数据库系统三级模式结构
数据库系统的体系结构
数据库系统的 组成作业
教材习题 P41:
第 12题
第 13题
参考教材 P19-20的例子第二章 关系数据库
2.1 关系模型概述
2.2 关系数据结构
2.3 关系的完整性
2.4 关系代数
2.5 关系演算
2.6 小结关系数据库简介
系统而严格地提出关系模型的是美国
IBM公司的 E.F.Codd
1970年提出关系数据模型
E.F.Codd,―A Relational Model of Data for Large
Shared Data Banks‖,,Communication of the
ACM》,1970
之后,提出了关系代数和关系演算的概念
1972年提出了关系的第一,第二,第三范式
1974年提出了关系的 BC范式关系数据库简介
关系数据库应用 数学方法 来处理数据库中的数据
80年代后,关系数据库系统成为最重要,
最流行的数据库系统数据库系统概论
An Introduction to Database System
第二章 关系数据库本章概要
本章先介绍关系模型的基本概念;
然后介绍关系运算的三种理论:关系代数、关系演算和关系逻辑。
第二章 关系数据库
2.1 关系模型概述
2.2 关系数据结构
2.3 关系的完整性
2.4 关系代数
2.5 关系演算
2.6 小结
2.1 关系模型概述
关系数据库系统
是支持关系模型的数据库系统
关系模型的组成
关系数据结构
关系操作集合
关系完整性约束
1,关系数据结构
单一的数据结构 ----关系
现实世界的实体以及实体间的各种联系均用关系来表示
数据的逻辑结构 ----二维表
从用户角度,关系模型中数据的逻辑结构是一张二维表 。
工 号 姓 名 年 龄 性 别 工 资
4001 zhang 50 M 2000
4002 li 40 F 1500
4124 liu 35 M 2000
5018 wang 25 M 1000
用二维表格表示实体集,用关键码进行数据导航的数据模型称为关系模型。这里数据导航是指从已知数据查找未知数据的过程和方法。
2,关系操作集合
1) 常用的关系操作
2) 关系操作的特点
3) 关系数据语言的种类
4) 关系数据语言的特点关系操作集合 (续)
1) 常用的关系操作
查询
选择,投影,连接,除,并,交,差
数据更新
插入,删除,修改
查询的表达能力是其中最主要的部分关系操作集合(续)
2) 关系操作的特点
集合操作方式,即操作的对象和结果都是集合 。
非关系数据模型的数据操作方式:一次一记录
文件系统的数据操作方式关系操作集合(续)
3) 关系数据语言的种类
1,关系代数语言
用对关系的运算来表达查询要求关系操作集合(续)
关系数据语言的种类 ( 续 )
2,关系演算语言:用谓词来表达查询要求
元组关系演算语言
谓词变元的基本对象是元组变量
典型代表,APLHA,QUEL
域关系演算语言
谓词变元的基本对象是域变量
典型代表,QBE
具有关系代数和关系演算 双重特点 的语言
典型代表,SQL
是关系数据库的 标准语言关系数据语言关系代数语言 ( ISBL)
关系演算语言具有关系代数和关系演算双重特点的语言 SQL
元组 关系演算语言
( ALPHA,QUEL)
域 关系演算语言
( QBE)
关系操作集合(续)
4) 关系数据语言的特点
关系语言是一种高度 非过程化 的语言
存取路径的选择由 DBMS的优化机制来完成
用户不必用循环结构就可以完成数据操作
能够 嵌入 高级语言中使用
关系代数,元组关系演算和域关系演算三种语言在表达能力上完全等价
3,关系的三类完整性约束
实体完整性
通常由关系系统自动支持
参照完整性
早期系统不支持,目前大型系统能自动支持
用户定义的完整性
反映应用领域需要遵循的约束条件,体现了具体领域中的语义约束
用户定义后由系统支持第二章 关系数据库
2.1 关系模型概述
2.2 关系数据结构
2.3 关系的完整性
2.4 关系代数
2.5 关系演算
2.6 小结
2.2 关系数据结构
关系模型建立在集合代数的基础上
关系数据结构的基本概念
关系
关系模式
关系数据库
2.2 关系数据结构
2.2.1 关系
2.2.2 关系模式
2.2.3 关系数据库
2.2.1 关系
⒈ 域 ( Domain)
2,笛卡尔积 ( Cartesian Product)
3,关系 ( Relation)
⒈ 域( Domain)
域 是一组具有相同数据类型的值的集合 。
例,
整数
实数
介于某个取值范围的整数
长度指定长度的字符串集合
{?男 ’,‘ 女 ’ }
介于某个取值范围的日期
{ 张清玫,刘逸 }
{ 计算机专业,信息专业 }
2,笛卡尔积( Cartesian Product)
1) 笛卡尔积给定一组域 D1,D2,…,Dn,这些域中可以有相同的 。 D1,D2,…,Dn的 笛卡尔积 为:
D1× D2× … × Dn= {( d1,d2,…,dn) |
di?Di,i= 1,2,…,n}
所有域的所有取值的一个组合
不能重复笛卡尔积(续 )
例 给出三个域:
D1=SUPERVISOR ={ 张清玫,刘逸 }
D2=SPECIALITY={计算机专业,信息专业 }
D3=POSTGRADUATE={李勇,刘晨,王敏 }
则 D1,D2,D3的笛卡尔积为:
D1× D2× D3=
{ (张清玫,计算机专业,李勇 ),(张清玫,计算机专业,刘晨 ),
(张清玫,计算机专业,王敏 ),(张清玫,信息专业,李勇 ),
(张清玫,信息专业,刘晨 ),(张清玫,信息专业,王敏 ),
(刘逸,计算机专业,李勇 ),(刘逸,计算机专业,刘晨 ),
(刘逸,计算机专业,王敏 ),(刘逸,信息专业,李勇 ),
(刘逸,信息专业,刘晨 ),(刘逸,信息专业,王敏 )}
D1域导师集合张清玫刘逸
D2域专业集合计算机专业信息专业
D3域研究生集合李勇刘晨王敏导师 专业 研究生张清玫 计算机专业 李勇张清玫 计算机专业 刘晨张清玫 计算机专业 王敏张清玫 信息专业 李勇张清玫 信息专业 刘晨张清玫 信息专业 王敏刘逸 计算机专业 李勇刘逸 计算机专业 刘晨刘逸 计算机专业 王敏刘逸 信息专业 李勇刘逸 信息专业 刘晨刘逸 信息专业 王敏笛卡尔积(续 )
2) 元组 ( Tuple)
笛卡尔积中每一个元素 ( d1,d2,…,dn)
叫作一个 n元组 ( n-tuple) 或简称 元组 。
3) 分量( Component)
笛卡尔积元素( d1,d2,…,dn)中的每一个值 di叫作一个 分量 。
笛卡尔积(续 )
4) 基数 ( Cardinal number)
若 Di( i= 1,2,…,n) 为有限集,其基数为 mi ( i = 1,2,…,n ),则
D1× D2× … × Dn的基数 M为:
在上例中,基数,2× 2× 3= 12,即
D1× D2× D3共有 2× 2× 3= 12个元组
mM i
n
1i?
笛卡尔积(续 )
5)笛卡尔积的表示方法
笛卡尔积可表示为一个二维表 。 表中的每行对应一个元组,表中的每列对应一个域 。
在上例中,12个元组可列成一张二维表表 2,1 D
1
,D
2
,D
3
的笛卡尔积
S U PE R V I S O R S PE C I A L IT Y PO S T G R A D U A T E
张清玫 计算机专业 李勇张清玫 计算机专业 刘晨张清玫 计算机专业 王敏张清玫 信息专业 李勇张清玫 信息专业 刘晨张清玫 信息专业 王敏刘逸 计算机专业 李勇刘逸 计算机专业 刘晨刘逸 计算机专业 王敏刘逸 信息专业 李勇刘逸 信息专业 刘晨刘逸 信息专业 王敏
3,关系( Relation)
1) 关系
D1× D2× … × Dn的子集叫作在域 D1,D2,…,
Dn上的 关系,表示为
R( D1,D2,…,Dn)
R,关系名
n,关系的 目 或 度 ( Degree)
关系(续)
注意:
关系是笛卡尔积的有限子集 。 无限关系在数据库系统中是无意义的 。
由于笛卡尔积不满足交换律,即
(d1,d2,…,dn)≠(d2,d1,…,dn )
但关系满足交换律,即
(d1,d2,…,di,dj,…,dn) =( d1,d2,…,dj,
di,…,dn) ( i,j = 1,2,…,n)
解决方法:为关系的每个列附加一个属性名以取消关系元组的有序性关系(续)
例 在表 2.1 的笛卡尔积中取出有实际意义的元组来构造关系关系,SAP(导师,专业,研究生 )
关系名,属性名假设,导师与专业,1:1,导师与研究生,1:n
于是,SAP关系可以包含三个元组
{ (张清玫,信息专业,李勇 ),
(张清玫,信息专业,刘晨 ),
(刘逸,信息专业,王敏 ) }
关系(续)
2) 元组关系中的每个元素是关系中的元组,通常用 t
表示 。
3) 单元关系与二元关系当 n=1时,称该关系为 单元 关系 ( Unary
relation) 。
当 n=2时,称该关系为 二元 关系 ( Binary
relation) 。
关系(续)
4) 关系的表示关系也是一个二维表,表的每行对应一个元组,
表的每列对应一个域 。 表 2,2 S A P 关系
S U P ER V I S O R S P EC I A LI TY P O S TG R A D U A TE
张清玫 信息专业 李勇张清玫 信息专业 刘晨刘逸 信息专业 王敏关系(续)
5) 属性关系中不同列可以对应相同的域,为了加以区分,必须对每列起一个名字,称为属性
( Attribute) 。
n目关系必有 n个属性 。
关系(续)
6) 码候选码 ( Candidate key)
若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码在最简单的情况下,候选码只包含一个属性。
在最极端的情况下,关系模式的所有属性组是这个关系模式的候选码,称为全码( All-
key)
关系(续)
码 (续 )
主码若一个关系有多个候选码,则选定其中一个为 主码 ( Primary key)
主码的诸属性称为 主属性 ( Prime attribute) 。
不包含在任何侯选码中的属性称为 非码属性
( Non-key attribute)
关系(续)
7) 三类关系基本关系 ( 基本表或基表 )
实际存在的表,是实际存储数据的逻辑表示查询表查询结果对应的表视图表由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据
8) 基本关系的性质
① 列是同质的( Homogeneous)
每一列中的分量是同一类型的数据,来自同一个域表 2,2 S A P 关系
S U P ER V I S O R S P EC I A LI TY P O S TG R A D U A TE
张清玫 信息专业 李勇张清玫 信息专业 刘晨刘逸 信息专业 王敏
② 不同的列可出自同一个域其中的每一列称为一个属性不同的属性要给予不同的属性名分清,属性,和,域,。
基本关系的性质 (续 )
上例中也可以只给出两个域:
人 ( PERSON) =张清玫,刘逸,李勇,刘晨,王敏专业 ( SPECIALITY) =计算机专业,信息专业
SAP关系的导师属性和研究生属性都从 PERSON域中取值为了避免混淆,必须给这两个属性取不同的属性名,而不能直接使用域名 。
例如定义,
导师属性名为 SUPERVISOR-PERSON( 或 SUPERVISOR)
研究生属性名为 POSTGRADUATE-PERSON( 或 POSTGRADUATE)
基本关系的性质 (续 )
③ 列的顺序无所谓,
列的次序可以任意交换
遵循这一性质的数据库产品 (如 ORACLE),增加新属性时,永远是插至最后一列
但也有许多关系数据库产品没有遵循这一性质,例如
FoxPro仍然区分了属性顺序基本关系的性质 (续 )
④ 任意两个元组不能完全相同由笛卡尔积的性质决定
但许多关系数据库产品没有遵循这一性质 。
例如,
Oracle,FoxPro等都允许关系表中存在两个完全相同的元组,除非用户特别定义了相应的约束条件 。
基本关系的性质 (续 )
⑤ 行的顺序无所谓行的次序可以任意交换
遵循这一性质的数据库产品 (如 ORACLE),插入一个元组时永远插至最后一行
但也有许多关系数据库产品没有遵循这一性质,例如 FoxPro仍然区分了元组的顺序基本关系的性质 (续 )
⑥ 分量必须取 原子值每一个分量都必须是不可分的数据项。
这是规范条件中最基本的一条表 2,3 非规范化关系
P O S T G RA D UA T E
S U P E R V I S O R
S P E C I A L I T Y
P G 1 P G 2
张清玫 信息专业 李勇 刘晨刘逸 信息专业 王敏
小结
域- >笛卡尔积- >关系(有限子集)-
>关系的目、元组 t、二维表、属性、码、
三种关系、基本关系的六个特点
2.2 关系数据结构
2.2.1 关系
2.2.2 关系模式
2.2.3 关系数据库
2.2.2 关系模式
1,什么是关系模式
2.定义关系模式
3,关系模式与关系
1.什么是关系模式关系模式 ( Relation Schema) 是型关系是值关系模式是对关系的描述元组集合的结构属性构成属性来自的域属性与域之间的映象关系元组语义以及完整性约束条件属性间的数据依赖关系集合
2.定义关系模式关系模式可以形式化地表示为:
R( U,D,dom,F)
R 关系名
U 组成该关系的属性名集合
D 属性组 U中属性所来自的域
dom 属性向域的映象集合
F 属性间的数据依赖关系集合定义关系模式 (续 )
例,
导师和研究生出自同一个域 ——人,
取不同的属性名,并在模式中定义属性向域的映象,即说明它们分别出自哪个域:
dom(导师 -人)
= dom(研究生 -人)
=PERSON
定义关系模式 (续 )
关系模式通常可以简记为
R (U) 或 R (A1,A2,…,An)
R 关系名
A1,A2,…,An 属性名注:域名及属性向域的映象常常直接说明为属性的类型、长度
3,关系模式与关系关系模式对关系的描述静态的,稳定的关系关系模式在某一时刻的状态或内容动态的,随时间不断变化的关系模式和关系往往 统称 为关系通过上下文加以区别
2.2 关系数据结构
2.2.1 关系
2.2.2 关系模式
2.2.3 关系数据库
2.2.3 关系数据库
1,关系数据库
2,关系数据库的型与值
1,关系数据库在一个给定的应用领域中,所有实体及实体之间联系的关系的集合构成一个关系数据库 。
2,关系数据库的型与值关系数据库也有型和值之分关系数据库的型 称为关系数据库模式,是对关系数据库的描述若干域的定义在这些域上定义的若干关系模式关系数据库的值 是这些关系模式在某一时刻对应的关系的集合,通常简称为关系数据库第二章 关系数据库
2.1 关系模型概述
2.2 关系数据结构
2.3 关系的完整性
2.4 关系代数
2.5 关系演算
2.6 小结
2.3 关系的完整性关系模型的完整性规则是对关系的某种 约束条件 。
关系模型中三类完整性约束:
实体完整性参照完整性用户定义的完整性实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个 不变性,应该由关系系统自动支持 。
关系的完整性 (续 )
2.3.1 实体完整性
2.3.2,参照完整性
2.3.3,用户定义的完整性
2.3.1 实体完整性实体完整性规则 ( Entity Integrity)
若属性 A是基本关系 R的主属性,则属性
A不能取空值例
SAP(导师,专业,研究生 )
研究生属性为主码
( 假设研究生不会重名 ),则其不能取空值实体完整性 (续 )
关系模型必须遵守实体完整性规则的原因
(1) 实体完整性规则是针对基本关系而言的 。 一个基本表通常对应现实世界的一个实体集或多对多联系 。
(2) 现实世界中的实体和实体间的联系都是可区分的,即它们具有某种唯一性标识 。
(3) 相应地,关系模型中以主码作为唯一性标识 。
实体完整性 (续 )
(4) 主码中的属性即主属性不能取空值 。
空值就是,不知道,或,无意义,的值 。
反证法:
主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第 ( 2) 点相矛盾,因此这个规则称为实体完整性 。
基本关系?--? 现实世界的实体集
主码为关系的唯一标识?--? 现实世界实体是可区分
(没有相同的指纹、
我爱的你是唯一的)
所以:主码中的属性(主属性不能取空值)
实体完整性 (续 )
注意实体完整性规则规定基本关系的所有主属性都不能取空值例选修(学号,课程号,成绩)
,学号、课程号,为主码,则两个属性都不能取空值。
关系的完整性
2.3.1 实体完整性
2.3.2,参照完整性
2.3.3,用户定义的完整性
2.3.2 参照完整性
1,关系间的引用
2,外码
3,参照完整性规则
1,关系间的引用在关系模型中实体及实体间的联系都是用关系来描述的,因此可能存在着关系与关系间的引用 。
两个关系之间例 1 学生实体,专业实体以及专业与学生间的一对多联系学生 ( 学号,姓名,性别,专业号,年龄 )
专业 ( 专业号,专业名 )
学号 姓名 性别 专业号 年龄
801 张三 女 01 19
802 李四 男 01 20
803 王五 男 01 20
804 赵六 女 02 20
805 钱七 男 02 19
专业号 专业名
01 信息
02 数学
03 计算机学生( 学号,姓名,性别,专业号,年龄)
专业( 专业号,专业名)
三个关系例 2 学生,课程,学生与课程之间的多对多联系学生 ( 学号,姓名,性别,专业号,年龄 )
课程 ( 课程号,课程名,学分 )
选修 ( 学号,课程号,成绩 )
课程号 课程名 学分
01 数据库 4
02 数据结构 4
03 编译 4
04 P ASC AL 2
学号 姓名 性别 专业号 年龄
801 张三 女 01 19
802 李四 男 01 20
803 王五 男 01 20
804 赵六 女 02 20
805 钱七 男 02 19
学号 课程号 成绩
801 04 92
801 03 78
801 02 85
802 03 82
802 04 90
803 04 88
学生学生选课课程同一个关系例 3 学生实体及其内部的领导联系 (一对多 )
学生 ( 学号,姓名,性别,专业号,年龄,班长 )
学号 姓名 性别 专业号 年龄 班长
801 张三 女 01 19 802
802 李四 男 01 20
803 王五 男 01 20 802
804 赵六 女 02 20 805
805 钱七 男 02 19
2.外码( Foreign Key)
设 F是基本关系 R的一个或一组属性,但不是关系 R的码 。 如果 F与基本关系 S的主码
Ks相对应,则称 F是基本关系 R的 外码基本关系 R称 为 参照关系 ( Referencing
Relation)
基本关系 S称 为 被参照关系 ( Referenced
Relation) 或 目标关系 ( Target Relation) 。
例子 1:
学生 ( 学号,姓名,性别,专业号,年龄 )
专业 ( 专业号,专业名 )
学生关系 ----------?专业关系专业号被参照的关系参照的关系例子 2:学生 ( 学号,姓名,性别,专业号,年龄 )
课程 ( 课程号,课程名,学分 )
选修 ( 学号,课程号,成绩 )
学生关系 <---------选修关系-- -?课程关系参照的关系被参照的关系 被参照的关系
例 3 学生实体及其内部的领导联系 (一对多 )
学生( 学号,姓名,性别,专业号,年龄,班长 )
学生关系参照的关系 被参照的关系外码 (续 )
说明
1、关系 R和 S不一定是不同的关系
2、目标关系 S的主码 Ks 和参照关系的外码 F必须定义在同一个(或一组)域上
3、外码并不一定要与相应的主码同名。
通常:当外码与相应的主码属于不同关系时,往往 取相同的名字,以便于识别
3,参照完整性规则若属性 ( 或属性组 ) F是基本关系 R的 外码它与基本关系 S的主码 Ks相对应 ( 基本关系 R和 S不一定是不同的关系 ),则对于 R中每个元组在 F上的值必须为:
或者取空值 ( F的每个属性值均为空值 )
或者等于 S中某个元组的主码值 。
参照完整性规则 (续 )
例子 1:学生关系中每个元组的,专业号,
属性只取下面两类值:
( 1) 空值,表示尚未给该学生分配专业
( 2) 非空值,这时该值必须 是专业关系中某个元组的,专业号,值,表示该学生不可能分配到一个不存在的专业中参照完整性规则 (续 )
例子 2:选修( 学号,课程号,成绩)
,学号,和,课程号,是选修关系中的主属性按照实体完整性和参照完整性规则,它们只能取相应被参照关系中已经存在的主码值参照完整性规则 (续 )
例子 3:学生( 学号,姓名,性别,专业号,年龄,
班长 )
,班长,属性值可以取两类值:
( 1)空值,表示该学生所在班级尚未选出班长,
或该学生本人即是班长;
( 2)非空值,这时该值必须是本关系中某个元组的学号值
参照完整性小结:
关系和关系之间有引用(三个关系、二个关系、单个关系)
外码
参照完整性规则关系的完整性 (续 )
2.3.1 实体完整性
2.3.2,参照完整性
2.3.3,用户定义的完整性
2.3.3 用户定义的完整性
用户定义的完整性是针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求 。
关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,
而不要由应用程序承担这一功能 。
用户定义的完整性 (续 )
例,
课程 (课程号,课程名,学分 )
―课程名,属性必须取唯一值
非主属性,课程名,也不能取空值
,学分,属性只能取值 {1,2,3,4}
小结
关系数据结构
关系
域
笛卡尔积
关系
关系,属性,元组
候选码,主码,主属性
基本关系的性质
关系模式
关系数据库
关系的数据操作集合
查询
选择、投影、连接、除、并、交、差
数据更新
插入、删除、修改
关系的完整性约束
实体完整性
参照完整性
外码
用户定义的完整性
4 关系模型的操作
4.1 关系代数
Operation 运算,操作
Operator 算子
Operand 操作数第二章 关系数据库
2.1 关系模型概述
2.2 关系数据结构
2.3 关系的完整性
2.4 关系代数
2.5 关系演算
2.6 小结
2.4 关系代数
概述
传统的集合运算
专门的关系运算概述
1,关系代数
2,运算的三要素
3,关系代数运算的三个要素
4,关系代数运算的分类
5,表示记号概述
1.关系代数一种抽象的查询语言用对关系的运算来表达查询概述 (续 )
2,关系代数运算的三个要素运算对象:关系运算结果:关系运算符:四类概述 (续 )
集合运算符
将关系看成元组的集合
运算是从关系的,水平,方向即行的角度来进行
专门的关系运算符
不仅涉及行而且涉及列
算术比较符
辅助专门的关系运算符进行操作
逻辑运算符
辅助专门的关系运算符进行操作集合运算符
∪
-
∩
×
并差交广义笛卡尔积比较运算符
>
≥
<
≤
= ≠
大于大于等于小于小于等于等于不等于运算符 含义 运算符 含义表 2.4 关系代数运算符概述 (续 )
专门的关系运算符
σ
π
÷
选择投影除连接逻辑运算符
∧
∨
非与或概述 (续 )
4.关系代数运算的分类传统的集合运算并,差,交,广义笛卡尔积专门的关系运算选择,投影,连接,除概述 (续 )
5.表示记号
( 1) R,t?R,t[Ai]
设关系模式为 R(A1,A2,…,An)
它的一个关系设为 R。 t?R表示 t是 R的一个元组
t[Ai]则表示元组 t中相应于属性 Ai的一个分量概述 (续 )
( 2) A,t[A],A
若 A={Ai1,Ai2,…,Aik},其中 Ai1,Ai2,…,
Aik是 A1,A2,…,An中的一部分,则 A称为属性列或域列。 t[A]=(t[Ai1],t[Ai2],…,
t[Aik])表示元组 t在属性列 A上诸分量的集合。
A则表示 {A1,A2,…,An}中去掉 {Ai1,
Ai2,…,Aik}后剩余的属性组。
概述 (续 )
( 3) tr ts
R为 n目关系,S为 m目关系。 tr?R,
ts?S,tr ts称为元组的连接。它是一个 n
+ m列的元组,前 n个分量为 R中的一个 n
元组,后 m个分量为 S中的一个 m元组。
概述 (续 )
4) 象集 Zx
给定一个关系 R( X,Z),X和 Z为属性组 。 当
t[X]=x时,x在 R中的 象集 ( Images Set) 为:
Zx={t[Z]|t?R,t[X]=x}
它表示 R中属性组 X上值为 x的诸元组在 Z上分量的集合。
除 (续 )
A B C
a1 b1 c2
a2 b3 c7
a3 b4 c6
a1 b2 c3
a4 b6 c6
a2 b2 c3
a1 b2 c1
R
B C
b1 c2
b2 C3
b2 c1
分析:
在关系 R中,A可以取四个值
{a1,a2,a3,a4}
a1的象集为 {(b1,c2),(b2,c3),(b2,c1)}
a2的象集为 {(b3,c7),(b2,c3)}
a3的象集为 {(b4,c6)}
a4的象集为 {(b6,c6)}
2.4 关系代数
概述
传统的集合运算
专门的关系运算
2.4.1 传统的集合运算
并
差
交
广义笛卡尔积
1,并( Union)
R和 S
具有相同的目 n( 即两个关系都有 n个属性 )
相应的属性取自同一个域
R∪ S
仍为 n目关系,由属于 R或属于 S的元组组成
R∪ S = { t|t? R∨ t?S }
并 (续 )
A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1
A B C
a1 b1 c1
a1 b2 c2
a1 b3 c2
a2 b2 c1
A B C
a1 b2 c2
a1 b3 c2
a2 b2 c1
R
S
R∪ S
R RUSS
2,差( Difference)
R和 S
具有相同的目 n
相应的属性取自同一个域
R - S
仍为 n目关系,由属于 R而不属于 S的所有元组组成
R -S = { t|t?R∧ t?S }
差 (续 )
A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1 A B C
a1 b1 c1
A B C
a1 b2 c2
a1 b3 c2
a2 b2 c1
R
S
R-S
S-R?
R R- SS
3,交( Intersection)
R和 S
具有相同的目 n
相应的属性取自同一个域
R∩ S
仍为 n目关系,由既属于 R又属于 S的元组组成
R∩ S = { t|t? R∧ t?S }
R∩ S = R –(R-S)
交 (续 )
A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1
A B C
a1 b2 c2
a2 b2 c1
A B C
a1 b2 c2
a1 b3 c2
a2 b2 c1
R
S
R ∩S
R R∩SS
4,广义笛卡尔积( Extended
Cartesian Product)
R
n目关系,k1个元组
S
m目关系,k2个元组
R× S
列,( n+m) 列的元组的集合
元组的前 n列是关系 R的一个元组
后 m列是关系 S的一个元组
行,k1× k2个元组
R× S = {tr ts |tr?R ∧ ts?S }
广义笛卡尔积 (续 )
A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1
R.A R.B R.C
a1 b1 c1
a1 b1 c1
a1 b1 c1
a1 b2 c2
a1 b2 c2
a1 b2 c2
a2 b2 c1
a2 b2 c1
a2 b2 c1
A B C
a1 b2 c2
a1 b3 c2
a2 b2 c1
R
S
R × S
S.A S.B S.C
a1 b2 c2
a1 b3 c2
a2 b2 c1
a1 b2 c2
a1 b3 c2
a2 b2 c1
a1 b2 c2
a1 b3 c2
a2 b2 c1
2.4 关系代数
概述
传统的集合运算
专门的关系运算
2.4.2 专门的关系运算
选择
投影
连接
除
1,选择( Selection)
1) 选择又称为限制 ( Restriction)
2)选择操作是根据某些条件对关系做 水平分割,即选取符合条件的 元组 。
3) 选择运算符的含义
在关系 R中选择满足给定条件的诸元组
σF(R) = {t|t?R∧ F(t)= '真 '}
F称为条件表达式 。 包括:
运算对象,常数 ( 用引号括起来 ),元组分量
( 属性名或列的序号 )
运算符,算术比较运算符 ( θ),逻辑运算符
( ∧ 或 ∨,? )
F:选择条件,是一个逻辑表达式,基本形式为:
[?( ] X1θY1 [ )][φ [?( ] X2θY2 [ )]]…
θ:比较运算符 ( >,≥,<,≤,=或 <>)
X1,Y1等:属性名,常量,简单函数;属性名也可以用它的序号来代替;
φ:逻辑运算符 ( ∧ 或 ∨ )
[ ]:表示任选项
…,表示上述格式可以重复下去
[?( ] X1θY1 [ )][φ [?( ] X2θY2 [ )]]…
分解:
X1θY1 例子,Sdept = ‘CS'
( X1θY1 ) 例子,?( Sdept = ‘CS')
X2θY2 例子,Sage>20
( X1θY1) φ( X2θY2 ) 例子,(Sdept = ‘CS’) ∧ ( Sage>20)
选择(续)
4) 选择运算是从行的角度进行的运算
5) 举例设有一个学生 -课程数据库,包括学生关系
Student,课程关系 Course和选修关系 SC。
σ
选择(续)
学 号
Sno
姓 名
Sname
性 别
Ssex
年 龄
Sage
所 在系
Sdept95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
(a)
Student
例 1 例 2 例 4例 3 例 9
选择(续)
(b)
Course
课程号 课程名 先行课 学分
Cno Cname Cpno Ccredit
1 数据库 5 4
2 数学 2
3 信息系统 1 4
4 操作系统 6 3
5 数据结构 7 4
6 数据处理 2
7 PASCAL语言 6 4
例 9
选择(续)
(c)
SC
学 号 课 程 号 成 绩
Sno Cno Grade
95001 1 92
95001 2 85
95001 3 88
95002 2 90
95002 3 80
例 7 例 9
选择(续)
[例 1] 查询信息系 ( IS系 ) 全体学生
σSdept = 'IS' (Student)
或 σ5 ='IS' (Student)
结果:
Sno Sname Ssex Sage Sdept
95002 刘晨 女 19 IS
95004 张立 男 19 IS
选择(续)
[例 2] 查询年龄小于 20岁的学生
σSage < 20(Student)
或 σ4 < 20(Student)
结果:
Sno Sname Ssex Sage Sdept
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
2,投影( Projection)
1) 投影运算符的含义
从 R中选择出若干属性列组成新的关系
πA(R) = { t[A] | t?R }
A,R中的属性列
这个操作是对一个关系进行垂直分割,消去某些列,并重新安排列的顺序 。
2,投影( Projection)
2) 投影操作主要是从列的角度进行运算
但投影之后不仅取消了原关系中的某些列,
而且还可能取消某些元组 ( 避免重复行 )
π
投影(续)
3) 举例
[例 3] 查询学生的姓名和所在系即求 Student关系上学生姓名和所在系两个属性上的投影
πSname,Sdept(Student)
或 π2,5(Student)
结果:
投影(续)
Sname Sdept
李勇 CS
刘晨 IS
王敏 MA
张立 IS
投影(续)
[例 4] 查询学生关系 Student中都有哪些系
πSdept(Student)
结果,Sdept
CS
IS
MA
3,连接( Join)
1) 连接也称为 θ连接
2) 连接运算的含义
从两个关系的笛卡尔积中选取属性间满足一定条件的元组
R S = { | tr? R∧ ts
S∧ tr[A]θts[B] }
A和 B,分别为 R和 S上度数相等且可比的属性组
θ:比较运算符
AθB tr ts
连接运算:
从 R和 S的广义笛卡尔积 R× S中选取( R关系)
在 A属性组上的值与( S关系)在 B属性组上值满足比较关系的元组。
连接 (续 )
3)两类常用连接运算
等值连接( equijoin)
什么是等值连接
θ为,=,的连接运算称为等值连接
等值连接的含义
从关系 R与 S的广义笛卡尔积中选取 A,B
属性值相等的那些元组,即等值连接为:
R S = { | tr?R∧ ts?S∧ tr[A] =
ts[B] }
A=B tr ts
连接 (续 )
自然连接 ( Natural join)
什么是自然连接
自然连接是一种特殊的等值连接
两个关系中进行比较的分量必须是相同的属性组
在结果中把重复的属性列去掉
自然连接的含义
R和 S具有相同的属性组 B
R S = { | tr?R∧ ts?S∧ tr[B] =
ts[B] }
tr ts
连接 (续 )
4) 一般的连接操作是从行的角度进行运算 。
自然连接还需要取消重复列,所以是同时从行和列的角度进行运算。
AθB
R
S
连接 (续 )
5)举例
[例 5]
A B C
a1 b1 5
a1 b2 6
a2 b3 8
a2 b4 12
B E
b1 3
b2 7
b3 10
b3 2
b5 2
R S
连接 (续 )
R S
A R.B C S.B E
a1 b1 5 b2 7
a1 b1 5 b3 10
a1 b2 6 b2 7
a1 b2 6 b3 10
a2 b3 8 b3 10
C< E
连接 (续 )
等值连接 R SR.B=S.B
A R.B C S.B E
a1 b1 5 b1 3
a1 b2 6 b2 7
a2 b3 8 b3 10
a2 b3 8 b3 2
连接 (续 )
自然连接 R S
A B C E
a1 b1 5 3
a1 b2 6 7
a2 b3 8 10
a2 b3 8 2
笛卡尔积,R× S = {tr ts |tr?R ∧ ts?S }
连接 ( θ),R S = { | tr? R∧ ts?S∧ tr[A]θts[B] }
等值连接,R S = { | tr?R∧ ts?S∧ tr[A] =
ts[B] }
自然连接,R S = { | tr?R∧ ts?S∧ tr[B] =
ts[B] }
AθB
tr ts
A=B tr ts
tr ts
4)象集 Z
给定一个关系 R( X,Z),X和 Z为属性组 。 当 t[X]=x 时,x 在 R 中的 象集
( Images Set) 为:
Zx={t[Z]|t?R,t[X]=x}
它表示 R中属性组 X上值为 x的诸元组在
Z上分量的集合。
象集 Z
A B C
a1 b1 c2
a2 b3 c7
a3 b4 c6
a1 b2 c3
a4 b6 c6
a2 b2 c3
a1 b2 c1
B C D
b1 c2 d1
b2 c1 d1
b2 c3 d2
R÷ S
A
a1
R
S
4,除( Division)
给定关系 R (X,Y) 和 S (Y,Z),其中 X,Y,Z为属性组 。
R中的 Y与 S中的 Y可以有不同的属性名,但必须出自相同的域集 。 R与 S的除运算得到一个新的关系 P(X),P是 R中满足下列条件的元组在 X属性列上的投影:元组在 X上分量值 x的 象集 Yx包含 S在 Y上投影 的集合 。
R÷ S = {tr [X] | tr? R∧ πY (S)? Yx }
Yx,x在 R中的象集,x = tr[X]
分析:
1、前提:两个关系 R( X,Y)和 S( Y,Z)
应该有公共属性列。
2、运算的结果:为 P( X),元组来自于 R关系,只包含 X属性列
3,R关系中的哪些元组呢?
对于 t[X]的象集 包含 πY (S)
除 (续 )
2) 除操作是同时从行和列角度进行运算
3) 举例
[例 6] (p62)
÷
R
S
除 (续 )
A B C
a1 b1 c2
a2 b3 c7
a3 b4 c6
a1 b2 c3
a4 b6 c6
a2 b2 c3
a1 b2 c1
B C D
b1 c2 d1
b2 c1 d1
b2 c3 d2
R÷ S
A
a1
R
S
分析:
在关系 R中,A可以取四个值 {a1,a2,a3,a4}
a1的象集为 {(b1,c2),(b2,c3),(b2,c1)}
a2的象集为 {(b3,c7),(b2,c3)}
a3的象集为 {(b4,c6)}
a4的象集为 {(b6,c6)}
S在 (B,C)上的投影为
{(b1,c2),(b2,c1),(b2,c3) }
只有 a1的象集包含了 S在 (B,C)属性组上的投影所以 R÷ S ={a1}
除 (续 )
A B C
a1 b1 c2
a2 b3 c7
a3 b4 c6
a1 b2 c3
a4 b6 c6
a2 b2 c3
a1 b2 c1
B C
b1 c2
b2 c1
b2 c3
R÷ S
A
a1
R
S
分析:
在关系 R中,A可以取四个值 {a1,a2,a3,a4}
a1的象集为 {(b1,c2),(b2,c3),(b2,c1)}
a2的象集为 {(b3,c7),(b2,c3)}
a3的象集为 {(b4,c6)}
a4的象集为 {(b6,c6)}
S在 (B,C)上的投影为
{(b1,c2),(b2,c1),(b2,c3) }
只有 a1的象集包含了 S在 (B,C)属性组上的投影所以 R÷ S ={a1}
SNO SNAME CNO CNAME
S1 BAO C1 DB
S1 BAO C2 OS
S1 BAO C3 DS
S1 BAO C4 MIS
S2 GU C1 DB
S2 GU C2 OS
S3 AN C2 OS
S4 LI C2 OS
S4 LI C4 MIS
CNO CNAME
C2 OS
CNO CNAME
C2 OS
C4 MIS
CNO CNAME
C1 DB
C2 OS
C4 MIS
S1
S2
S3
R R÷ S 1
SNO SNAME
S1 BAO
S2 GU
S3 AN
S4 LI
SNO SNAME
S1 BAO
S4 LI
SNO SNAME
S1 BAO
R÷ S 2
R÷ S 3
S1,S2,S3表示课程情况R表示选修课程?
除法的含义,R÷ S 1表示至少选修 S1关系中列出课程的学生的学号和姓名
除法的含义,R÷ S 2表示至少选修 S2关系中列出课程的学生的学号和姓名类似
)(
).(
).(
XP
ZYS
YXR
X中谁的象集包含 Y这张表
A B C D
a b c d
a b e f
a b h k
b d e f
b d d l
c K c d
c k e f
R
C D
c d
e f
R÷ S
A B
a b
c k
S
总结:
一共 八 种运算:
五 种基本运算:并、差、笛卡尔积、选择、投影
三 种组合运算:交、连接、除关系代数表达式:
关系代数运算经有限次复合后形成的式子举例,
学 号
Sno
姓 名
Sname
性 别
Ssex
年 龄
Sage
所 在系
Sdept95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
Student
Course
课程号 课程名 先行课 学分
Cno Cname Cpno Ccredit
1 数据库 5 4
2 数学 2
3 信息系统 1 4
4 操作系统 6 3
5 数据结构 7 4
6 数据处理 2
7 PASCAL语言 6 4
SC
学 号 课 程 号 成 绩
Sno Cno Grade
95001 1 92
95001 2 85
95001 3 88
95002 2 90
95002 3 80
5.综合举例以学生 -课程数据库为例 (P.59)
[例 7] 查询至少选修 1号课程和 3号课程的学生号码首先建立一个临时关系 K:
然后求,πSno.Cno(SC)÷ K
Cno
1
3
综合举例 (续 )
例 7续 πSno.Cno(SC)
95001象集 {1,2,3}
95002象集 {2,3}
πCno(K)={1,3}
于是,πSno.Cno(SC)÷ K={95001}
Sno Cno
95001 1
95001 2
95001 3
95002 2
95002 3
综合举例 (续 )
[例 8] 查询选修了 2号课程的学生的学号 。
πSno( σCno='2'( SC))
= { 95001,95002}
综合举例 (续 )
[例 9] 查询至少选修了一门其直接先行课为 5
号课程的课程的学生姓名 。
πSname(σCpno='5'(Course SC Student))
或
πSname(σCpno='5'(Course) SC πSno,Sname(Student))
或
πSname (πSno (σCpno='5' (Course) SC) πSno,Sname (Student))
综合举例 (续 )
[例 10] 查询选修了全部课程的学生号码和姓名 。
πSno,Cno( SC) ÷ πCno( Course) πSno,Sname( Student)
两种题型:
给出具体数据库和关系代数表达式,求出结果。
给出数据库的关系模式和查询要求,要求写出关系代数表达式。
应用实例:
设教学数据库中有三个关系:
学生关系 S( S#,SNAME,AGE,SEX)
课程关系 C( C#,CNAME,TEACHER)
选课关系 SC( S#,C#,GRADE)
要求用关系表达式表达查询语句。
举例,
S
学号 姓名 性别 年龄
S# SNAME SEX AGE
95001 李勇 男 20
95002 刘晨 女 19
95003 王敏 女 18
95004 张立 男 19
选择(续)
C
课程号 课程名 教师
C# CNAME TEACHER
C1 数据库 张清玫
C2 数学 刘逸
C3 信息系统 丁宝康
C4 操作系统 孙钟秀
C5 数据结构 殷人昆
C6 数据处理 王珊
C7 PASCAL语言 施伯乐选择(续)
SC
学号 课程号 成绩
S# C# GRADE
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
(1)检索学习课程号为 C2的学生学号与成绩
∏S#,GRADE(σC#=‘C2’(SC))
先找出 学习课程号为 C2的学生
然后再列出其 学号与成绩
σC#=?C2‘(SC)
SC
学 号 课 程 号 成 绩
S# C# Grade
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
σC#=?C2‘(SC)
学 号 课 程 号 成 绩
S# C# Grade
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
∏S#,GRADE(σC#=‘C2’(SC))
学 号 成 绩
S# Grade
95001 85
95002 90
(2)检索学习课程号为 C2的学生学号与 姓名
此时的 课程 与 姓名 属性不在一张表内 S SC
后找出 学习课程号为 C2的学生
然后再列出其 学号与姓名
∏S#,SNAME(σC#=‘C2’(S SC))
σC#=?C2‘(S SC)
举例,
S# Snam
e
Ssex Sage Sdept
95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
S SC
学 号 课 程 号 成 绩
S# C# Grade
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
S SC
S# Sname Ssex Sage Sdept C# Grade
95001 李勇 男 20 CS C1 92
95001 李勇 男 20 CS C2 85
95001 李勇 男 20 CS C3 88
95002 刘晨 女 19 IS C2 90
95002 刘晨 女 19 IS C3 80
S# Sname Ssex Sage Sdept C# Grade
95001 李勇 男 20 CS C1 92
95001 李勇 男 20 CS C2 85
95001 李勇 男 20 CS C3 88
95002 刘晨 女 19 IS C2 90
95002 刘晨 女 19 IS C3 80
σC#=?C2‘(S SC)
∏S#,SNAME(σC#=‘C2’(S SC))
S# Sname Ssex Sage Sdept C# Grade
95001 李勇 男 20 CS C2 85
95002 刘晨 女 19 IS C2 90
S# Sname
95001 李勇
95002 刘晨学习 C2课程的学生学号与 姓名
(3)检索选修课程名为数学的学生学号与姓名
选修、课程名、姓名 ( S SC C)
选修课程名为数学的学生
最后 取出学生的学号与姓名
σCNAME=?数学’ (S SC C))
∏S#,SNAME(σCNAME=?数学’ (S SC C))
学号 课程号 成绩
S# C# GRADE
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
学号 姓名 性别 年龄
S# SNAME SEX AGE
95001 李勇 男 20
95002 刘晨 女 19
95003 王敏 女 18
95004 张立 男 19
课程号 课程名 教师
C# CNAME TEACHER
C1 数据库 张清玫
C2 数学 刘逸
C3 信息系统 丁宝康
C4 操作系统 孙钟秀
C5 数据结构 殷人昆
C6 数据处理 王珊
C7 PASCAL语言 施伯乐
检索选修课程名为数学的学生学号与姓名
S# Sna
me
Ssex Sage Sdep
t
C# Grade
95001 李勇 男 20 CS C1 92
95001 李勇 男 20 CS C2 85
95001 李勇 男 20 CS C3 88
95002 刘晨 女 19 IS C2 90
95002 刘晨 女 19 IS C3 80
S SC
课程号 课程名 教师
C# CNAME TEACHER
C1 数据库 张清玫
C2 数学 刘逸
C3 信息系统 丁宝康
C4 操作系统 孙钟秀
C5 数据结构 殷人昆
C6 数据处理 王珊
C7 PASCAL语言 施伯乐
C
S# Sname Ssex Sage Sdept C# Grade CNAME TEACHE
R
95001 李勇 男 20 CS C1 92 数据库 张清玫
95001 李勇 男 20 CS C2 85 数学 刘逸
95001 李勇 男 20 CS C3 88 信息系统 丁宝康
95002 刘晨 女 19 IS C2 90 数学 刘逸
95002 刘晨 女 19 IS C3 80 信息系统 丁宝康
S SC C
σCNAME=?数学’ (S SC C))
S# Sname Ssex Sage Sdept C# Grade CNAME TEACHE
R
95001 李勇 男 20 CS C1 92 数据库 张清玫
95001 李勇 男 20 CS C2 85 数学 刘逸
95001 李勇 男 20 CS C3 88 信息系统丁宝康
95002 刘晨 女 19 IS C2 90 数学 刘逸
95002 刘晨 女 19 IS C3 80 信息系统丁宝康
选修课程名为数学的学生
最后 取出学生的学号与姓名
∏S#,SNAME(σCNAME=?数学’ (S SC C))
(4)检索选修课程号为 C2或 C4的学生学号
只涉及到一个 表 SC
选修课程号为 C2或 C4的 学生
最后 取出学生的学号
σC#=?C2‘ ∨ C#=?C4‘(SC)
∏S#(σC#=?C2‘ ∨ C#=?C4‘(SC) )
学号 课程号 成绩
S# C# GRADE
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
选修课程号为 C2或 C4的 学生
σC#=?C2‘ ∨ C#=?C4‘(SC)
最后 取出学生的学号
∏S#(σC#=?C2‘ ∨ C#=?C4‘(SC) )
(5)检索至少选修课程号为 C2和 C3的学生学号学号 课程号 成绩
S# C# GRADE
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
方法 1
只涉及到一个 表,但不能直接用 ∧
学号 课程号 成绩
S# C# GRADE
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
SC
σC#=?C2‘ ∧ C#=?C3‘ (SC)
SC× SC
笛卡尔积 将 垂直 的条件展开为 水平 的条件。
学号 课程号 成绩 学号 课程号 成绩
S# C# GRADE S# C# GRADE
95001 C1 92 95001 C1 92
95001 C1 92 95001 C2 85
95001 C1 92 95001 C3 88
95001 C1 92 95002 C2 90
95001 C1 92 95002 C3 80
95001 C2 85 95001 C1 92
95001 C2 85 95001 C2 85
95001 C2 85 95001 C3 88
95001 C2 85 95002 C2 90
95001 C2 85 95002 C3 80
…
SC1 SC2
选修课程号为 C2和 C3的 学生
最后 取出学生的学号
σ1=4 ∧ 2=?C2‘ ∧ 5=?C3‘ (SC× SC)
∏1(σ1=4 ∧ 2=?C2‘ ∧ 5=?C3‘ (SC× SC) )
方法 2
至少 选修课程号为,C2‖和,C3‖的关系(表)
课程号 课程名 教师
C# CNAME TEACHER
C1 数据库 张清玫
C2 数学 刘逸
C3 信息系统 丁宝康
C4 操作系统 孙钟秀
C5 数据结构 殷人昆
C6 数据处理 王珊
C7 PASCAL语言 施伯乐
K= ∏C#(σC#=?C2‘ ∨ C#=?C3‘ (C) )
构造一个临时表
考虑用 除法 来做
C#
C2
C3
学号 课程号 成绩
S# C# GRADE
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
∏ S#,C#(SC)
C#
C2
C3
K
∏ S#,C#(SC) ÷ K
S#
95001
95002
(6)检索不学 C2课的学生姓名与年龄
首先考虑,差,的问题
先求出 全体学生 的姓名和年龄,
再求出 学了 C2课的学生的姓名和年龄,
最后执行两个集合的 差 操作。
全体学生的姓名和年龄 ∏ SNAME,AGE(S)
学了 C2课的学生的姓名和年龄-第二题
最后 求差
∏SNAME,AGE(σC#=‘C2’(S SC))
∏ SNAME,AGE(S) - ∏SNAME,AGE(σC#=?C2‘(S SC))
(7)检索学习全部课程的学生姓名
A、学生选课情况可用,∏S#,C#(SC)
学号 课程号 成绩
S# C# GRADE
95001 C1 92
95001 C2 85
95001 C3 88
95002 C2 90
95002 C3 80
B、全部课程,∏ C#(C)
课程号 课程名 教师
C# CNAME TEACHER
C1 数据库 张清玫
C2 数学 刘逸
C3 信息系统 丁宝康
C#
C1
C2
C3
C、学习全部课程的学生学号可用除法表示,
操作结果是学号 S#集。
∏S#,C#(SC) ÷ ∏C#(C)
S#
95001
D、从 S#求学生姓名 SNAME,可以用自然连接和投影操作组合而成:
∏SNAME( S ( ∏S#,C#(SC) ÷ ∏C#(C) ))
本例中只有一个学生的学号,好像可以从 S表中直接查询,其实不行,因为在其他的例子中可能不只一个学生,而是多个学生的学号,
仍然必须要做连接操作
( 8)检索所学课程包含学生 S3所学课程的学生学号
A、学生选课情况可用操作 ∏S#,C#(SC)
B、学生 S3所学课程可用操作
∏C#(σs#=‘ s3’( SC)
C、所学课程包含学生 S3所学课程的学生学号,用除法操作求得:
∏S#,C#(SC) ÷ ∏C#(σs#=‘ s3’( SC)
总结:
查询语句的关系表达式一般形式是:
∏…( σ…( R× S))或者
∏…( σ…( R S))
解释:首先涉及到的关系取来,执行笛卡尔积或自然连接操作得到一张大的表格,
然后对大表格执行水平分割(选择操作)
和垂直分割(投影操作)。
但是当查询涉及到否定或全部值时,上述形式就不能表达了,就要用到差操作或除操作。
作业
1,教材习题 5
2,设有三个关系,S( S#,SNAME,AGE,SEX),
SC(S#,C#,CNAME),C(C#,CNAME,TEACHER),试用关系代数表达式表示下列查询语句:
1)检索 LIU老师所授课程的课程号和课程名
2)检索年龄大于 23岁的男学生的学号和姓名
3)检索学号为 S3学生所学课程的课程名与任课教师名
4)检索至少选修 LIU老师所授课程中一门课的女学生姓名
5)检索 WANG同学不学的课程的课程号
6)检索至少选修两门课的学生学号
7)检索全部学生都选修的课程的课程号与课程名
8)检索选修课程包含 LIU老师所授全部课程的学生学号小结
关系代数运算
关系代数运算并,差,交,笛卡尔积,投影,选择,连接,除
基本运算并,差,笛卡尔积,投影,选择
交,连接,除可以用 5种基本运算来表达引进它们并不增加语言的能力,但可以简化表达小结 (续 )
关系代数表达式
关系代数运算经有限次复合后形成的式子
典型关系代数语言
ISBL( Information System Base Language)
由 IBM United Kingdom研究中心研制
用于 PRTV( Peterlee Relational Test Vehicle)
实验系统
( 2),检索不学 C2课的学生姓名,,决不能用下式表示:
πSNAME,AGE( σC#≠'C2'( S?SC))
一定要用,差,的形式:
πSNAME,AGE( S) - πSNAME,AGE( σC#='C2'( S?SC))
( 3),检索学习全部课程的学生学号,,要用
πS#,C#( SC) ÷ πC#( C) 表示,
而不能写成 πS# ( SC÷ πC#( C))形式。 这是因为一个学生学的课程的成绩可能是不一样的。
关系代数的几个扩充操作
改名,ρ s( R)
广义投影,∏S#,Grade*1.05(σC#=?C4‘(SC))
外连接( outer join)
A B C
a b c
b b f
c a d
R
B C D
b c d
b c e
a d b
e f g
S
A B C D
a b c d
a b c e
c a d b
A B C D
a b c d
a b c e
c a d b
b b f null
A B C D
a b c d
a b c e
c a d b
null e f g
SR
R RS S
A B C D
a b c d
a b c e
c a d b
b b f null
null e f g
SR
外部并( outer union)
A B C D
a b c null
b b f null
c a d null
null b c d
null b c e
null a d b
null e f g
第二章 关系数据库
2.1 关系模型概述
2.2 关系数据结构
2.3 关系的完整性
2.4 关系代数
2.5 关系演算
2.6 小结
2.5 关系演算
关系演算以数理 逻辑 中的谓词演算为基础
种类:按谓词变元不同分类
1.元组关系演算:
以 元组变量 作为谓词变元的基本对象元组关系演算语言 ALPHA
2.域关系演算:
以 域变量 作为谓词变元的基本对象域关系演算语言 QBE
在元组关系演算 ( Tuple Relational Calculus) 中,元组关系演算表达式简称为元组表达式,其一般形式为
{ t | P( t) }
其中,t是元组变量,表示一个元数固定的元组; P是公式,在数理逻辑中也称为谓词,也就是计算机语言中的条件表达式。
{ t | P( t) }表示:满足公式 P的所有元组 t的集合。
元组 关系演算元组关系演算 (4)
( a)、( b)是关系 R和 S,( c)~( g)分别是下面五个元组表达式的值
A B C A B C A B C A B C
1 2 3 1 2 3 3 4 6 4 5 6
4 5 6 3 4 6 5 6 9 7 8 9
7 8 9 5 6 9
( a )关系 R ( b )关系 S ( c ) R1 ( d ) R2
A B C A B C R.B S,C R.A
1 2 3 4 5 6 5 3 4
3 4 6 7 8 9 8 3 7
8 6 7
8 9 7
( e ) R3 ( f ) R4 ( g ) R5
元组关系演算的例子
R1 = { t | S( t) ∧ t[1]>2 }
R2 = { t | R( t) ∧┐ S( t) }
R3 = { t |(?u) ( S( t) ∧ R( u) ∧ t[3]<u[2]}}
R4 = { t |(?u) ( R( t) ∧ S( u) ∧ t[3]>u[1]) }
R5 = { t |(?u)(?v)( R
( u) ∧ S( v)
∧ u[1]>v[2]∧t[1]=u[2]∧t
[2]=v[3]∧t[3]=u[1] ) }
元组关系演算
关系代数表达式到元组表达式的转换例
R∪ S可用 { t | R( t) ∨ S( t) }表示;
R-S可用 { t | R( t) ∧┐ S( t) }表示;
R× S可用 { t |(?u) (?v) ( R( u) ∧ S(V) ∧ t[1]=u[1]
∧ t[2]=u[2]∧ t[3]=u[3]∧ t[4]=v[1] ∧ t[5]=v[2] ∧ t[6]=v[3]) }
表示 。
设 投影 操作是 π2,3( R),那么元组表达式可写成:
{ t |(?u)( R( u) ∧ t[l]=u[2]∧ t[2]=u[3]) }
选择 σF( R)可用 { t |R(t)∧ F'}表示,F'是 F的等价表示形式。譬如
σ2='d'( R)可写成 { t |( R( t) ∧ t[2]='d')。
2.5.1 元组关系演算语言 ALPHA
由 E.F.Codd提出
INGRES所用的 QUEL语言是参照 ALPHA语言研制的
语句检索语句
GET
更新语句
PUT,HOLD,UPDATE,DELETE,DROP
一、检索操作
语句格式:
GET 工作空间名 [( 定额 ) ]( 表达式 1)
[,操作条件 ] [DOWN/UP 表达式 2]
定额:规定检索的元组个数
格式,数字表达式 1:指定语句的操作对象
格式:
关系名 | 关系名,属性名 | 元组变量,属性名 | 集函数 [,… ]
操作条件:将操作结果限定在满足条件的元组中
格式,逻辑表达式表达式 2:指定排序方式
格式,关系名,属性名 | 元组变量,属性名 [,… ]
检索操作 (续 )
(1) 简单检索 (即不带条件的检索 )
(2) 限定的检索 (即带条件的检索 )
(3) 带排序的检索
(4) 带定额的检索
(5) 用元组变量的检索
(6) 用存在量词的检索检索操作 (续 )
(7) 带有多个关系的表达式的检索
(8) 用全称量词的检索
(9) 用两种量词的检索
(10) 用蕴函 ( Implication) 的检索
(11) 集函数
( 1)简单检索
GET 工作空间名 ( 表达式 1)
[例 1] 查询所有被选修的课程号码 。
GET W (SC.Cno)
[例 2] 查询所有学生的数据 。
GET W (Student)
( 2)限定的检索格式
GET 工作空间名 ( 表达式 1),操作条件
[例 3] 查询信息系 (IS)中年龄小于 20岁的学生的学号和年龄 。
GET W (Student.Sno,Student.Sage):
Student.Sdept='IS'∧ Student.Sage<20
( 3)带排序的检索格式
GET 工作空间名 ( 表达式 1) [,操作条件 ]
DOWN/UP 表达式 2
[例 4] 查询计算机科学系 (CS)学生的学号,年龄,结果按年龄降序排序 。
GET W (Student.Sno,Student.Sage):
Student.Sdept='CS?DOWN Student.Sage
( 4)带定额的检索格式,GET 工作空间名 ( 定额 ) ( 表达式 1)
[,操作条件 ] [DOWN/UP 表达式 2]
[例 5] 取出一个信息系学生的学号。
GET W (1) (Student.Sno):
Student.Sdept='IS'
[例 6] 查询信息系年龄最大的三个学生的学号及其年龄,结果按年龄降序排序。
GET W (3) (Student.Sno,Student.Sage):
Student.Sdept='IS' DOWN Student.Sage
( 5)用 元组变量 的检索
元组变量的含义
表示可以在某一关系范围内变化 ( 也称为范围变量 Range Variable)
元组变量的用途
① 简化关系名:设一个较短名字的元组变量来代替较长的关系名 。
② 操作条件中使用 量词 时 必须 用元组变量 。
定义元组变量
格式,RANGE 关系名 变量名
一个关系可以设多个元组变量
(6) 用 存在量词 的检索
[例 8] 查询选修 2号课程的学生名字 。
RANGE SC X
GET W (Student.Sname),
X(X.Sno=Student.Sno∧ X.Cno='2')
[例 9] 查询选修了这样课程的学生学号,其直接先行课是 6号课程 。
RANGE Course CX
GET W (SC.Sno),
CX (CX.Cno=SC.Cno∧ CX.Pcno='6')
用存在量词的检索 (续 )
[例 10]查询至少选修一门其先行课为 6号课程的学生名字
RANGE Course CX
SC SCX
GET W (Student.Sname),?SCX
(SCX.Sno=Student.Sno∧
CX
(CX.Cno=SCX.Cno∧ CX.Pcno='6'))
前束范式形式:
GET W (Student.Sname),
SCX?CX (SCX.Sno=Student.Sno∧
CX.Cno=SCX.Cno∧ CX.Pcno='6')
( 7)带有多个关系的表达式的检索
[例 11] 查询成绩为 90分以上的学生名字与课程名字 。
RANGE SC SCX
GET W(Student.Sname,Course.Cname):
SCX (SCX.Grade≥90∧
SCX.Sno=Student.Sno∧
Course.Cno=SCX.Cno)
( 8)用全称量词的检索
[例 12] 查询不选 1号课程的学生名字 。
RANGE SC SCX
GET W (Student.Sname),SCX
(SCX.Sno≠Student.Sno∨ SCX.Cno≠'1')
用存在量词表示:
RANGE SC SCX
GET W (Student.Sname),SCX
(SCX.Sno=Student.Sno∧ SCX.Cno='1')
( 9)用两种量词的检索
[例 13] 查询选修了全部课程的学生姓名 。
RANGE Course CX
SC SCX
GET W (Student.Sname):
CX?SCX
(SCX.Sno=Student.Sno∧
SCX.Cno=CX.Cno)
( 10)用蕴函( Implication)的检索
[例 14] 查询最少选修了 95002学生所选课程的学生学号 。
RANGE Couse CX
SC SCX
SC SCY
GET W (Student.Sno),CX(?SCX
(SCX.Sno='95002'∧ SCX.Cno=CX.Cno)
SCY(SCY.Sno=Student.Sno∧
SCY.Cno= CX.Cno))
( 11)集函数常用集函数( Aggregation function)或内部函数( Build-in function)
函 数 名 功 能
COUNT 对元组计数
TOTAL 求 总 和
MAX 求最大值
MIN 求最小值
AVG 求平均值集函数 (续 )
[例 15] 查询学生所在系的数目 。
GET W ( COUNT(Student.Sdept) )
COUNT函数在计数时会自动排除重复值 。
[例 16] 查询信息系学生的平均年龄
GET W (AVG(Student.Sage),
Student.Sdept='IS‘ )
二、更新操作
(1) 修改操作
(2) 插入操作
(3) 删除操作
( 1)修改操作 步骤
① 用 HOLD语句将要修改的元组从数据库中读到工作空间中
HOLD 工作空间名 ( 表达式 1) [,操作条件 ]
HOLD语句是带上并发控制的 GET语句
② 用宿主语言修改工作空间中元组的属性
③ 用 UPDATE语句将修改后的元组送回数据库中
UPDATE 工作空间名修改操作 (续 )
[例 17] 把 95007学生从计算机科学系转到信息系 。
HOLD W (Student.Sno,Student.Sdetp):
Student.Sno='95007'
( 从 Student关系中读出 95007学生的数据 )
MOVE 'IS' TO W.Sdept
( 用宿主语言进行修改 )
UPDATE W
( 把修改后的元组送回 Student关系 )
( 2)插入操作步骤
① 用宿主语言在工作空间中建立新元组
② 用 PUT语句把该元组存入指定关系中
PUT 工作空间名 ( 关系名 )
PUT语句只对一个关系操作插入操作 (续 )
[例 18] 学校新开设了一门 2学分的课程,计算机组织与结构,,其课程号为 8,直接先行课为 6
号课程 。 插入该课程元组
MOVE '8' TO W.Cno
MOVE '计算机组织与结构 ' TO W.Cname
MOVE '6' TO W.Cpno
MOVE '2' TO W.Ccredit
PUT W (Course)
( 3)删除操作
① 用 HOLD语句把要删除的元组从数据库中读到工作空间中
② 用 DELETE语句删除该元组
DELETE 工作空间名删除操作 (续 )
[例 19] 95110学生因故退学,删除该学生元组 。
HOLD W (Student),Student.Sno='95110'
DELETE W
删除操作 (续 )
[例 20] 将学号 95001改为 95102。
HOLD W (Student),Student.Sno='95001'
DELETE W
MOVE '95102' TO W.Sno
MOVE '李勇 ' TO W.Sname
MOVE '男 ' O W.Ssex
MOVE '20' TO W.Sage
MOVE 'CS' TO W.Sdept
PUT W (Student)
删除操作 (续 )
[例 21] 删除全部学生 。
HOLD W (SC)
DELETE W
HOLD W (Student)
DELETE W
在删除操作中保持参照完整性小结:元组关系演算语言 ALPHA
检索操作 GET
GET 工作空间名 [( 定额 ) ]( 表达式 1)
[,操作条件 ] [DOWN/UP 表达式 2]
插入操作
建立新元组 --PUT
修改操作
HOLD--修改 --UPDATE
删除操作
HOLD--DELETE
2.5 关 系 演 算
2.5.1 元组关系演算语言 ALPHA
2.5.2 域关系演算语言 QBE
域关系演算 (1)
域演算表达式是形为
{ t1… tk∣P ( t1,…,tk)}
的表达式,其中 P( t1,…,tk) 是关于自由域变量 t1,…,tk 的公式 。
原子公式有两种形式:
⑴ R( x1… xk) ;
⑵ xθ y。
公式中也可使用 ∧,∨,┐ 和?等逻辑运算符,(?x)和 (?x),但变量 x是域变量,不是元组变量 。
域关系演算 (2)
例 2.20 图 2.21的 ( a),( b),( c) 是三个关系 R,S,W,
( d),( e),( f) 分别表示下面三个域表达式的值 。
( a) 关系 R ( b) 关系 S ( c) 关系 W ( d) R1 ( e) R2 ( f) R3
图 2.21 域关系演算的例子
A B C A B C D E A B C A B C B D A
1 2 3 1 2 3 7 5 4 5 6 1 2 3 5 7 4
4 5 6 3 4 6 4 8 4 5 6 8 7 7
7 8 9 5 6 9 7 8 9 8 4 7
3 4 6
R1={ xyz| R( xyz) ∧ x<5 ∧ y>3 }
R2={ xyz| R( xyz) ∨ ( S( xyz) ∧ y = 4)
}
R3={ xyz|(?u)(?v)( R( zxu) ∧ w( yv
) ∧ u>v ) }
2.5.2 域关系演算语言 QBE
一种典型的域关系演算 语言
由 M.M.Zloof提出
1978年在 IBM370上得以实现
QBE也指 此关系数据库管理 系统
QBE,Query By Example
基于屏幕表格的查询语言
查询要求:以填写表格的方式构造查询
用示例元素 (域变量 )来表示查询结果可能的情况
查询结果:以表格形式显示
QBE操作框架关系名 属性名操作命令 元组属性值或查询条件或操作命令一、检索操作
( 1) 用户提出要求;
( 2) 屏幕显示空白表格;
( 3) 用户在最左边一栏输入要查询的关系名,
例如 Student;
Student
检索操作(续)
( 4)系统显示该关系的属性名
( 5)用户在上面构造查询要求
Student Sno Sname Ssex Sage Sdept
P,T C
Student Sno Sname Ssex Sage Sdept
检索操作(续)
( 6)屏幕显示查询结果
Student Sno Sname Ssex Sage Sdept
李勇张立
C
构造查询的几个要素
示例元素 即域变量 一定要加下划线示例元素是这个域中可能的一个值,它不必是查询结果中的元素
打印操作符 P,指定查询结果所含属性列
查询条件 不用加下划线可使用比较运算符>,≥,<,≤,=和 ≠
其中=可以省略
排序要求
1,简单查询
[例 1] 查询全体学生的全部数据 。
Student Sno Sname Ssex Sage Sdept
P.95001 P,李勇 P.男 P.20 P.CS
简单查询(续)
显示全部数据也可以简单地把 P.操作符作用在关系名上 。
Student Sno Sname Ssex Sage Sdept
P.
2,条件查询
(1) 简单条件
[例 2] 求信息系全体学生的姓名 。
Student Sno Sname Ssex Sage Sdept
P,李勇 IS
条件查询(续)
[例 3] 求年龄大于 19岁的学生的学号 。
Student Sno Sname Ssex Sage Sdept
P.95001 >19
条件查询(与条件)
[例 4] 求计算机科学系年龄大于 19岁的学生的学号 。
方法 ( 1),把两个条件写在同一行上
Student Sno Sname Ssex Sage Sdept
P.95001 >19 CS
条件查询(续)
方法 ( 2),把两个条件写在不同行上,但使用相同的示例元素值
Student Sno Sname Ssex Sage Sdept
P.95001
P.95001 >19
CS
条件查询(续)
[例 5] 查询既选修了 1号课程又选修了 2号课程的学生的学号 。
SC Sno Cno Grade
P.95001
P.95001
1
2
条件查询(续)
[例 6] 查询计算机科学系或者年龄大于 19岁的学生的学号 。
Student Sno Sname Ssex Sage Sdept
P.95001
P.95002 >19
CS
多表连接
[例 7] 查询选修 1号课程的学生姓名 。
注意:示例元素 Sno是连接属性,其值在两个表中要 相同 。
SC Sno Cno Grade
95001 1
Student Sno Sname Ssex Sage Sdept
95001 P.李勇条件查询(非条件)
[例 8] 查询未选修 1号课程的学生姓名思路:显示学号为 95001的学生名字,而该学生选修 1
号课程的情况为假
SC Sno Cno Grade
95001 1?
Student Sno Sname Ssex Sage Sdept
95001 P.李勇条件查询(续)
[例 9] 查询有两个人以上选修的课程号思路:查询这样的课程 1,它不仅被 95001选修而且也被另一个学生 (?95001) 选修了
SC Sno Cno Grade
95001
.95001
P.1
1
3,集函数常用集函数:
函 数 名 功 能
CNT 对元组计数
SUM 求 总 和
AVG 求平均值
MAX 求最大值
MIN 求最小值集函数(续)
[例 10] 查询信息系学生的平均年龄 。
Student Sno Sname Ssex Sage Sdept
P.AVG.ALL,IS
4.对查询结果排序 (续)
[例 11] 查全体男生的姓名,要求查询结果按所在系升序排序,对相同系的学生按年龄降序排序 。
Student Sno Sname Ssex Sage Sdept
P.李勇 男 DO( 2),AO( 1),
二、修改操作
[例 12] 把 95001学生的年龄改为 18岁 。
方法 (1),将操作符,U.‖放在值上
Student Sno Sname Ssex Sage Sdept
95001 U,18
修改操作 (续 )
方法 (2),将操作符,U.‖放在关系上码 95001标明要修改的元组 。,U.‖标明所在的行是修改后的新值 。
由于主码是不能修改的,所以系统不会混淆要修改的属性 。
Student Sno Sname Ssex Sage Sdept
U,95001 18
修改操作 (续 )
[例 13]将计算机系所有学生的年龄都改为 18岁
Student Sno Sname Ssex Sage Sdept
95008 U.18 CS
修改操作 (续 )
[例 14] 把 95001学生的年龄增加 1岁分两行分别表示改前和改后的示例元素必须将操作符,U.‖放在关系上
Student Sno Sname Ssex Sage Sdept
U.
95001
95001
17
17+1
修改操作 (续 )
[例 15] 将计算机系所有学生的年龄都增加 1岁
Student Sno Sname Ssex Sage Sdept
U.
95008
95008
18
18+1
CS
2.插入操作
[例 16] 把信息系女生 95701,姓名张三,年龄 17
岁存入数据库中 。
Student Sno Sname Ssex Sage Sdept
I,95701 张三 女 17 IS
3,删除操作
[例 17] 删除学生 95089
为保证参照完整性,删除 95089学生前,先删除 95089学生选修的全部课程
Student Sno Sname Ssex Sage Sdept
D,95089
SC Sno Cno Grade
D,95089
本章小结
2.1 关系模型概述
2.2 关系数据结构
2.3 关系的完整性
2.4 关系代数
2.5 关系演算
2.6 小结数据库系统概论
An Introduction to Database System
第三章 关系数据库标准语言 SQL
第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7 嵌入式 SQL
3.8 小结
SQL的产生与发展
1970年,美国 IBM研究中心的 E.F.Codd连续发表多篇论文,提出关系模型。
1972年,IBM公司开始研制实验型关系数据库管理系统 SYSTEM R,配制的查询语言称为 SQUARE
(Specifying Queries As Relational Expression )语言,在语言中使用了较多的数学符号。
1974年,Boyce和 Chamberlin把 SQUARE修改为
SEQUEL (Structured English QUEry Language )语言。
后来 SEQUEL简称为 SQL (Structured Query Language ),
即,结构式查询语言,,SQL的发音仍为,sequel‖。
现在 SQL已经成为一个标准 。
SQL数据库的体系结构用户 1 用户 2 用户 3 用户 4
视图 1 视图 1
基本表 1 基本表 2 基本表 3 基本表 4
存储文件 1 存储文件 2 存储文件 3 存储文件 4
图 3.1 SQL数据库的体系结构
SQL用户
View
Base
table
Stored
file
3.1 SQL概述
SQL的特点
1,综合统一
2,高度非过程化
3,面向集合的操作方式
4,以同一种语法结构提供两种使用方法
5,语言简洁,易学易用
1,综合统一,
SQL语言综合:数据定义语言 DDL、数据操纵语言 DML、数据控制语言 DCL
2、高度非过程化
,怎么做,
,做什么,
减轻了用户的负担,有利于提高数据独立性
3、面向集合的操作方式
非关系数据模型:面向记录
SQL:集合操作
4、以同一种语法结构提供两种使用方式
既可 联机交互 操作,
也可以嵌入到 高级语言 中去
5,语言简捷,易学易用表 3,1 S Q L 语言的动词
S Q L 功 能 动 词数 据 定 义 C R E A T E,D R O P,A L T E R
数 据 查 询 S E L E C T
数 据 操 纵 I N S E R T,U P D A T E
D E L E T E
数 据 控 制 G R A N T,R E V O K E
第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7 嵌入式 SQL
3.8 小结
SQL模式(数据库)的创建和撤销
SQL模式的创建可用 CREATE SCHEMA语句定义,其基本句法如下:
CREATE SCHEMA〈 模式名 〉
AUTHORIZATION〈 用户名 〉
删除,DROP语句的句法如下:
DROP SCHEMA〈 模式名 〉
[ CASCADE│RESTRICT]
其方式有两种:
CASCADE (级联式 )方式 。
RESTRICT (约束式 )方式。
3.2 数 据 定 义表 3,2 S Q L 的数据定义语句操 作 方 式操 作 对象创 建 删 除 修 改表 C R E A T E
T A B L E
D R O P
T A B L E
A L T E R
T A B L E
视 图 C R E A T E
V I E W
D R O P V I E W
索 引 C R E A T E
I N D E X
D R O P
I N D E X
3.2.1 定义 语句格式
CREATE TABLE <表名 >
( <列名 > <数据类型 >[ <列级完整性约束条件 > ]
[,<列名 > <数据类型 >[ <列级完整性约束条件 >] ] …
[,<表级完整性约束条件 > ] ) ;
<表名 >:所要定义的基本表的名字
<列名 >:组成该表的各个属性 ( 列 )
<列级完整性约束条件 >:涉及相应属性列的完整性约束条件
<表级完整性约束条件 >:涉及一个或多个属性列的完整性约束条件例题
[例 1] 建立一个,学生,表 Student,它由学号
Sno,姓名 Sname,性别 Ssex,年龄 Sage,所在系 Sdept五个属性组成 。 其中学号不能为空,
值是唯一的,并且姓名取值也唯一 。
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE,
Sname CHAR(20) UNIQUE,
Ssex CHAR(1),
Sage INT,
Sdept CHAR(15));
例题 (续)
Sno S n a m e S s e x S a g e S d e p t
↑ ↑ ↑ ↑ ↑
字符型 字符型 字符型 整数 字符型长度为 5 长度为 20 长度为 1 长度为 15
不能为空值定义基本表(续)
常用完整性约束
主码约束,PRIMARY KEY
唯一性约束,UNIQUE
非空值约束,NOT NULL
参照完整性约束,FOREIGN KEY
PRIMARY KEY与 UNIQUE的区别?
Primary key在建立的时候会默认地建立此 field的索引,且此 primary key可以作为作为另外的表的 foreign key,
再者 primary key跟 unique得 区别 是
Primary key 一定是 not null,而
unique则没有此限制
[例 2] 建立一个,课程,表 C,它由课程号 Cno,课程名称 Cname,教师 Teacher
组成,其中 Cno为主码。
CREATE TABLE C(
Cno CHAR(5),
Cname CHAR(10),
Teacher CHAR(10),
Primary key (Cno));
例题 (续)
[例 3] 建立一个,学生选课,表 SC,它由学号
Sno、课程号 Cno,修课成绩 Grade组成,其中
(Sno,Cno)为主码。
CREATE TABLE SC(
Sno CHAR(5),
Cno CHAR(3),
Grade int,
Primary key (Sno,Cno),
FOREIGN KEY(Sno) REFERENCES S(Sno),
FOREIGN KEY(Cno) REFERENCES C(Cno)
);
基本数据类型
(1)数值型( DB2)
SMALLINT 半字长二进制整数
INTEGER 全字长二进制整数
DECIMAL(P[,q])或者 DEC( p[,q])
压缩十进制数,共 p位,其中小数点后 q位
FLOAT 双字长浮点数
( 2)字符串型
CHARTER(n)或 CHAR(n)
VARCHAR(n)
(3)时间型
DATE
TIME
(4)位串型
BIT( n)
回顾
CREATE TABLE <表名 >
( <列名 > <数据类型 >[ <列级完整性约束条件 > ]
[,<列名 > <数据类型 >[ <列级完整性约束条件 >] ] …
[,<表级完整性约束条件 > ] ) ;
<表名 >:所要定义的基本表的名字
<列名 >:组成该表的各个属性 ( 列 )
<列级完整性约束条件 >:涉及相应属性列的完整性约束条件
<表级完整性约束条件 >:涉及一个或多个属性列的完整性约束条件表 3,2 S Q L 的数据定义语句操 作 方 式操 作 对象创 建 删 除 修 改表 C R E A T E
T A B L E
D R O P
T A B L E
A L T E R
T A B L E
视 图 C R E A T E
V I E W
D R O P V I E W
索 引 C R E A T E
I N D E X
D R O P
I N D E X
二、修改基本表
ALTER TABLE <表名 >
[ ADD <新列名 > <数据类型 > [ 完整性约束 ] ]
[ DROP <完整性约束名 > ]
[ MODIFY <列名 > <数据类型 > ];
<表名 >,要修改的基本表
ADD子句,增加新列和新的完整性约束条件
DROP子句,删除指定的完整性约束条件
MODIFY子句,用于修改列名和数据类型例题
[例 2] 向 Student表增加,入学时间,列,其数据类型为日期型 。
ALTER TABLE Student ADD Scome DATE;
不论基本表中原来是否已有数据,新增加的列一律为空值 。
[例 3] 将年龄的数据类型改为半字长整数。
ALTER TABLE Student MODIFY Sage SMALLINT;
注:修改原有的列定义有可能会破坏已有数据例题
[例 4] 删除学生姓名必须取唯一值的约束 。
ALTER TABLE Student DROP UNIQUE(Sname);
语句格式(续)
删除属性列直接 /间接删除
把表中要保留的列及其内容复制到一个新表中
删除原表
再将新表重命名为原表名直接删除属性列,(新 )
例,ALTER TABLE Student Drop Scome;
ALTER TABLE Student Drop COLUMN Sdept ;(sql server)
3.2 数 据 定 义表 3,2 S Q L 的数据定义语句操 作 方 式操 作 对象创 建 删 除 修 改表 C R E A T E
T A B L E
D R O P
T A B L E
A L T E R
T A B L E
视 图 C R E A T E
V I E W
D R O P V I E W
索 引 C R E A T E
I N D E X
D R O P
I N D E X
三、删除基本表
DROP TABLE <表名 >;
基本表删除后,数据,表上的视图,索引都删除 。
有的系统如 ORACLE,基本表删除后,在表上的视图往往仍然保留,但无法引用 。
例题
[例 5] 删除 Student表
DROP TABLE Student ;
3.2.2 建立与删除索引
建立索引是加快查询速度的有效手段
建立索引
DBA或表的属主 ( 即建立表的人 ) 根据需要建立
有些 DBMS自动建立以下列上的索引
PRIMARY KEY
UNIQUE
维护索引
DBMS自动完成
使用索引
DBMS自动选择是否使用索引以及使用哪些索引
在 SQL86和 SQL89标准中,基本表没有关键码概念,可以用 索引 机制来弥补。
索引属于物理存储的路径概念,而不是逻辑的概念。
在定义基本表时,还要定义索引,就把数据库的物理结构和逻辑结构混在一块了。
因此在 SQL2中引入了主码(主键)的概念,用户在创建基本表时用主码子句
Primary key直接定义主码。
但至今大多数 DBMS仍使用索引机制,有索引创建和撤销语句,其功能仅限于查询时起作用。
一、建立索引
语句格式
CREATE [UNIQUE] [CLUSTER] INDEX <索引名 > ON
<表名 >(<列名 >[<次序 >][,<列名 >[<次序 >] ]…);
用 <表名 >指定要建索引的基本表名字
索引可以建立在该表的一 列 或多列上,各列名之间用逗号分隔
用 <次序 >指定索引值的排列次序,升序,ASC,降序:
DESC。 缺省值,ASC
UNIQUE表明此索引的每一个索引值只对应唯一的数据记录
CLUSTER表示要建立的索引是聚簇索引
CREATE [UNIQUE] [CLUSTER]
INDEX <索引名 >
ON <表名 >
(<列名 >[<次序 >]
[,<列名 >[<次序 >] ]…);
例题
[例 6] 为学生 -课程数据库中的 Student,Course,SC
三个表建立索引 。 其中 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);
建立索引 (续)
唯一值索引
对于已含重复值的属性列不能建 UNIQUE索引
对某个列建立 UNIQUE索引后,插入新记录时
DBMS会自动检查新记录在该列上是否取了重复值 。 这相当于增加了一个 UNIQUE约束建立索引 (续)
聚簇索引
建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放 。 也即聚簇索引的索引项顺序与表中记录的物理顺序一致例:
CREATE CLUSTER INDEX Stusname ON
Student(Sname);
在 Student表的 Sname( 姓名 ) 列上建立一个聚簇索引,而且 Student表中的记录将按照 Sname值的升序存放建立索引 (续)
在一个基本表上最多只能建立一个聚簇索引
聚簇索引的用途:对于某些类型的查询,可以提高查询效率
聚簇索引的适用范围
很少对基表进行增删操作
很少对其中的变长列进行修改操作二、删除索引
DROP INDEX <索引名 >;
删除索引时,系统会从数据字典中删去有关该索引的描述。
[例 7] 删除 Student表的 Stusname索引。
DROP INDEX Stusname;
索引一经建立,就由系统来维护它,不需要用户干预。建立索引减少查询操作的时间,但如果数据增加删改频繁,系统会花费许多时间来维护索引。所以,这时需要删除一些不必要的索引。
3.3 查 询
3.3.1 概述
3.3.2 单表查询
3.3.3 连接查询
3.3.4 嵌套查询
3.3.5 集合查询
3.3.6 小结
3.3.1 概述
语句格式
SELECT [ALL|DISTINCT] <目标列表达式 >
[,<目标列表达式
>] …
FROM <表名或视图名 >[,<表名或视图名 > ] …
[ WHERE <条件表达式 > ]
[ GROUP BY <列名 1> [ HAVING <条件表达式 > ] ]
[ ORDER BY <列名 2> [ ASC|DESC ] ];
语句格式
SELECT子句,指定要显示的属性列
FROM子句,指定查询对象 (基本表或视图 )
WHERE子句,指定查询条件
GROUP BY子句,对查询结果按指定列的值分组,
该属性列值相等的元组为一个组 。 通常会在每组中作用集函数 。
HAVING短语,筛选出只有满足指定条件的组
ORDER BY子句,对查询结果表按指定列值的升序或降序排序
SELECT查询语句 (1)
SELECT—FROM—WHERE句型在关系代数中最常用的式子是下列表达式:
πA1,…,An(σF(R1× … × Rm))
这里 R1,…,Rm为关系,F是公式,A1,…,An为属性 。
针对上述表达式,SQL为此设计了 SELECT—FROM—
WHERE句型:
SELECT A1,…,An
FROM R1,…,Rm
WHERE F
这个句型是从关系代数表达式演变来的,但 WHERE子句中的条件表达式 F要比关系代数中公式更灵活 。
示例数据库学生 -课程数据库
学生表,Student(Sno,Sname,Ssex,Sage,Sdept)
课程表,Course(Cno,Cname,Cpno,Ccredit)
学生选课表,SC(Sno,Cno,Grade)
5,语言简捷,易学易用表 3,1 S Q L 语言的动词
S Q L 功 能 动 词数 据 定 义 C R E A T E,D R O P,A L T E R
数 据 查 询 S E L E C T
数 据 操 纵 I N S E R T,U P D A T E
D E L E T E
数 据 控 制 G R A N T,R E V O K E
3.3 查 询
3.3.1 概述
3.3.2 单表查询
3.3.3 连接查询
3.3.4 嵌套查询
3.3.5 集合查询
3.3.6 小结
SELECT查询语句 (1)
SELECT—FROM—WHERE句型在关系代数中最常用的式子是下列表达式:
πA1,…,An(σF(R1× … × Rm))
这里 R1,…,Rm为关系,F是公式,A1,…,An为属性 。
针对上述表达式,SQL为此设计了 SELECT—FROM—
WHERE句型:
SELECT A1,…,An
FROM R1,…,Rm
WHERE F
这个句型是从关系代数表达式演变来的,但 WHERE子句中的条件表达式 F要比关系代数中公式更灵活 。
SELECT语句完整的句法 (1)
语句格式
SELECT [ALL|DISTINCT] <目标列表达式 >
[,<目标列表达式 >] …
FROM <表名或视图名 >[,<表名或视图名 > ] …
[ WHERE <条件表达式 > ]
[ GROUP BY <列名 1> [ HAVING <条件表达式 > ] ]
[ ORDER BY <列名 2> [ ASC|DESC ] ];
语句格式
SELECT子句,指定要显示的属性列
FROM子句,指定查询对象 (基本表或视图 )
WHERE子句,指定查询条件
GROUP BY子句,对查询结果按指定列的值分组,
该属性列值相等的元组为一个组 。 通常会在每组中作用集函数 。
HAVING短语,筛选出只有满足指定条件的组
ORDER BY子句,对查询结果表按指定列值的升序或降序排序示例数据库学生 -课程数据库
学生表,Student(Sno,Sname,Ssex,Sage,Sdept)
课程表,Course(Cno,Cname,Cpno,Ccredit)
学生选课表,SC(Sno,Cno,Grade)
3.3.2 单表查询查询仅涉及一个表,是一种最简单的查询操作一,选择表中的若干列二,选择表中的若干元组三,对查询结果排序四,使用集函数五、对查询结果分组
SELECT语句完整的句法
语句格式
SELECT [ALL|DISTINCT] <目标列表达式 >
[,<目标列表达式 >] …
FROM <表名或视图名 >[,<表名或视图名 > ] …
[ WHERE <条件表达式 > ]
[ GROUP BY <列名 1> [ HAVING <条件表达式 > ] ]
[ ORDER BY <列名 2> [ ASC|DESC ] ];
查询指定列
[例 1] 查询全体学生的学号与姓名 。
SELECT Sno,Sname
FROM Student;
[例 2] 查询全体学生的姓名,学号,所在系 。
SELECT Sname,Sno,Sdept
FROM Student;
查询全部列
[例 3] 查询全体学生的详细记录 。
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
或
SELECT *
FROM Student;
3,查询经过计算的值
SELECT子句的 <目标列表达式 >为表达式
算术表达式
字符串常量
函数,
列别名
等
3,查询经过计算的值
[例 4] 查全体学生的姓名及其出生年份 。
SELECT Sname,2000-Sage
FROM Student;
输出结果:
Sname 2000-Sage
--------- -------------
李勇 1976
刘晨 1977
王名 1978
张立 1978
3,查询经过计算的值
[例 5] 查询全体学生的姓名,出生年份和所有系,要求用小写字母表示所有系名 。
SELECT Sname,'Year of Birth,',2000-Sage,
ISLOWER(Sdept)
FROM Student;
例题(续)
输出结果:
Sname 'Year of Birth:' 2000-Sage ISLOWER(Sdept)
------- ---------------- --------- --------------
李勇 Year of Birth,1976 cs
刘晨 Year of Birth,1977 is
王名 Year of Birth,1978 ma
张立 Year of Birth,1977 is
[例 5.1] 使用列 别名 改变查询结果的列标题
SELECT Sname NAME,'Year of Birth,’ BIRTH,
2000-Sage BIRTHDAY,ISLOWER(Sdept) DEPARTMENT
FROM Student;
输出结果:
NAME BIRTH BIRTHDAY DEPARTMENT------- ---------------- ------------- ------------------
李勇 Year of Birth,1976 cs
刘晨 Year of Birth,1977 is
王名 Year of Birth,1978 ma
张立 Year of Birth,1977 is
二、选择表中的若干元组 –投影
消除取值重复的行
查询满足条件的元组
1,消除取值重复的行
在 SELECT子句中使用 DISTINCT短语假设 SC表中有下列数据
Sno Cno Grade
------- ------- -------
95001 1 92
95001 2 85
95001 3 88
95002 2 90
95002 3 80
ALL 与 DISTINCT
[例 6] 查询选修了课程的学生学号 。
(1) SELECT Sno
FROM SC;
或 (默认 ALL)
SELECT ALL Sno
FROM SC;
结果,Sno
-------
95001
95001
95001
95002
95002
例题(续)
(2) SELECT DISTINCT Sno
FROM SC;
结果:
Sno
-------
95001
95002
例题(续)
注意 DISTINCT短语的作用范围是所有目标列例:查询选修课程的各种成绩错误的写法
SELECT DISTINCT Cno,DISTINCT Grade
FROM SC;
正确的写法
SELECT DISTINCT Cno,Grade
FROM SC;
2.查询满足条件的元组表 3.3 常用的查询条件查 询 条 件 谓 词比 较
=,>,<,>=,<=,!=,<>,!>,!< ;
N O T + 上述比较运算符确定范围 B E T W E E N A N D,N O T B E T W E E N A N D
确定集合 IN,N O T I N
字符匹配 L I K E,N O T L I K E
空 值 I S N U L L,I S N O T N U L L
多重条件 AND,OR
WHERE子句常用的查询条件
(1) 比较大小在 WHERE子句的 <比较条件 >中使用比较运算符
=,>,<,>=,<=,!= 或 <>,!>,!<,
逻辑运算符 NOT + 比较运算符
[例 8] 查询所有年龄在 20岁以下的学生姓名及其年龄。
SELECT Sname,Sage
FROM Student
WHERE Sage < 20; 或
SELECT Sname,Sage
FROM Student
WHERE NOT Sage >= 20;
(2) 确定范围
使用谓词 BETWEEN … AND …
NOT BETWEEN … AND …
[例 10] 查询年龄在 20~23岁(包括 20岁和 23岁)之间的学生的姓名、系别和年龄 。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
例题(续)
[例 11] 查询年龄不在 20~23岁之间的学生姓名,
系别和年龄 。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
(3) 确定集合使用谓词 IN <值表 >,NOT IN <值表 >
<值表 >,用逗号分隔的一组取值
[例 12]查询信息系( IS)、数学系( MA)和计算机科学系( CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( 'IS','MA','CS' );
(3) 确定集合
[例 13]查询既不是信息系,数学系,也不是计算机科学系的学生的姓名和性别 。
SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN ( 'IS','MA','CS' );
(4) 字符串匹配
[NOT] LIKE?<匹配串 >‘ [ESCAPE? <换码字符 >‘]
<匹配串 >:指定匹配模板匹配模板:固定字符串或含通配符的字符串当匹配模板为固定字符串时,
可以用 = 运算符取代 LIKE 谓词用 != 或 < >运算符取代 NOT LIKE 谓词通配符
% (百分号 ) 代表任意长度(长度可以为 0)的字符串
例,a%b表示以 a开头,以 b结尾的任意长度的字符串。如 acb,addgb,ab 等都满足该匹配串
_ (下横线 ) 代表任意单个字符
例,a_b表示以 a开头,以 b结尾的长度为 3的任意字符串。如 acb,afb等都满足该匹配串
ESCAPE 短语:
当用户要查询的字符串本身就含有 %
或 _ 时,要使用 ESCAPE '<换码字符 >'
短语对通配符进行转义。
例题
1) 匹配模板为固定字符串
[例 14] 查询学号为 95001的学生的详细情况 。
SELECT *
FROM Student
WHERE Sno LIKE '95001';
等价于:
SELECT *
FROM Student
WHERE Sno = '95001';
例题(续)
2) 匹配模板为含通配符的字符串
[例 15] 查询所有姓刘学生的姓名、学号和性别。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE?刘 %‘;
例题(续)
匹配模板为含通配符的字符串(续)
[例 16] 查询姓 "欧阳 "且全名为三个汉字的学生的姓名。
SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳 __';
例题(续)
匹配模板为含通配符的字符串(续)
[例 17] 查询名字中第 2个字为 "阳 "字的学生的姓名和学号。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '__阳 %';
例题(续)
匹配模板为含通配符的字符串(续)
[例 18] 查询所有不姓刘的学生姓名。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE '刘 %';
例题(续)
3) 使用换码字符将通配符转义为普通字符
[例 19] 查询 DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design'
ESCAPE '\'
例题(续)
使用换码字符将通配符转义为普通字符 (续 )
[例 20] 查询以 "DB_"开头,且倒数第 3个字符为 i
的课程的详细情况。
SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i_ _' ESCAPE ' \ ';
(5) 涉及空值的查询
使用谓词 IS NULL 或 IS NOT NULL
―IS NULL‖ 不能用,= NULL‖ 代替
[例 21] 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;
例题 (续 )
[例 22] 查所有有成绩的学生学号和课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
(6) 多重条件查询用逻辑运算符 AND和 OR来联结多个查询条件
AND的优先级高于 OR
可以用括号改变优先级可用来实现多种其他谓词
[NOT] IN
[NOT] BETWEEN … AND …
例题
[例 23] 查询计算机系年龄在 20岁以下的学生姓名。
SELECT Sname
FROM Student
WHERE Sdept= 'CS' AND Sage<20;
改写 [例 12]
[例 12] 查询信息系( IS)、数学系( MA)和计算机科学系
( CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( 'IS','MA','CS' )
可改写为:
SELECT Sname,Ssex
FROM Student
WHERE Sdept= ' IS ' OR Sdept= ' MA' OR Sdept= ' CS ';
改写 [例 10]
[例 10] 查询年龄在 20~23岁(包括 20岁和 23岁)
之间的学生的姓名、系别和年龄 。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
可改写为:
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage>=20 AND Sage<=23;
SELECT语句完整的句法
SELECT [ALL|DISTINCT] <目标列表达式 >
[,<目标列表达式 >] …
FROM <表名或视图名 >[,<表名或视图名 > ] …
[ WHERE <条件表达式 > ]
[ ORDER BY <列名 1> [ ASC|DESC ] ];
[ GROUP BY <列名 2> [ HAVING <条件表达式 > ] ]
表 3.3 常用的查询条件查 询 条 件 谓 词比 较
=,>,<,>=,<=,!=,<>,!>,!< ;
N O T + 上述比较运算符确定范围 B E T W E E N A N D,N O T B E T W E E N A N D
确定集合 IN,N O T I N
字符匹配 L I K E,N O T L I K E
空 值 I S N U L L,I S N O T N U L L
多重条件 AND,OR
三、对查询结果排序使用 ORDER BY子句
可以按一个或多个属性列排序
升序,ASC;降序,DESC;缺省值为升序当排序列含空值时
ASC:排序列为空值的元组最后显示
DESC:排序列为空值的元组最先显示对查询结果排序(续)
[例 24] 查询选修了 3号课程的学生的学号及其成绩,查询结果按分数降序排列 。
SELECT Sno,Grade
FROM SC
WHERE Cno= ' 3 '
ORDER BY Grade DESC;
查询结果
Sno Grade
------- -------
95010
95024
95007 92
95003 82
95010 82
95009 75
95014 61
95002 55
对查询结果排序(续)
[例 25] 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列 。
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;
四、使用集函数
5类主要集函数
计数
COUNT( [DISTINCT|ALL] *)
COUNT( [DISTINCT|ALL] <列名 >)
计算总和
SUM( [DISTINCT|ALL] <列名 >)
计算平均值
AVG( [DISTINCT|ALL] <列名 >)
使用集函数(续)
求最大值
MAX( [DISTINCT|ALL] <列名 >)
求最小值
MIN( [DISTINCT|ALL] <列名 >)
– DISTINCT短语:在计算时要取消指定列中的重复值
– ALL短语:不取消重复值
– ALL为缺省值使用集函数 (续)
[例 26] 查询学生总人数 。
SELECT COUNT(*)
FROM Student;
[例 27] 查询选修了课程的学生人数 。
SELECT COUNT(DISTINCT Sno)
FROM SC;
注:用 DISTINCT以避免重复计算学生人数使用集函数 (续)
[例 28] 计算 1号课程的学生平均成绩 。
SELECT AVG(Grade)
FROM SC
WHERE Cno= ' 1 ';
[例 29] 查询选修 1号课程的学生最高分数 。
SELECT MAX(Grade)
FROM SC
WHER Cno= ' 1 ';
五、对查询结果分组使用 GROUP BY子句分组细化集函数的作用对象
未对查询结果分组,集函数将作用于整个查询结果
对查询结果分组后,集函数将分别作用于每个组使用 GROUP BY子句分组
[例 30] 求各个课程号及相应的选课人数 。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
结果
Cno COUNT(Sno)
1 22
2 34
3 44
4 33
5 48
对查询结果分组 (续)
GROUP BY子句的作用对象是查询的中间结果表
分组方法:按指定的一列或多列值分组,值相等的为一组
使用 GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数使用 HAVING短语筛选最终输出结果
[例 31] 查询选修了 3门以上课程的学生学号 。
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >3;
例题
[例 32] 查询有 3门以上课程是 90分以上的学生的学号及 ( 90分以上的 ) 课程数
SELECT Sno,COUNT(*)
FROM SC
WHERE Grade>=90
GROUP BY Sno
HAVING COUNT(*)>=3;
使用 HAVING短语筛选最终输出结果
只有满足 HAVING短语指定条件的组才输出
HAVING短语与 WHERE子句的区别:作用对象不同
WHERE子句作用于基表或视图,从中选择满足条件的元组 。
HAVING短语作用于组,从中选择满足条件的组 。
SELECT语句完整的句法 (1)
SELECT语句完整的句法如下:
SELECT 目标表的列名或列表达式序列
FROM 基本表名和 ( 或 ) 视图序列
[ WHERE 行条件表达式 ]
[ GROUP BY 列名序列
[ HAVING 组条件表达式 ]]
[ ORDER BY 列名 [ ASC|DESC ],… ]
SELECT语句完整的句法 (2)
整个语句的执行过程如下:
( 1) 读取 FROM子句中基本表,视图的数据,执行笛卡尔积操作 。
( 2) 选取满足 WHERE子句中给出的条件表达式的元组 。
( 3) 按 GROUP子句中指定列的值分组,同时提取满足
HAVING子句中组条件表达式的那些组 。
( 4) 按 SELECT子句中给出的列名或列表达式求值输出 。
( 5) ORDER子句对输出的目标表进行排序,按附加说明
ASC升序排列,或按 DESC降序排列 。
SELECT语句完整的句法 (3)
例 3.11 对教学数据库的基本表 S,SC,C中数据进行查询和计算 。
① 统计每一年龄选修课程的学生人数
SELECT AGE,COUNT( DISTINCT S.S#)
FROM S,SC
WHERE S.S#=SC.S#
GROUP BY AGE;
由于要统计每一个年龄的学生人数,因此要把满足 WHERE
子句中条件的查询结果按年龄分组,在每一组中的学生年龄相同 。 此时的 SELECT子句应对每一组分开进行操作,在每一组中,年龄只有一个值,统计的人数是这一组中的学生人数 。
SELECT语句完整的句法 (4)
② 求基本表 S中男同学的每一年龄组 ( 超过 50人 ) 有多少人? 要求查询结果按人数升序排列,人数相同按年龄降序排列 。
SELECT AGE,COUNT( S#)
FROM S
WHERE SEX='M'
GROUP BY AGE
HAVING COUNT( *) > 50
ORDER BY 2,AGE DESC;
返回
SELECT语句中的限定 (1)
SELECT子句中的规定
SELECT子句描述查询输出的表格结构,即输出值的列名或表达式 。 其形式如下:
SELECT [ ALL|DISTINCT ] <列名或列表达式序列 > | *
条件表达式中的算术比较操作条件表达式中可出现算术比较运算符 ( <,<=,>,
>=,=,!= ),也可以用,BETWEEN … AND … ‖
比较运算符限定一个值的范围 。
列和基本表的改名操作
SELECT语句中的限定 (2)
字符串的匹配操作条件表达式中字符串匹配操作符是,LIKE‖。 在表达式中可使用两个通配符:
百分号 ( %),与零个或多个字符组成的字符串匹配 。
下划线 ( _),与单个字符匹配 。
集合的并,交,差操作当两个子查询结果的结构完全一致时,可以让这两个子查询执行并、交、差操作。并、交、差的运算符为
UNION,INTERSECT和 EXCEPT。
空值的比较操作
SQL中允许列值为空,空值用保留字 NULL表示。
SELECT语句中的限定 (3)
集合的比较操作
SQL提供 SELECT语句的嵌套子查询机制。子查询是嵌套在另一个查询中的 SELECT语句。
( 1) 集合成员资格的比较
( 2) 集合成员的算术比较
( 3) 空关系的测试
( 4) 重复元组的测试
导出表的使用
SQL2允许在 FROM子句中使用子查询。如果在 FROM
子句中使用了子查询,那么要给子查询的结果起个表名和相应的列名。
返回下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第三章 关系数据库标准语言 SQL
3.3 查 询
3.3.1 概述
3.3.2 单表查询
3.3.3 连接查询
3.3.4 嵌套查询
3.3.5 集合查询
3.3.6 小结
3.3.3 连接查询同时涉及多个表的查询称为连接查询用来连接两个表的条件称为连接条件或连接谓词一般格式:
[<表名 1>.]<列名 1> <比较运算符 > [<表名 2>.]<列名 2>
比较运算符,=,>,<,>=,<=,!=
[<表名 1>.]<列名 1> BETWEEN [<表名 2>.]<列名 2>
AND [<表名 2>.]<列名 3>
连接查询 (续)
连接字段
连接谓词中的列名称为连接字段
连接条件中的各连接字段类型必须是可比的,
但不必是相同的连接操作的执行过程
嵌套循环法 (NESTED-LOOP)
首先在表 1中找到第一个元组,然后从头开始扫描表 2,
逐一查找满足连接件的元组,找到后就将表 1中的第一个元组与该元组拼接起来,形成结果表中一个元组 。
表 2全部查找完后,再找表 1中第二个元组,然后再从头开始扫描表 2,逐一查找满足连接条件的元组,找到后就将表 1中的第二个元组与该元组拼接起来,形成结果表中一个元组 。
重复上述操作,直到表 1中的全部元组都处理完毕排序合并法 (SORT-MERGE)
常用于 =连接
首先按连接属性对表 1和表 2排序
对表 1的第一个元组,从头开始扫描表 2,顺序查找满足连接条件的元组,找到后就将表 1中的第一个元组与该元组拼接起来,形成结果表中一个元组 。
当遇到表 2中第一条大于表 1连接字段值的元组时,
对表 2的查询不再继续排序合并法
找到表 1的第二条元组,然后从刚才的中断点处继续顺序扫描表 2,查找满足连接条件的元组,找到后就将表 1中的第一个元组与该元组拼接起来,形成结果表中一个元组 。 直接遇到表 2中大于表 1连接字段值的元组时,对表 2的查询不再继续
重复上述操作,直到表 1或表 2中的全部元组都处理完毕为止索引连接 (INDEX-JOIN)
对表 2按连接字段建立索引
对表 1中的每个元组,依次根据其连接字段值查询表 2的索引,从中找到满足条件的元组,找到后就将表 1中的第一个元组与该元组拼接起来,形成结果表中一个元组连接查询 (续)
SQL中连接查询的主要类型
广义笛卡尔积
等值连接 (含自然连接 )
非等值连接查询
自身连接查询
外连接查询
复合条件连接查询一、广义笛卡尔积
不带连接谓词的连接
很少使用例:
SELECT Student.*,SC.*
FROM Student,SC
二、等值与非等值连接查询等值连接,自然连接,非等值连接
[例 32] 查询每个学生及其选修课程的情况。
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno = SC.Sno;
等值连接
连接运算符为 = 的连接操作
[<表名 1>.]<列名 1> = [<表名 2>.]<列名 2>
任何子句中引用表 1和表 2中同名属性时,都必须加表名前缀 。 引用唯一属性名时可以加也可以省略表名前缀 。
等值连接假设 Student表,SC表分别有下列数据:
Student表
Sno Sname Ssex Sage Sdept
95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
等值连接
SC表
Sno Cno Grade
95001 1 92
95001 2 85
95001
95002
95002
3
2
3
88
90
80
等值连接结果表
Student.Sno Sname Ssex Sage Sdept SC.Sno Cno Grade
95001 李勇 男 20 CS 95001 1 92
95001 李勇 男 20 CS 95001 2 85
95001 李勇 男 20 CS 95001 3 88
95002 刘晨 女 19 IS 95002 2 90
95002 刘晨 女 19 IS 95002 3 80
自然连接
等值连接的一种特殊情况,把目标列中重复的属性列去掉 。
[例 33] 对 [例 32]用自然连接完成。
SELECT Student.Sno,Sname,Ssex,Sage,
Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno = SC.Sno;
非等值连接查询连接运算符 不是 = 的连接操作
[<表名 1>.]<列名 1><比较运算符 >[<表名 2>.]<列名 2>
比较运算符,>,<,>=,<=,!=
[<表名 1>.]<列名 1> BETWEEN [<表名 2>.]<列名 2>
AND [<表名 2>.]<列名 3>
三、自身连接
一个表与其自己进行连接,称为表的 自身连接
需要给表起别名以示区别
由于所有属性名都是同名属性,因此必须使用别名前缀自身连接(续)
[例 34] 查询每一门课的间接先修课 ( 即先修课的先修课 )
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno = SECOND.Cno;
SELECT
FIRST.C#,first.CNAME,SECOND.C#,second.CNAME
FROM C FIRST,C SECOND
WHERE FIRST.C# = SECOND.CPno;
自身连接(续)
FIRST表 ( Course表 )
Cno Cname Cpno Ccredit
1 数据库 5 4
2 数学 2
3 信息系统 1 4
4 操作系统 6 3
5 数据结构 7 4
6 数据处理 2
7 PASCAL语言 6 4
自身连接(续)
SECOND表 ( Course表 )
Cno Cname Cpno Ccredit
1 数据库 5 4
2 数学 2
3 信息系统 1 4
4 操作系统 6 3
5 数据结构 7 4
6 数据处理 2
7 PASCAL语言 6 4
自身连接(续)
查询结果
1 7
3 5
5 6
cno cpno
四、外连接( Outer Join)
外连接与普通连接的区别
普通连接操作只输出满足连接条件的元组
外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出外连接( outer join)
A B C
a b c
b b f
c a d
R
B C D
b c d
b c e
a d b
e f g
S
A B C D
a b c d
a b c e
c a d b
A B C D
a b c d
a b c e
c a d b
b b f null
A B C D
a b c d
a b c e
c a d b
null e f g
SR
R RS S
A B C D
a b c d
a b c e
c a d b
b b f null
null e f g
SR
外连接(续)
[例 33] 查询每个学生及其选修课程的情况包括没有选修课程的学生 ----用外连接操作
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
95001 李勇 男 20 CS 1 92
95001 李勇 男 20 CS 2 85
95001 李勇 男 20 CS 3 88
95002 刘晨 女 19 IS 2 90
95002 刘晨 女 19 IS 3 80
95003 王敏 女 18 MA
95004 张立 男 19 IS
外连接(续)
在表名后面加外连接操作符 (*)或 (+)指定非主体表
非主体表有一,万能,的虚行,该行全部由空值组成
虚行可以和主体表中所有不满足连接条件的元组进行连接
由于虚行各列全部是空值,因此与虚行连接的结果中,来自非主体表的属性值全部是空值外连接(续)
左外连接
外连接符出现在连接条件的左边
右外连接
外连接符出现在连接条件的右边
select S.S#,SNAME,SEX,C#
from S right outer join SC on S.S# = SC.S#
select S.S#,SNAME,SEX,C#
from S,SC
on S.S# *= SC.S#
五、复合条件连接
WHERE子句中含多个连接条件时,称为复合条件连接
[例 35]查询选修 2号课程且成绩在 90分以上的所有学生的学号、姓名
SELECT Student.Sno,student.Sname
FROM Student,SC
WHERE Student.Sno = SC.Sno AND
/* 连接谓词 */
SC.Cno= ' 2 ' AND /* 其他限定条件 */
SC.Grade > 90; /* 其他限定条件 */
多表连接
[例 36] 查询每个学生的学号,姓名,选修的课程名及成绩 。
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno
and SC.Cno = Course.Cno;
结果:
Student.Sno Sname Cname Grade
95001 李勇 数据库 92
95001 李勇 数学 85
95001 李勇 信息系统 88
95002 刘晨 数学 90
95002 刘晨 信息系统 80
3.3 查 询
3.3.1 概述
3.3.2 单表查询
3.3.3 连接查询
3.3.4 嵌套查询
3.3.5 集合查询
3.3.6 小结
3.3.4 嵌套查询
嵌套查询概述
嵌套查询分类
嵌套查询求解方法
引出子查询的谓词嵌套查询 (续 )
嵌套查询概述
一个 SELECT-FROM-WHERE语句称为一个查询块
将一个查询块嵌套在另一个查询块的
WHERE子句或 HAVING短语的条件中的查询称为嵌套查询嵌套查询 (续 )
SELECT Sname 外层查询 /父查询
FROM Student
WHERE Sno IN
( SELECT Sno 内层查询 /子查询
FROM SC
WHERE Cno= ' 2 ');
嵌套查询 (续 )
子查询的限制
不能使用 ORDER BY子句
层层嵌套方式反映了 SQL语言的结构化
有些嵌套查询可以用连接运算替代嵌套查询分类
不相关子查询子查询的查询条件不依赖于父查询
相关子查询子查询的查询条件依赖于父查询嵌套查询求解方法
不相关子查询是由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。
嵌套查询求解方法(续)
相关子查询
首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若
WHERE子句返回值为真,则取此元组放入结果表;
然后再取外层表的下一个元组;
重复这一过程,直至外层表全部检查完为止。
引出子查询的谓词
带有 IN谓词的子查询
带有比较运算符的子查询
带有 ANY或 ALL谓词的子查询
带有 EXISTS谓词的子查询一、带有 IN谓词的子查询
[例 37] 查询与,刘晨,在同一个系学习的学生。
此查询要求可以分步来完成
① 确定,刘晨,所在系名
SELECT Sdept
FROM Student
WHERE Sname= ' 刘晨 ';
结果为:
Sdept
IS
带有 IN谓词的子查询(续)
② 查找所有在 IS系学习的学生。
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept= ' IS ';
结果为:
Sno Sname Sdept
95001 刘晨 IS
95004 张立 IS
构造嵌套查询将第一步查询嵌入到第二步查询的条件中
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname=? 刘晨 ’ );
此查询为不相关子查询。 DBMS求解该查询时也是分步去做的。
带有 IN谓词的子查询(续)
用自身连接完成本查询要求
SELECT S1.Sno,S1.Sname,
S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sdept = S2.Sdept AND
S2.Sname = '刘晨 ';
带有 IN谓词的子查询(续)
父查询和子查询中的表均可以定义别名
SELECT Sno,Sname,Sdept
FROM Student S1
WHERE S1.Sdept IN
(SELECT Sdept
FROM Student S2
WHERE S2.Sname=? 刘晨 ’ );
带有 IN谓词的子查询(续)
[例 38]查询选修了课程名为,信息系统,的学生学号和姓名
SELECT Sno,Sname ③ 最后在 Student关系中
FROM Student 取出 Sno和 Sname
WHERE Sno IN
(SELECT Sno ② 然后在 SC关系中找出选
FROM SC 修了 3号课程的学生学号
WHERE Cno IN
(SELECT Cno ① 首先在 Course关系中找出
,信
FROM Course 息系统,的课程号,结果为 3
号
WHERE Cname=?信息系统 ’ ));
带有 IN谓词的子查询(续)
结果:
Sno Sname
---- -----
95001 李勇
95002 刘晨带有 IN谓词的子查询(续)
用连接查询
SELECT Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno AND
SC.Cno = Course.Cno AND
Course.Cname=?信息系统 ’ ;
二、带有比较运算符的子查询
● 当能确切知道内层查询返回单值时,可用比较运算符( >,<,=,>=,
<=,!=或 < >)。
与 ANY或 ALL谓词配合使用带有比较运算符的子查询(续)
例:假设一个学生只可能在一个系学习,并且必须属于一个系,则在 [例 37]可以 用 = 代替 IN,
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept =
SELECT Sdept
FROM Student
WHERE Sname= ' 刘晨 ';
带有比较运算符的子查询(续)
子查询一定要跟在比较符之后错误 的例子:
SELECT Sno,Sname,Sdept
FROM Student
WHERE ( SELECT Sdept
FROM Student
WHERE Sname=? 刘晨 ’ )
= Sdept;
三、带有 ANY或 ALL谓词的子查询谓词语义
ANY:任意一个值
ALL:所有值带有 ANY或 ALL谓词的子查询(续)
需要配合使用比较运算符
> ANY 大于子查询结果中的某个值
> ALL 大于子查询结果中的所有值
< ANY 小于子查询结果中的某个值
< ALL 小于子查询结果中的所有值
>= ANY 大于等于子查询结果中的某个值
>= ALL 大于等于子查询结果中的所有值
<= ANY 小于等于子查询结果中的某个值
<= ALL 小于等于子查询结果中的所有值
= ANY 等于子查询结果中的某个值
=ALL 等于子查询结果中的所有值(通常没有实际意义)
!=(或 <>) ANY 不等于子查询结果中的某个值
!=(或 <>) ALL 不等于子查询结果中的任何一个值带有 ANY或 ALL谓词的子查询(续)
[例 39] 查询其他系中比信息系任意 一 个 (其中某一 个 )学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage < ANY (SELECT Sage
FROM Student
WHERE Sdept= ' IS ')
AND Sdept <> ' IS ' ;
/* 注意这是父查询块中的条件 */
带有 ANY或 ALL谓词的子查询(续)
结果
Sname Sage
王敏 18
执行过程
1.DBMS执行此查询时,首先处理子查询,找出
IS系中所有学生的年龄,构成一个集合 (19,18)
2,处理父查询,找所有不是 IS系且年龄小于
19 或 18的学生带有 ANY或 ALL谓词的子查询(续)
● ANY和 ALL谓词有时可以用集函数实现
– ANY与 ALL与集函数的对应关系
= <>或 != < <= > >=
ANY IN -- <MAX <=MAX >MIN >= MIN
ALL -- NOT IN <MIN <= MIN >MAX >= MAX
带有 ANY或 ALL谓词的子查询(续)
– 用集函数实现子查询通常比直接用 ANY或
ALL查询效率要高,因为前者通常能够减少比较次数
– 原因:集函数首先把需要比较的集合计算出来(通常情况下是变小的),缩小了和父查询比较的次数带有 ANY或 ALL谓词的子查询(续)
[例 39']:用集函数实现 [例 39]
SELECT Sname,Sage
FROM Student
WHERE Sage <
(SELECT MAX(Sage)
FROM Student
WHERE Sdept= ' IS ')
AND Sdept <> ' IS ‘;
带有 ANY或 ALL谓词的子查询(续)
[例 40] 查询其他系中比信息系 所有 学生年龄 都小的学生姓名及年龄。
方法一:用 ALL谓词
SELECT Sname,Sage
FROM Student
WHERE Sage < ALL
(SELECT Sage
FROM Student
WHERE Sdept= ' IS ')
AND Sdept <> ' IS ‘;
查询结果为空表。
带有 ANY或 ALL谓词的子查询(续)
方法二:用集函数
SELECT Sname,Sage
FROM Student
WHERE Sage <
(SELECT MIN(Sage)
FROM Student
WHERE Sdept= ' IS ')
AND Sdept <>' IS ‘;
四、带有 EXISTS谓词的子查询
1,EXISTS谓词
2,NOT EXISTS谓词
3,不同形式的查询间的替换
4,相关子查询的效率
5,用 EXISTS/NOT EXISTS实现全称量词
6,用 EXISTS/NOT EXISTS实现逻辑蕴函带有 EXISTS谓词的子查询 (续)
● 1,EXISTS谓词
– 存在量词?
– 带有 EXISTS谓词的子查询不返回任何数据,只产生逻辑真值,true‖或逻辑假值,false‖。
● 若内层查询结果非空,则返回真值
● 若内层查询结果为空,则返回假值
– 由 EXISTS引出的子查询,其目标列表达式通常都用
*,因为带 EXISTS的子查询只返回真值或假值,给出列名无实际意义
● 2,NOT EXISTS谓词带有 EXISTS谓词的子查询 (续)
[例 41] 查询所有选修了 1号课程的学生姓名。
– 用嵌套查询
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC /*相关子查询 */
WHERE Sno=Student.Sno AND
Cno= ' 1 ');
求解过程带有 EXISTS谓词的子查询 (续)
思路分析:
● 本查询涉及 Student和 SC关系。
● 在 Student中依次取每个元组的 Sno值,用此值去检查 SC关系。
● 若 SC中存在这样的元组,其 Sno值等于此
Student.Sno值,并且其 Cno= '1',则取此
Student.Sname送入结果关系。
相关子查询
子查询的查询条件依赖于外层父查询的某个属性值,称为相关子查询。
不能一次将子查询求解出来,然后求解父查询。
内层查询由于和外层查询有关,因此必须反复求值。
相关子查询的一般处理过程
首先取外层查询中( Student)表的第 1
个元组,根据它与内层查询相关的属性值( Sno)处理内层查询,若 Where子句返回值为真,则取此元组放入结果表;
然后再取( Student)表的下一个元组;
重复这一个过程,直至外层( Student)
表全部检查完为止。
带有 EXISTS谓词的子查询 (续)
用连接运算
SELECT Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno AND
SC.Cno= '1';
带有 EXISTS谓词的子查询 (续)
[例 42] 查询没有选修 1号课程的学生姓名 。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno = Student.Sno
AND Cno='1');
此例用连接运算难于实现
∏ SNAME(S) - ∏SNAMEE(σC#=?C2‘(S SC))
带有 EXISTS谓词的子查询 (续)
3,不同形式的查询间的替换一些 带 EXISTS或 NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换所有 带 IN谓词、比较运算符,ANY和 ALL谓词的子查询都能用带 EXISTS谓词的子查询等价替换。
EXISTS 带 IN谓词、比较运算符,ANY和 ALL谓词带有 EXISTS谓词的子查询 (续)
例,[例 37]查询与,刘晨,在同一个系学习的学生。 可以用带 EXISTS谓词的子查询替换:
SELECT Sno,Sname,Sdept
FROM Student S1
WHERE EXISTS
SELECT *
FROM Student S2
WHERE S2.Sdept = S1.Sdept AND
S2.Sname = ' 刘晨 ';
带有 EXISTS谓词的子查询 (续)
5.用 EXISTS/NOT EXISTS实现全称量词 (难点 )
SQL语言中没有全称量词? ( For all)
可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:
(?x)P ≡? (? x(? P))
带有 EXISTS谓词的子查询 (续)
[例 43] 查询选修了全部课程的学生姓名 。
=,没有一门课是他不选修的 。
SELECT Sname
FROM Student
WHERE NOT EXISTS
( SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno= Student.Sno
AND Cno= Course.Cno) ;
∏ SNAME( S ( ∏ S#,C#(SC) ÷ ∏ C#(C) ))
带有 EXISTS谓词的子查询 (续)
6,用 EXISTS/NOT EXISTS实现逻辑蕴函 (难点 )
SQL语言中没有蕴函 (Implication)逻辑运算
可以利用谓词演算将逻辑蕴函谓词等价转换为:
p? q ≡? p∨ q
带有 EXISTS谓词的子查询 (续)
[例 44] 查询至少选修了学生 95002选修的全部课程的学生号码。
解题思路:
● 用逻辑蕴函表达:查询学号为 x的学生,对所有的课程
y,只要 95002学生选修了课程 y,则 x也选修了 y。
● 形式化表示:
用 P表示谓词,学生 95002选修了课程 y‖
用 q表示谓词,学生 x选修了课程 y‖
则上述查询为,(?y) p? q
带有 EXISTS谓词的子查询 (续)
● 等价变换:
(?y)p? q ≡? (?y (?(p? q ))
≡? (?y (?(? p∨ q)
≡y(p∧?q)
● 变换后语义:不存在这样的课程 y,学生 95002
选修了 y,而学生 x没有选。
带有 EXISTS谓词的子查询 (续)
● 用 NOT EXISTS谓词表示,
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 查 询
3.3.1 概述
3.3.2 单表查询
3.3.3 连接查询
3.3.4 嵌套查询
3.3.5 集合查询
3.3.6 小结
3.3.5 集合查询标准 SQL直接支持的集合操作种类并操作 (UNION)
一般商用数据库支持的集合操作种类并操作 (UNION)
交操作 (INTERSECT)
差操作 (MINUS)
1,并操作
形式
<查询块 >
UNION
<查询块 >
参加 UNION操作的各结果表的列数必须相同;
对应项的数据类型也必须相同
A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1
A B C
a1 b2 c2
a1 b3 c2
a2 b2 c1
R
S
并操作(续)
[例 45] 查询计算机科学系的学生及年龄不大于
19岁的学生。
方法一:
SELECT *
FROM Student
WHERE Sdept= 'CS'
UNION
SELECT *
FROM Student
WHERE Sage<=19;
并操作(续)
方法二:
SELECT DISTINCT *
FROM Student
WHERE Sdept= 'CS' OR Sage<=19;
并操作(续)
[例 46] 查询选修了课程 1或者选修了课程 2的学生。
方法一:
SELECT Sno
FROM SC
WHERE Cno=' 1 '
UNION
SELECT Sno
FROM SC
WHERE Cno= ' 2 ';
并操作(续)
方法二:
SELECT DISTINCT Sno
FROM SC
WHERE Cno=' 1 ' OR Cno= ' 2 ';
并操作(续)
[例 47] 设数据库中有一教师表 Teacher(Tno,
Tname,...)。查询学校中所有师生的姓名。
SELECT Sname
FROM Student
UNION
SELECT Tname
FROM Teacher;
new
2,交操作标准 SQL中没有提供集合交操作,但可用其他方法间接实现。
现在已经提供。
A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1
A B C
a1 b2 c2
a1 b3 c2
a2 b2 c1
R
S
2,交操作
[例 48] 查询计算机科学系的学生与年龄不大于
19岁的学生的交集本例实际上就是查询计算机科学系中年龄不大于
19岁的学生
SELECT *
FROM Student
WHERE Sdept= 'CS' AND
Sage<=19;
交操作(续)
[例 49] 查询选修课程 1的学生集合与选修课程 2
的学生集合的交集本例实际上是查询既选修了课程 1又选修了课程 2
的学生
SELECT Sno
FROM SC
WHERE Cno=' 1 ' AND Sno IN
(SELECT Sno
FROM SC
WHERE Cno=' 2 ');
交操作(续)
[例 50] 查询学生姓名与教师姓名的交集本例实际上是查询学校中与教师同名的学生姓名
SELECT DISTINCT Sname
FROM Student
WHERE Sname IN
(SELECT Tname
FROM Teacher);
new
3,差操作标准 SQL中没有提供集合差操作,但可用其他方法间接实现。
现在已经提供。
A B C
a1 b1 c1
a1 b2 c2
a2 b2 c1
A B C
a1 b2 c2
a1 b3 c2
a2 b2 c1
R
S
3,差操作
[例 51] 查询计算机科学系的学生与年龄不大于
19岁的学生的差集。
本例实际上是查询计算机科学系中年龄大于 19
岁的学生
SELECT *
FROM Student
WHERE Sdept= 'CS' AND
Sage>19;
差操作(续)
[例 52] 查询学生姓名与教师姓名的差集本例实际上是查询学校中未与教师同名的学生姓名
SELECT DISTINCT Sname
FROM Student
WHERE Sname NOT IN
(SELECT Tname
FROM Teacher); new
4,对集合操作结果的排序
ORDER BY子句只能用于对最终查询结果排序,不能对中间结果排序
任何情况下,ORDER BY子句只能出现在最后
对集合操作结果排序时,ORDER BY子句中用数字指定排序属性
new
对集合操作结果的排序(续)
[例 53] 错误 写法
SELECT *
FROM Student
WHERE Sdept= 'CS'
ORDER BY Sno
UNION
SELECT *
FROM Student
WHERE Sage<=19
ORDER BY Sno; new
对集合操作结果的排序(续)
正确写法
SELECT *
FROM Student
WHERE Sdept= 'CS'
UNION
SELECT *
FROM Student
WHERE Sage<=19
ORDER BY 1;
new
3.3.6 SELECT语句的一般格式
SELECT [ALL|DISTINCT]
<目标列表达式 > [别名 ] [,<目标列表达式 > [别名 ]] …
FROM <表名或视图名 > [别名 ]
[,<表名或视图名 > [别名 ]] …
[WHERE <条件表达式 >]
[GROUP BY <列名 1>[,<列名 1‘>],..[HAVING <条件表达式 >]]
[ORDER BY <列名 2> [ASC|DESC]
[,<列名 2‘> [ASC|DESC] ] … ];
整条语句的含义:
根据 WHERE子句的条件表达式,从 FROM子句指定的基本表或视图中找出满足条件的元组,再按
SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。
如果有 GROUP子句,则将结果按 <列名 1>的值进行分组,该属性列值相等的元组为一个组,每个组产生结果表中的一条记录,通常会在每组中使用集函数。如果 GROUP子句带 HAVING短语,则只有满足指定条件的组才输出。如果有 ORDER子句,则结果表还要按 <列名 2>的值的升序或降序排列。
1、子句基本应用形式
( 1)SELECT 子句的形式
① SELECT Sno,Sname
② SELECT DISTINCT Sno
③ SELECT *
④ SELECT ‘My name is’,Sname,2003 -
Sage,ISLOWER(Sdept) Dept
⑤ SELECT AVG(Grade),MAX(Grade),COUNT(*)
(2)FROM
① FROM Student
② FROM Student,SC,Course
(3)WHERE
① WHERE Sage>=18
等价于 WHERE NOT ( Sage<18)
② WHERE Sage BETWEEN 19 AND 22
等价于 WHERE Sage>=19 AND Sage<=22
③ WHERE Sdept In(‘IS’,’MA’)
等价于 WHERE Sdept=’ IS’ OR Sdept=‘MA’
④ WHERE Sdept NOT in (‘IS’,’MA’)
等价于 WHERE Sdept<>’IS’AND Sdept<>’MA’
⑤ WHERE Sname NOT LIKE ‘_ 宇%’
⑥ WHERE Cname LIKE ‘DB \_%i_’ESCAPE ‘ \’
⑦ WHERE Grade IS NOT Null
(4) GROUP
① GROUP BY CNO
② GROUP BY Sno HAVING
COUNT(*)>=3
(5)ORDER
① ORDER BY Grade DESC
② ORDER BY Sdept,Sage DESC
2,连接查询
非等值连接( <,>)
等值连接(=)
自身连接(别名)
外连接( *)
复合条件连接:多个表的连接(多表连接)、多个条件的连接(复合条件连接)
3、嵌套查询
带有 IN谓词的子查询
带有比较运算符的子查询(单值比较)
带有 ANY或 ALL的子查询
带有 EXISTS谓词的子查询
4、集合查询
每一个 SELECT语句都能获得一个或一组元组。若要把多个 SELECT语句的结果合并为一个结果,可用集合操作来完成。
集合操作用 UNION(并),INTERSECT
(交)和 MINUS(差)。
作业
将上次作业的两道题目的 关系代数表达式 改写成 SQL查询语句 。
表 3,1 S Q L 语言的动词
S Q L 功 能 动 词数 据 定 义 C R E A T E,D R O P,A L T E R
数 据 查 询 S E L E C T
数 据 操 纵 I N S E R T,U P D A T E
D E L E T E
数 据 控 制 G R A N T,R E V O K E
表 3,2 S Q L 的数据定义语句操 作 方 式操 作 对象创 建 删 除 修 改表 C R E A T E
T A B L E
D R O P
T A B L E
A L T E R
T A B L E
视 图 C R E A T E
V I E W
D R O P V I E W
索 引 C R E A T E
I N D E X
D R O P
I N D E X
数据库系统概论
An Introduction to Database System
第三章 关系数据库标准语言 SQL
第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7 嵌入式 SQL
3.8 小结
3.4 数 据 更 新
3.4.1 插入数据
3.4.2 修改数据
3.4.3 删除数据
3.4.1 插入数据
两种插入数据方式
插入单个元组
插入子查询结果
c1b2a2
c2b3a1
c2b2a1
CBA
S
c1b2a2
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 ');
新插入的记录在 Grade列上取空值
INTO子句
指定要插入数据的表名及属性列
属性列的顺序可与表定义中的顺序不一致
没有指定属性列:表示要插入的是一条完整的元组,
且属性列属性与表定义中的顺序一致
指定部分属性列:插入的元组在其余属性列上取空值
VALUES子句
提供的值必须与 INTO子句匹配
> 值的个数
> 值的类型
INSERT
INTO SC(Sno,Cno)
VALUES (' 95020 ',' 1 ');
2,插入子查询结果
语句格式
INSERT
INTO <表名 > [(<属性列 1> [,<属性列 2>… )]
子查询 ;
功能将子查询结果插入指定表中插入子查询结果(续)
[例 3] 对每一个系,求学生的平均年龄,
并把结果存入数据库。
第一步:建表
CREATE TABLE Deptage
(Sdept CHAR(15) /* 系名 */
Avgage SMALLINT); /*学生平均年龄 */
插入子查询结果(续)
第二步:插入数据
INSERT
INTO Deptage(Sdept,Avgage)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;
插入子查询结果(续)
INTO子句 (与 插入单条元组类似 )
指定要插入数据的表名及属性列
属性列的顺序可与表定义中的顺序不一致
没有指定属性列:表示要插入的是一条完整的元组
指定部分属性列:插入的元组在其余属性列上取空值
子查询
SELECT子句目标列必须与 INTO子句匹配
值的个数
值的类型插入子查询结果(续)
DBMS在执行插入语句时会检查所插元组是否破坏表上已定义的 完整性规则
实体完整性
参照完整性
用户定义的完整性
NOT NULL约束
UNIQUE约束
值域约束
3.4 数 据 更 新
3.4.1 插入数据
3.4.2 修改数据
3.4.3 删除数据
3.4.2 修改数据
语句格式
UPDATE <表名 >
SET <列名 >=<表达式 >[,<列名 >=<表达式 >]…
[WHERE <条件 >];
功能修改指定表中满足 WHERE子句条件的元组
c1b2a2
c2b3a1
c2b2a1
CBA
S
修改数据(续)
三种修改方式
修改某一个元组的值
修改多个元组的值
带子查询的修改语句
Sno Sname Ssex Sage Sdept
95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
Student
1,修改某一个元组的值
[例 4] 将学生 95001的年龄改为 22岁 。
UPDATE Student
SET Sage=22
WHERE Sno=' 95001 ';
Sno Sname Ssex Sage Sdept
95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
Student
2,修改多个元组的值
[例 5] 将所有学生的年龄增加 1岁 。
UPDATE Student
SET Sage= Sage+1;
修改多个元组的值 (续 )
[例 6] 将信息系所有学生的年龄增加 1岁 。
UPDATE Student
SET Sage= Sage+1
WHERE Sdept=' IS ';
3,带子查询的修改语句
[例 7] 将计算机科学系全体学生的成绩置零 。
UPDATE SC
SET Grade=0
WHERE 'CS'=
(SELETE Sdept
FROM Student
WHERE Student.Sno = SC.Sno);
修改数据(续)
SET子句指定修改方式要修改的列修改后取值
WHERE子句指定要修改的元组缺省表示要修改表中的所有元组
SET Sage= Sage+1
WHERE 'CS'=
(SELETE Sdept
FROM Student
WHERE Student.Sno = SC.Sno);
修改数据(续)
DBMS在执行修改语句时会检查修改操作是否破坏表上已定义的 完整性规则
实体完整性
用户定义的完整性
NOT NULL约束
UNIQUE约束
值域约束
3.4 数 据 更 新
3.4.1 插入数据
3.4.2 修改数据
3.4.3 删除数据
3.4.3 删除数据
DELETE
FROM <表名 >
[WHERE <条件 >];
– 功能
删除指定表中满足 WHERE子句条件的 元组
– WHERE子句
指定要删除的元组
缺省表示要修改表中的所有元组
c1b2a2
c2b3a1
c2b2a1
CBA
S
删除数据(续)
三种删除方式
删除某一个元组的值
删除多个元组的值
带子查询的删除语句
1,删除某一个元组的值
[例 8] 删除学号为 95019的学生记录。
DELETE
FROM Student
WHERE Sno='95019';
Sno Sname Ssex Sage Sdept
95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 18 MA
95004 张立 男 19 IS
Student
2,删除多个元组的值
[例 9] 删除 2号课程的所有选课记录。
DELETE
FROM SC;
WHERE Cno='2';
[例 10] 删除所有的学生选课记录。
DELETE
FROM SC;
3,带子查询的删除语句
[例 11] 删除计算机科学系所有学生的选课记录。
DELETE
FROM SC
WHERE 'CS'=
(SELETE Sdept
FROM Student
WHERE Student.Sno=SC.Sno);
删除数据 (续 )
DBMS在执行插入语句时会检查所插元组是否破坏表上已定义的 完整性规则
– 参照完整性
不允许删除
级联删除表 3,1 S Q L 语言的动词
S Q L 功 能 动 词数 据 定 义 C R E A T E,D R O P,A L T E R
数 据 查 询 S E L E C T
数 据 操 纵 I N S E R T,U P D A T E
D E L E T E
数 据 控 制 G R A N T,R E V O K E
第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7 嵌入式 SQL
3.8 小结
SQL数据库的体系结构用户 1 用户 2 用户 3 用户 4
视图 1 视图 1
基本表 1 基本表 2 基本表 3 基本表 4
存储文件 1 存储文件 2 存储文件 3 存储文件 4
图 3.1 SQL数据库的体系结构
SQL用户
View
Base
table
Stored
file
3.5 视 图视图的特点
虚表,是从一个或几个基本表(或视图)
导出的表
只存放视图的定义,不会出现数据冗余
基表中的数据发生变化,从视图中查询出的数据也随之改变
3.5 视 图基于视图的操作
查询
删除
更新 (受限 )
定义基于该视图的新视图
3.5 视 图
3.5.1 定义视图
3.5.2 查询视图
3.5.3 更新视图
3.5.4 视图的作用
1,建立视图
语句格式
CREATE VIEW
<视图名 > [(<列名 > [,<列名 >]… )]
AS <子查询 >
[WITH CHECK OPTION];
建立视图(续)
DBMS执行 CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的 SELECT语句。
在对视图查询时,按视图的定义从基本表中将数据查出。
组成视图的属性列名全部省略或全部指定
省略,
由子查询中 SELECT目标列中的诸字段组成
明确指定视图的所有列名,
(1) 某个目标列是集函数或列表达式
(2) 目标列为 *
(3) 多表连接时选出了几个同名列作为视图的字段
(4) 需要在视图中为某个列启用新的更合适的名字常见的视图形式
行列子集视图
WITH CHECK OPTION的视图
基于多个基表的视图
基于视图的视图
带表达式的视图
分组视图行列子集视图
[例 1] 建立信息系学生的视图。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS';
从单个基本表导出只是去掉了基本表的某些行和某些列保留了码建立视图(续)
WITH CHECK OPTION
透过视图进行增删改操作时,不得破坏视图定义中的谓词条件
(即子查询中的条件表达式)
WITH CHECK OPTION的视图
[例 2] 建立信息系学生的视图,并要求透过该视图进行的更新操作只涉及信息系学生。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS'
WITH CHECK OPTION;
对 IS_Student视图的更新操作
修改操作,DBMS自动加上 Sdept= 'IS'的条件
删除操作,DBMS自动加上 Sdept= 'IS'的条件
插入操作,DBMS自动检查 Sdept属性值是否为 'IS'
如果不是,则拒绝该插入操作
如果没有提供 Sdept属性值,则自动定义 Sdept
为 'IS'
基于多个基表的视图
[例 4] 建立信息系选修了 1号课程的学生视图。
CREATE VIEW IS_S1(Sno,Sname,Grade)
AS
SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERE Sdept= 'IS' AND
Student.Sno=SC.Sno AND
SC.Cno= '1';
基于视图的视图
[例 5] 建立信息系选修了 1号课程且成绩在 90
分以上的学生的视图。
CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS_S1
WHERE Grade>=90;
带表达式的视图
[例 6] 定义一个反映学生出生年份的视图。
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2000-Sage
FROM Student
设置一些派生属性列,也 称为虚拟列 --Sbirth
带表达式的视图必须明确定义组成视图的各个属性列名建立分组视图
[例 7] 将学生的学号及他的平均成绩定义为一个视图假设 SC表中,成绩,列 Grade为数字型
CREAT VIEW S_G(Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
建立视图(续)
一类不易扩充的视图
以 SELECT * 方式创建的视图可扩充性差,
应尽可能避免建立视图(续)
[例 8]将 Student表中所有女生记录定义为一个视图
CREATE VIEW
F_Student1(stdnum,name,sex,age,dept)
AS SELECT *
FROM Student
WHERE Ssex='女 ';
缺点:修改基表 Student的结构后,Student表与 F_Student1视图的映象关系被破坏,
导致该视图不能正确工作。
建立视图(续)
CREATE VIEW
F_Student2 (stdnum,name,sex,age,dept)
AS SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student
WHERE Ssex='女 ';
为基表 Student增加属性列不会破坏 Student表与 F_Student2视图的映象关系。
常见的视图形式
行列子集视图
WITH CHECK OPTION的视图
基于多个基表的视图
基于视图的视图
带表达式的视图
分组视图
2,删除视图
DROP VIEW <视图名 >;
该语句从数据字典中删除指定的视图定义
由该视图导出的其他视图定义仍在数据字典中,但已不能使用,必须显式删除
删除基表时,由该基表导出的所有视图定义都必须显式删除删除视图 (续)
[例 9] 删除视图 IS_S1
DROP VIEW IS_S1;
3.5.2 查询视图
从用户角度:查询视图与查询基本表相同
DBMS实现 视图查询的方法
实体化视图 ( View Materialization)
有效性检查:检查所查询的视图是否存在
执行视图定义,将视图临时实体化,生成临时表
查询视图转换为查询临时表
查询完毕删除被实体化的视图 (临时表 ) new
查询视图(续)
视图消解法 ( View Resolution)
进行有效性检查,检查查询的表、视图等是否存在。
如果存在,则从数据字典中取出视图的定义
把视图定义中的 子查询 与用户的 查询 结合起来,转换成等价的对基本表的查询
对基本表执行 修正 后的查询查询视图(续)
[例 1] 在信息系学生的视图中找出年龄小于 20岁的学生。
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;
IS_Student视图的定义 (视图定义例 1):
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS?;
查询视图(续)
视图实体化法
视图消解法转换后的查询语句为:
SELECT Sno,Sage
FROM Student
WHERE Sdept= 'IS' AND Sage<20;
查询视图(续)
[例 2] 查询信息系选修了 1号课程的学生
SELECT Sno,Sname
FROM IS_Student,SC
WHERE IS_Student.Sno =SC.Sno AND
SC.Cno= '1';
查询视图(续)
视图消解法的局限
有些情况下,视图消解法不能生成正确查询。
采用视图消解法的 DBMS会限制这类查询。
查询视图(续)
[例 3]在 S_G视图中查询平均成绩在 90分以上的学生学号和平均成绩
SELECT *
FROM S_G
WHERE Gavg>=90;
S_G视图定义:
CREATE VIEW S_G (Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
查询转换错误:
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90
GROUP BY Sno;
正确:
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;
3.5 视 图
3.5.1 定义视图
3.5.2 查询视图
3.5.3 更新视图
3.5.4 视图的作用
3.5.3 更新视图
用户角度:更新视图与更新基本表相同
DBMS实现视图更新的方法
视图实体化法( View Materialization)
视图消解法( View Resolution)
指定 WITH CHECK OPTION子句后
DBMS在更新视图时会进行检查,防止用户通过视图对 不属于视图范围内 的基本表数据进行更新更新视图(续)
[例 1] 将信息系学生视图 IS_Student中学号 95002
的学生姓名改为,刘辰,。
UPDATE IS_Student
SET Sname= '刘辰 '
WHERE Sno= '95002';
转换后的语句:
UPDATE Student
SET Sname= '刘辰 '
WHERE Sno= '95002' AND Sdept= 'IS';
更新视图(续)
[例 2] 向信息系学生视图 IS_S中插入一个新的学生记录,95029,赵新,20岁
INSERT
INTO IS_Student
VALUES(?95029‘,‘ 赵新 ’,20);
转换为对基本表的更新:
INSERT
INTO Student(Sno,Sname,Sage,Sdept)
VALUES('95029','赵新 ',20,'IS' );
更新视图(续)
[例 3] 删除视图 CS_S中学号为 95029的记录
DELETE
FROM IS_Student
WHERE Sno= '95029';
转换为对基本表的更新:
DELETE
FROM Student
WHERE Sno= '95029' AND Sdept= 'IS';
更新视图的限制
一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新 (对两类方法均如此 )
例:视图 S_G为不可更新视图。
CREATE VIEW S_G (Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
更新视图(续)
对于如下更新语句:
UPDATE S_G
SET Gavg=90
WHERE Sno= '95001';
无论实体化法还是消解法都无法将其转换成对基本表 SC的更新实际系统对视图更新的限制
允许对行列子集视图进行更新
对其他类型视图的更新不同系统有不同限制
3.5 视 图
3.5.1 定义视图
3.5.2 查询视图
3.5.3 更新视图
3.5.4 视图的作用
1,视图能够 简化 用户的操作当视图中数据不是直接来自基本表时,定义视图能够简化用户的操作
基于多张表连接形成的视图
基于复杂嵌套查询的视图
含导出属性的视图
2,视图使用户能以 多种角度 看待同一数据
视图机制能使不同用户以不同方式看待同一数据,适应数据库共享的需要
3.视图对重构数据库提供了一定程度的逻辑独立性例:数据库逻辑结构发生改变学生关系 Student(Sno,Sname,Ssex,Sage,Sdept)
―垂直,地分成两个基本表:
SX(Sno,Sname,Sage)
SY(Sno,Ssex,Sdept)
3.视图对重构数据库提供了一定程度的逻辑独立性通过建立一个视图 Student:
CREATE VIEW Student(Sno,Sname,Ssex,Sage,Sdept)
AS
SELECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept
FROM SX,SY
WHERE SX.Sno=SY.Sno;
使用户的外模式保持不变,从而对原 Student表的查询程序不必修改
3,视图对重构数据库提供了一定程度的 逻辑独立性
物理独立性与逻辑独立性的概念
视图在一定程度上保证了数据的逻辑独立性
视图只能在一定程度上提供数据的逻辑独立性
由于对视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因基本表结构的改变而改变。
SQL数据库的体系结构用户 1 用户 2 用户 3 用户 4
视图 1 视图 1
基本表 1 基本表 2 基本表 3 基本表 4
存储文件 1 存储文件 2 存储文件 3 存储文件 4
图 3.1 SQL数据库的体系结构
SQL用户
View
Base
table
Stored
file
4,视图能够对机密数据提供安全保护
对不同用户定义不同视图,使每个用户只能看到他有权看到的数据
通过 WITH CHECK OPTION对关键数据定义操作时间限制建立视图(续)
[例 3 ] 建立 1号课程的选课视图,并要求透过该视图进行的更新操作只涉及 1号课程,同时对该视图的任何操作只能在工作时间进行。
CREATE VIEW IS_SC
AS
SELECT Sno,Cno,Grade
FROM SC
WHERE Cno= '1'
AND TO_CHAR(SYSDATE,'HH24') BETWEEN 9 AND 17
AND TO_CHAR(SYSDATE,'D') BETWEEN 2 AND 6
WITH CHECK OPTION; new
数据库系统概论
An Introduction to Database System
第三章 关系数据库标准语言 SQL
第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7 嵌入式 SQL
3.8 小结
3.6 数据控制
概述
3.6.1 授权
3.6.2 收回权限
小结概述数据控制亦称为数据保护,包括数据的:
安全性控制
完整性控制
并发控制
恢复
SQL语言的数据控制功能
SQL语言提供了数据控制功能,能够在一定程度上保证数据库中数据的完全性,
完整性,并提供了一定的并发控制及恢复能力 。
1,完整性
数据库的完整性是指数据库中数据的正确性与相容性。
SQL语言定义完整性约束条件
CREATE TABLE语句
ALTER TABLE语句
码
取值唯一的列
参照完整性
其他约束条件
2,并发控制
并发控制,当多个用户并发地对数据库进行操作时,对他们加以控制、协调,以保证并发操作正确执行,保持数据库的一致性。
SQL语言并发控制能力:
提供事务、事务开始、事务结束、提交等概念
3,恢复
恢复,当发生各种类型的故障导致数据库处于不一致状态时,将数据库恢复到一致状态的功能。
SQL语言恢复功能:
提供事务回滚、重做等概念
( UNDO,REDO)
4,安全性
安全性:保护数据库,防止不合法的使用所造成的数据泄露和破坏 。
保证数据安全性的主要措施存取控制:控制用户只能存取他有权存取的数据规定不同用户对于不同数据对象所允许执行的操作
① 数据库元素类型:数据库、表、属性列、视图
②权限,SELECT,INSERT,UPDATE、
DELETE,ALTER,INDEX,CREATETAB、
ALL PRIVILEGES
③ 用户类型,DBA、属主、普通用户
DBMS实现数据安全性保护的过程
用户或 DBA把授权决定告知系统
SQL的 GRANT和 REVOKE
DBMS把授权的结果存入数据字典
当用户提出操作请求时,DBMS根据授权定义进行检查,以决定是否执行操作请求安全性 (续 )
谁定义?
DBA和表的建立者(即表的属主)
如何定义?
SQL语句:
GRANT
REVOKE
3.6.1 授 权
GRANT语句的一般格式:
GRANT <权限 >[,<权限 >]...
[ON <对象类型 > <对象名 >]
TO <用户 >[,<用户 >]...
[WITH GRANT OPTION];
谁定义? DBA和表的建立者 ( 即表的属主 )
GRANT功能:将对指定操作对象的指定操作权限授予指定的用户 。
(1) 操作权限
(2) 用户的权限
建表 ( CREATETAB) 的权限,属于 DBA
DBA授予 -->普通用户
基本表或视图的属主拥有对该表或视图的一切操作权限
接受权限的用户,
一个或多个具体用户
PUBLIC(全体用户)
(3 ) WITH GRANT OPTION子句
指定了 WITH GRANT OPTION子句,
获得某种权限的用户还可以把这种权限再授予 别的用户。
没有指定 WITH GRANT OPTION子句,
获得某种权限的用户只能使用该权限,
不能传播 该权限例题例 1 把查询 Student表权限授给用户 U1
GRANT SELECT
ON TABLE Student
TO U1;
例题(续)
例 2 把对 Student表和 Course表的全部权限授予用户 U2和 U3
GRANT ALL PRIVILIGES
ON TABLE Student,Course
TO U2,U3;
例 4
例题(续)
例 3 把对表 SC的查询权限授予所有用户
GRANT SELECT
ON TABLE SC
TO PUBLIC;
例题(续)
例 4 把查询 Student表和修改学生学号的权限授给用户 U4
GRANT UPDATE(Sno),SELECT
ON TABLE Student
TO U4;
例题(续)
例 5 把对表 SC的 INSERT权限授予 U5用户,
并允许他再将此权限授予其他用户
GRANT INSERT
ON TABLE SC
TO U5
WITH GRANT OPTION;
传播权限执行例 5后,U5不仅拥有了对表 SC的 INSERT权限,
还可以传播此权限,
GRANT INSERT ON TABLE SC TO U6
WITH GRANT OPTION;
同样,U6还可以将此权限授予 U7:
GRANT INSERT ON TABLE SC TO U7;
但 U7不能再传播此权限 。
U5--> U6--> U7
例题(续)
例 6 DBA把在数据库 S_C中建立表的权限授予用户 U8
GRANT CREATETAB
ON DATABASE S_C
TO U8;
3.6 数据控制
概述
3.6.1 授权
3.6.2 收回权限
小结
SQL收回权限的功能
REVOKE语句的一般格式为:
REVOKE <权限 >[,<权限 >]...
[ON <对象类型 > <对象名 >]
FROM <用户 >[,<用户 >]...;
功能:从指定 用户 那里收回对指定 对象的指定 权限例题例 7 把用户 U4修改学生学号的权限收回
REVOKE UPDATE(Sno)
ON TABLE Student
FROM U4;
例题(续)
例 8 收回所有用户对表 SC的查询权限
REVOKE SELECT
ON TABLE SC
FROM PUBLIC;
例题(续)
例 9 把用户 U5对 SC表的 INSERT权限收回
REVOKE INSERT
ON TABLE SC
FROM U5;
权限的级联回收系统将收回直接或间接从 U5处获得的对 SC
表的 INSERT权限,
-->U5--> U6--> U7
收回 U5,U6,U7获得的对 SC表的 INSERT
权限,
<--U5<-- U6<-- U7
小结,SQL灵活的授权机制
DBA拥有对数据库中所有对象的所有权限,并可以根据应用的需要将不同的权限授予不同的用户。
用户 对自己建立的基本表和视图拥有全部的操作权限,
并且可以用 GRANT语句把其中某些权限授予其他用户 。
被授权的用户 如果有,继续授权,的许可,还可以把获得的权限再授予其他用户 。
所有授予出去的权力在必要时又都可以用 REVOKE语句 收回 。
数据库系统概论
An Introduction to Database System
第三章 关系数据库标准语言 SQL
(续 4)
第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7 嵌入式 SQL
3.8 小结
3.7 嵌 入 式 SQL
SQL语言提供了两种不同的使用方式:
交互式
嵌入式
为什么 要引入嵌入式 SQL
SQL语言是非过程性语言
事务处理应用需要高级语言
这两种方式细节上有差别,在程序设计的环境下,SQL语句要做某些必要的扩充宿主语言十嵌入式 SQL
预处理程序
宿主语言十函数调用
SQL函数定义库 宿主语言编译程序
目标程序
3.7.1嵌入式 SQL的一般 形式
为了 区分 SQL语句与主语言语句,需要,
前缀,EXEC SQL
结束标志:随主语言的不同而不同
以 C为主语言的嵌入式 SQL语句的一般形式
EXEC SQL <SQL语句 >;
例,EXEC SQL DROP TABLE Student;
嵌入 SQL语句说明性语句嵌入 SQL语句 数据定义可执行语句 数据控制数据操纵
允许出现可执行的高级语言语句的地方,都可以写可执行 SQL语句
允许出现说明语句的地方,都可以写说明性
SQL语句
3.7.2 嵌入式 SQL语句与主语言之间的 通信将 SQL嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句
SQL语句
描述性的面向 集合 的语句
负责操纵 数据库
高级语言语句
过程性的面向 记录 的语句
负责 控制程序流程工作单元之间的通信方式
1,SQL通信区向主语言传递 SQL语句的执行 状态 信息主语言能够据此控制程序流程
2,主变量
1)主语言向 SQL语句提供 参数
2)将 SQL语句查询数据库的结果交主语言进一步处理
3,游标解决 集合 性操作语言与 过程性 操作语言的不匹配
1,SQL通信区
SQLCA,SQL Communication Area
SQLCA是一个数据结构
SQLCA的用途
DBMS SQL通信区 SQLCA 应用程序信息
SQLCA的内容
与所执行的 SQL语句有关
与该 SQL语句的执行情况有关
SQLCA的使用方法
定义 SQLCA
用 EXEC SQL INCLUDE SQLCA加以定义
使用 SQLCA
SQLCA中有一个存放每次执行 SQL语句后返回代码的变量 SQLCODE
2,主变量
什么是主变量
嵌入式 SQL语句中可以使用主语言的程序变量来输入或输出数据
在 SQL语句中使用的主语言程序变量简称 为主变量主变量(续)
主变量的类型
输入 主变量
由应用程序对其赋值,SQL语句引用
输出 主变量
由 SQL语句赋值或设置状态信息,返回给应用程序
一个主变量有可能既是输入主变量又是输出主变量主变量(续)
主变量的用途
输入主变量
指定向数据库中插入的数据
将数据库中的数据修改为指定值
指定执行的操作
指定 WHERE子句或 HAVING子句中的条件
输出主变量
获取 SQL语句的结果数据
获取 SQL语句的执行状态主变量(续)
指示变量
一个主变量可以附带一个指示变量
( Indicator Variable)
主变量(续)
在 SQL语句中使用主变量和指示变量的方法
1) 说明主变量和指示变量
BEGIN DECLARE SECTION
........,
........,(说明主变量和指示变量 )
.........
END DECLARE SECTION
主变量(续)
2) 使用主变量
说明之后的主变量可以在 SQL语句中任何一个能够使用表达式的地方出现
为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的主变量名前要加冒号(,)作为标志
3) 使用指示变量指示变量前也必须加冒号标志,必须紧跟在所指主变量之后主变量(续)
在 SQL语句之外 (主语言 语句中 )使用主变量和指示变量的方法
可以直接引用,不必加冒号
3,游标( cursor)
为什么要使用游标
SQL语言与主语言具有不同数据处理方式
SQL语言是面向 集合 的,一条 SQL语句原则上可以产生或处理多条记录游标(续)
主语言是面向 记录 的,一组主变量一次只能存放一条记录
仅使用主变量并不能完全满足 SQL语句向应用程序输出数据的要求
嵌入式 SQL引入了游标的概念,用来协调这两种不同的处理方式游标(续)
什么是游标
游标是系统为用户开设的一个 数据缓冲区,
存放 SQL语句的执行结果
用户可以用 SQL语句逐一从游标中获取记录,
并赋给主变量,交由主语言进一步处理嵌入式 SQL语句与主语言之间的通信 (续 )
小结
在嵌入式 SQL中,SQL语句与主语言语句分工非常明确
SQL语句,直接与数据库打交道
主语言语句
1,控制程序流程
2,对 SQL语句的执行结果做进一步加工处理嵌入式 SQL语句与主语言之间的通信 (续 )
SQL语句用 主变量 从主语言中接收执行参数,
操纵数据库
SQL语句的 执行状态 由 DBMS送至 SQLCA中
主语言程序从 SQLCA中取出状态信息,据此决定下一步操作
如果 SQL语句从数据库中成功地检索出数据,
则通过主变量传给主语言做进一步处理
SQL语言和主语言的不同数据处理方式通过游标 来协调嵌入式 SQL语句与主语言之间的通信 (续 )
例:带有嵌入式 SQL的一小段 C程序
............
EXEC SQL INCLUDE SQLCA;
/* (1) 定义 SQL通信区 */
EXEC SQL BEGIN DECLARE SECTION;
/* (2) 说明主变量 */
CHAR title_id(7);
CHAR title(81);
INT royalty;
EXEC SQL END DECLARE SECTION;
嵌入式 SQL语句与主语言之间的通信 (续 )
main()
{
EXEC SQL DECLARE C1 CURSOR FOR
SELECT tit_id,tit,roy FROM titles;
/* (3) 游标操作(定义游标) */
/* 从 titles表中查询 tit_id,tit,roy */
EXEC SQL OPEN C1;
/* (4) 游标操作(打开游标) */
嵌入式 SQL语句与主语言之间的通信 (续 )
for(;;)
{
EXEC SQL FETCH C1 INTO,title_id,:title,:royalty;
/* (5) 游标操作(将当前数据放入主变量并推进游标指针) */
if (sqlca.sqlcode <> SUCCESS)
/* (6) 利用 SQLCA中的状态信息决定何时退出循环 */
break;
printf("Title ID,%s,Royalty,%d",:title_id,:royalty);
printf("Title,%s",:title);
/* 打印查询结果 */
}
EXEC SQL CLOSE C1;
/* (7) 游标操作(关闭游标) */
}
3.7 嵌 入 式 SQL
3.7.1 嵌入式 SQL的一般形式
3.7.2 嵌入式 SQL语句与主语言之间的通信
3.7.3 不用游标的 SQL语句
3.7.4 使用游标的 SQL语句
3.7.5 动态 SQL简介
3.7.3 不用游标的 SQL语句
不用游标的 SQL语句的种类
说明性语句
数据定义语句
数据控制语句
查询结果为单记录的 SELECT语句
非 CURRENT形式的 UPDATE语句
非 CURRENT形式的 DELETE语句
INSERT语句一、说明性语句
说明性语句是专为在嵌入式 SQL中说明主变量,SQLCA等而设置的
说明主变量
1,EXEC SQL BEGIN DECLARE SECTION;
2,EXEC SQL END DECLARE SECTION;
这两条语句必须配对出现,相当于一个括号,
两条语句中间是主变量的说明
说明 SQLCA
3,EXEC SQL INCLUDE SQLCA
二、数据定义语句例 1 建立一个,学生,表 Student
EXEC SQL CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE,
Sname CHAR(20),
Ssex CHAR(1),
Sage INT,
Sdept CHAR(15));
三、数据控制语句例 2 把查询 Student表权限授给用户 U1
EXEC SQL GRANT SELECT ON
TABLE Student TO U1;
四、查询结果为单记录的 SELECT语句
语句格式
EXEC SQL SELECT [ALL|DISTINCT]
<目标列表达式 >[,<目标列表达式 >]...
INTO <主变量 >[<指示变量 >]
[,<主变量 >[<指示变量 >]]..,
FROM <表名或视图名 >[,<表名或视图名 >],..
[WHERE <条件表达式 >]
[GROUP BY <列名 1> [HAVING <条件表达式 >]]
[ORDER BY <列名 2> [ASC|DESC]];
查询结果为单记录的 SELECT语句(续)
对交互式 SELECT语句的扩充就是多了一个
INTO子句
把从数据库中找到的符合条件的记录,放到 INTO子句指出的主变量中去。
查询结果为单记录的 SELECT语句(续)
使用注意事项
1,使用主变量
INTO子句
WHERE子句的条件表达式
HAVING短语的条件表达式查询结果为单记录的 SELECT语句(续)
2,查询结果为空集
如果数据库中没有满足条件的记录,即查询结果为空,则 DBMS将 SQLCODE的值置为 100
3,查询结果为多条记录
程序出错,DBMS会在 SQLCA中返回错误信息查询结果为单记录的 SELECT语句(续)
例 3 根据学生号码查询学生信息。
假设已将要查询的学生的学号赋给了主变量 givensno
EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept
INTO,Hsno,:Hname,:Hsex,:Hage,:Hdept
FROM Student
WHERE Sno=:givensno;
Hsno,Hname,Hsex,Hage,Hdept和 givensno均是主变量,并均已在前面的程序中说明过了。
查询结果为单记录的 SELECT语句(续)
例 4 查询某个学生选修某门课程的成绩。
假设已将要查询的学生的学号赋给了主变量
givensno,将课程号赋给了主变量 givencno。
EXEC SQL SELECT Sno,Cno,Grade
INTO,Hsno,:Hcno,:Hgrade:Gradeid
FROM SC
WHERE Sno=:givensno AND
Cno=:givencno;
查询结果为单记录的 SELECT语句(续)
从提高应用程序的数据独立性角度考虑,
SELECT语句在任何情况下都应该使用游标
对于仅返回一行结果数据的 SELECT语句虽然可以不使用游标
但如果以后数据库改变了,该 SELECT语句可能会返回多行数据,这时该语句就会出错五、非 CURRENT形式的 UPDATE语句
非 CURRENT形式的 UPDATE语句
使用主变量
SET子句
WHERE子句
使用指示变量
SET子句
非 CURRENT形式的 UPDATE语句可以操作多条元组非 CURRENT形式的 UPDATE语句(续)
例 5 将全体学生 1号课程的考试成绩增加若干分。
假设增加的分数已赋给主变量 Raise
EXEC SQL UPDATE SC
SET Grade=Grade+:Raise
WHERE Cno='1';
非 CURRENT形式的 UPDATE语句(续)
例 6 修改某个学生 1号课程的成绩。
假设该学生的学号已赋给主变量 givensno,
修改后的成绩已赋给主变量 newgrade。
EXEC SQL UPDATE SC
SET Grade=:newgrade
WHERE Sno=:givensno;
非 CURRENT形式的 UPDATE语句(续)
例 7 将计算机系全体学生年龄置 NULL值
Sageid=-1;
EXEC SQL UPDATE Student
SET Sage=:Raise:Sageid
WHERE Sdept='CS';
非 CURRENT形式的 UPDATE语句(续)
将指示变量 Sageid赋一个负值后,无论主变量 Raise为何值,DBMS都会将 CS系所有记录的年龄属性置空值。它等价于:
EXEC SQL UPDATE Student
SET Sage=NULL
WHERE Sdept='CS';
六、非 CURRENT形式的 DELETE语句
非 CURRENT形式的 DELETE语句
使用主变量
WHERE子句
非 CURRENT形式的 DELETE语句可以操作多条元组非 CURRENT形式的 DELETE语句(续)
例 8 某个学生退学了,现要将有关他的所有选课记录删除掉。
假设该学生的姓名已赋给主变量 stdname
EXEC SQL DELETE
FROM SC
WHERE Sno=
(SELECT Sno
FROM Student
WHERE Sname=:stdname);
七,INSERT语句
非 CURRENT形式的 INSERT语句
使用主变量
VALUES子句
使用指示变量
VALUES子句
非 CURRENT形式的 INSERT语句一次只能输入一条元组
INSERT语句(续)
例 9 某个学生新选修了某门课程,将有关记录插入 SC表假设学生的学号已赋给主变量 stdno,课程号已赋给主变量 couno。
gradeid=-1;
EXEC SQL INSERT
INTO SC(Sno,Cno,Grade)
VALUES(:stdno,:couno,:gr:gradeid);
由于该学生刚选修课程,尚未考试,因此成绩列为空。
所以本例中用指示变量指示相应的主变量为空值。
3.7.4 使用游标的 SQL语句
必须使用游标的 SQL语句
查询结果为多条记录的 SELECT语句
CURRENT形式的 UPDATE语句
CURRENT形式的 DELETE语句一,查询结果为多条记录的 SELECT语句
使用游标的步骤
1,说明游标
2,打开游标
3,移动游标指针,然后取当前记录
4,关闭游标
1,说明游标
使用 DECLARE语句
语句格式
EXEC SQL DECLARE <游标名 > CURSOR
FOR <SELECT语句 >;
功能
是一条说明性语句,这时 DBMS并不执行
SELECT指定的查询操作。
2,打开游标
使用 OPEN语句
语句格式
EXEC SQL OPEN <游标名 >;
功能
打开游标实际上是 执行相应的 SELECT语句,把所有满足查询条件的记录从指定表取到缓冲区中
这时游标处于活动状态,指针指向查询结果集中第一条记录之前
3,移动游标指针,然后取当前记录
使用 FETCH语句
语句格式
EXEC SQL FETCH [[NEXT|PRIOR|
FIRST|LAST] FROM] <游标名 >
INTO <主变量 >[<指示变量 >]
[,<主变量 >[<指示变量 >]]...;
移动游标指针,然后取当前记录(续)
功能
指定方向推动游标指针,然后将缓冲区中的当前记录取出来送至主变量供主语言进一步处理。
NEXT|PRIOR|FIRST|LAST:指定推动游标指针的方式。
NEXT:向前推进一条记录
PRIOR:向回退一条记录
FIRST:推向第一条记录
LAST:推向最后一条记录
缺省值为 NEXT
移动游标指针,然后取当前记录(续)
说明
(1) 主变量必须与 SELECT语句中的目标列表达式具有一一对应关系
(2) FETCH语句通常用在一个循环结构中,通过循环执行 FETCH语句逐条取出结果集中的行进行处理
(3) 为进一步方便用户处理数据,现在一些关系数据库管理系统对 FETCH语句做了扩充,允许用户向任意方向以任意步长移动游标指针
4,关闭游标
使用 CLOSE语句
语句格式
EXEC SQL CLOSE <游标名 >;
功能
关闭游标,释放结果集占用的缓冲区及其他资源
说明
游标被关闭后,就不再和原来的查询结果集相联系
被关闭的游标可以再次被打开,与新的查询结果相联系例题例 1 查询某个系全体学生的信息(学号、姓名、
性别和年龄)。要查询的系名由用户在程序运行过程中指定,放在主变量 deptname中
......
.....,
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
例题(续)
......
/* 说明主变量
deptname,HSno,HSname,HSsex,HSage等 */
......
......
EXEC SQL END DECLARE SECTION;
......
......
gets(deptname); /* 为主变量 deptname赋值 */
......
例题(续)
EXEC SQL DECLARE SX CURSOR FOR
SELECT Sno,Sname,Ssex,Sage
FROM Student
WHERE SDept=:deptname; /* 说明游标 */
EXEC SQL OPEN SX /* 打开游标 */
例题(续)
WHILE(1) /* 用循环结构逐条处理结果集中的记录 */
{
EXEC SQL FETCH SX
INTO,HSno,:HSname,:HSsex,:HSage;
/* 将游标指针向前推进一行,然后从结果集中取当前行,送相应主变量 */
例题(续)
if (sqlca.sqlcode <> SUCCESS)
break;
/* 若所有查询结果均已处理完或出现
SQL语句错误,则退出循环 */
/* 由主语言语句进行进一步处理 */
......
......
};
例题(续)
EXEC SQL CLOSE SX; /* 关闭游标 */
......
......
例题(续)
例 2 查询某些系全体学生的信息。
......
......
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
......
/* 说明主变量
deptname,HSno,HSname,HSsex,HSage等 */
......
......
例题(续)
EXEC SQL END DECLARE SECTION;
......
......
......
EXEC SQL DECLARE SX CURSOR FOR
SELECT Sno,Sname,Ssex,Sage
FROM Student
WHERE SDept=:deptname; /* 说明游标 */
例题(续)
WHILE (gets(deptname)!=NULL) /* 接收主变量
deptname的值 */
{
/* 下面开始处理 deptname指定系的学生信息,
每次循环中 deptname可具有不同的值 */
EXEC SQL OPEN SX /* 打开游标 */
例题(续)
WHILE (1) { /* 用循环结构逐条处理结果集中的记录 */
EXEC SQL FETCH SX
INTO,HSno,:HSname,:HSsex,:HSage;
/* 将游标指针向前推进一行,然后从结果集中取当前行,送相应主变量 */
例题(续)
if (sqlca.sqlcode <> SUCCESS)
break;
/* 若所有查询结果均已处理完或出现
SQL语句错误,则退出循环 */
/* 由主语言语句进行进一步处理 */
......
......
}; /* 内循环结束 */
例题(续)
EXEC SQL CLOSE SX; /* 关闭游标 */
}; /* 外循环结束 */
......
......
二,CURRENT形式的 UPDATE语句和 DELETE语句
CURRENT形式的 UPDATE语句和 DELETE
语句的用途
非 CURRENT形式的 UPDATE语句和 DELETE
语句
面向集合的操作
一次修改或删除所有满足条件的记录二,CURRENT形式的 UPDATE语句和 DELETE语句
CURRENT形式的 UPDATE语句和 DELETE
语句的用途(续)
如果只想修改或删除其中 某个 记录
用带游标的 SELECT语句查出所有满足条件的记录
从中进一步找出要修改或删除的记录
用 CURRENT形式的 UPDATE语句和
DELETE语句修改或删除之
CURRENT形式的 UPDATE语句和 DELETE语句(续)
步骤
(1) DECLARE?
说明游标
(2) OPEN
打开游标,把所有满足查询条件的记录从指定表取至缓冲区
(3) FETCH
推进游标指针,并把当前记录从缓冲区中取出来送至主变量
CURRENT形式的 UPDATE语句和 DELETE语句(续)
(4) 检查该记录是否是要修改或删除的记录,是则处理之?
(5) 重复第 (3)和 (4)步,用逐条取出结果集中的行进行判断和处理
(6) CLOSE
关闭游标,释放结果集占用的缓冲区和其他资源
CURRENT形式的 UPDATE语句和 DELETE语句(续)
说明游标
为 UPDATE语句说明游标
使用带 FOR UPDATE OF <列名 >短语的
DECLARE语句
语句格式
EXEC SQL DECLARE <游标名 > CURSOR
FOR <SELECT语句 > FOR UPDATE
OF <列名 >;
FOR UPDATE OF <列名 >短语用于指明检索出的数据在指定列上是可修改的,以便
DBMS进行并发控制
CURRENT形式的 UPDATE语句和 DELETE语句(续)
为 DELETE语句说明游标
使用带 FOR UPDATE短语的 DECLARE语句
语句格式
EXEC SQL DECLARE <游标名 > CURSOR
FOR <SELECT语句 > FOR UPDATE;
FOR UPDATE短语提示 DBMS进行并发控制
CURRENT形式的 UPDATE语句和 DELETE语句(续)
修改或删除当前记录
经检查缓冲区中记录是要修改或删除的记录,
则用 UPDATE语句或 DELETE语句修改或删除该记录
语句格式
<UPDATE语句 > WHERE CURRENT OF <游标名 >
<DELETE语句 > WHERE CURRENT OF <游标名 >
WHERE CURRENT OF <游标名 >子句表示修改或删除的是该游标中最近一次取出的记录例题例 3 对某个系的学生信息,根据用户的要求修改其中某些人的年龄字段。
思路
查询某个系全体学生的信息 (要查询的系名由主变量 deptname指定)
然后根据用户的要求修改其中某些记录的年龄字段例题(续)
......
......
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
......
/* 说明主变量
deptname,HSno,HSname,HSsex,HSage,NEWAge等 */
......
例题(续)
......
EXEC SQL END DECLARE SECTION;
......
......
gets(deptname); /* 为主变量 deptname赋值
*/
......
例题(续)
EXEC SQL DECLARE SX CURSOR FOR
SELECT Sno,Sname,Ssex,Sage
FROM Student
WHERE SDept=:deptname
FOR UPDATE OF Sage; /* 说明游标 */
EXEC SQL OPEN SX /* 打开游标 */
例题(续)
WHILE(1) {/* 用循环结构逐条处理结果集中的记录 */
EXEC SQL FETCH SX INTO,HSno,:HSname,
:HSsex,:HSage;
/* 将游标指针向前推进一行,然后从结果集中取当前行,送相应主变量 */
例题(续)
if (sqlca.sqlcode <> SUCCESS)
break;
/* 若所有查询结果均已处理完或出现 SQL语句错误,则退出循环 */
printf("%s,%s,%s,%d",Sno,Sname,Ssex,
Sage);
/* 显示该记录 */
printf("UPDATE AGE? "); /* 问用户是否要修改 */
scanf("%c",&yn);
例题(续)
if (yn='y' or yn='Y') /* 需要修改 */
{
printf("INPUT NEW AGE,");
scanf("%d",&NEWAge); /* 输入新的年龄值
*/
EXEC SQL UPDATE Student
SET Sage=:NEWAge
WHERE CURRENT OF SX;
/* 修改当前记录的年龄字段 */
};
例题(续)
......
......
};
EXEC SQL CLOSE SX; /* 关闭游标 */
......
......
例题(续)
例 4 对某个系的学生信息,根据用户的要求删除其中某些人的记录。
......
......
EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
......
/* 说明主变量
deptname,HSno,HSname,HSsex,HSage等 */
例题(续)
......
......
EXEC SQL END DECLARE SECTION;
......
......
gets(deptname); /* 为主变量 deptname赋值
*/
......
例题(续)
EXEC SQL DECLARE SX CURSOR FOR
SELECT Sno,Sname,Ssex,Sage
FROM Student
WHERE SDept=:deptname
FOR UPDATE; /* 说明游标 */
EXEC SQL OPEN SX /* 打开游标 */
例题(续)
WHILE(1){ /* 用循环结构逐条处理结果集中的记录 */
EXEC SQL FETCH SX INTO,HSno,:HSname,
:HSsex,:H
Sage;
/* 将游标指针向前推进一行,然后从结果集中取当前行,送相应主变量 */
例题(续)
if (sqlca.sqlcode <> SUCCESS)
break;
/* 若所有查询结果均已处理完或出现 SQL语句错误,则退出循环 */
printf("%s,%s,%s,%d",Sno,Sname,Ssex,
Sage);
/* 显示该记录 */
例题(续)
printf("DELETE? "); /* 问用户是否要删除 */
scanf("%c",&yn);
if (yn='y' or yn='Y') /* 需要删除 */
EXEC SQL DELETE
FROM Student
WHERE CURRENT OF SX; /* 删除当前记录
*/
例题(续)
......
......
};
EXEC SQL CLOSE SX; /* 关闭游标 */
......
......
3.7 嵌 入 式 SQL
3.7.1 嵌入式 SQL的一般形式
3.7.2 嵌入式 SQL语句与主语言之间的通信
3.7.3 不用游标的 SQL语句
3.7.4 使用游标的 SQL语句
3.7.5 动态 SQL简介
3.7.5 动态 SQL简介
静态嵌入式 SQL
动态嵌入式 SQL
一、静态 SQL的特点
用户可以在程序运行过程中根据实际需要输入 WHERE子句或 HAVING子句中某些变量的 值 。
语句中主变量的 个数与数据类型 在预编译时都是确定的,只有是主变量的 值 是程序运行过程中动态输入的。
静态 SQL的不足静态 SQL语句提供的编程 灵活性 在许多情况下仍显得不足,不能编写更为通用的程序。
需求例,对 SC:
任课教师想查选修某门课程的所有学生的学号及其成绩
班主任想查某个学生选修的所有课程的课程号及相应成绩
学生想查某个学生选修某门课程的成绩即:查询 条件是不确定 的,要查询的 属性列 也是不确定的二、动态 SQL
1,什么是动态嵌入式 SQL
动态 SQL方法允许在程序运行过程中临时,组装,SQL语句。
2,应用范围
在 预编译 时下列信息不能确定时
SQL语句正文
主变量个数
主变量的数据类型
SQL语句中引用的数据库对象(列、索引、基本表、视图等)
动态 SQL(续)
3,动态 SQL的形式
语句可变
临时构造完整的 SQL语句
条件可变
WHERE子句中的条件
HAVING短语中的条件
数据库对象、查询条件均可变
SELECT子句中的列名
FROM子句中的表名或视图名
WHERE子句中的条件
HAVING短语中的条件动态 SQL(续)
4,常用动态 SQL语句
EXECUTE IMMEDIATE
PREPARE
EXECUTE
DESCRIBE
使用动态 SQL技术更多的是涉及程序设计方面的知识,而不是 SQL语言本身第三章 关系数据库标准语言 SQL
3.1 SQL概述
3.2 数据定义
3.3 查询
3.4 数据更新
3.5 视图
3.6 数据控制
3.7嵌入式 SQL
3.8 小结
3.8 小 结
SQL的特点
⒈ 综合统一
2,度非过程化
3,面向集合的操作方式
4,同一种语法结构提供两种使用方式
5,语言简捷,易学易用小结(续)
交互式 SQL
数据定义
查询
数据更新
数据控制小结(续)
表 3.1 SQ L 语言的动词
SQ L 功能 动 词数 据 查 询 SEL EC T
数 据 定 义 C R E A T E,D R O P,A L T E R
数 据 操 纵 INS E R T,U P D A T E,
DELET E
数 据 控 制 G R A N T,R EV O K E
小结(续)
嵌入式 SQL
与主语言的通信方式
1,SQL通信区
向主语言传递 SQL语句的执行状态信息
2,主变量
1)主语言向 SQL语句提供参数
2)将 SQL语句查询数据库的结果交主语言进一步处理
3,游标
解决集合性操作语言与过程性操作语言的不匹配小结(续)
嵌入式 SQL(续 )
静态 SQL
不用游标
不需要返回结果数据的 SQL语句
只返回一条结果的 SQL语句
使用游标
说明游标
打开游标
推进游标并取当前记录
关闭游标
动态 SQL
第二、三章的复习
关系数据结构:表关系模型 关系操作 (关系代数、关系演算,SQL)
完整性约束实体完整性、
参照完整性用户定义完整性
1,关系中没有行序的原因是 __.
2,关系中不允许有重复元组的原因是 __
3,关系模型的基本数据结构是 __
4,实体完整性是对 __(键)的约束,参照完整性是对 __的约束。
5,关系代数的基本操作是 ____。
6,等式 R∞S = R× S成立的条件是 __
7、关系的并、差、交操作,要求两个关系具有 __。
8、一般,在关系代数运算中,当查询涉及到,否定,时,就要用到 __操作;当查询涉及到,全部值,时,就要用到 __
操作
9、在关系中,,元数,是指
A、行数 B、元组个数 C、关系个数 D、
列数
10、在关系中,,基数,是指()
A、行数 B、属性个数
C、关系个数 D、列数
11、设关系 R,S,W各有 10个元组,那么这 3个关系的自然连接的元组个数有
A,10 B,30
C,1000 D、不确定(与计算结果有关
11,设 W= R∞ S(条件为 iθj),且 W,R,S的元组个数分别为 p,m,n,那么三者之间满足
A,p<(m+n) B,P≤(m+ n)
C,p<(m× n) D,P≤(m× n)
12,设关系 R和 S的结构相同,且各有 10个元组,
那么这两个关系的并操作结果的元组个数为
A,10 B、小于等于 10
C,20 D、小于等于 20
13,设关系 R和 S的属性个数分别为 2和 3,那么 R ∞ S
(条件为 1<2)等价于
A,σ1<2(R× S) B,σ1<4(R× S)
C,σ1<2(R ∞ S) D,σ1<4(R ∞ S)
14,如果两个关系没有公共属性,那么其自然连接
A、转化为笛卡尔积操作 B、转化为连接操作
C、转化为外部并操作 D、结果为空关系
15,下列式子中,不正确的是
A,R- S= R-( R ∩ S)
B,R=( R- S) U( R ∩ S)
C,R ∩ S= S-( S- R)
D,R ∩ S= S-( R- S)
16,关系代数中的 θ连接操作由()操作组合而成。
A,σ和 π B,σ和 × C,σ,π和 × D,π和 ×
17,设四元关系 R( A,B,C,D),则下面不正确的是()
A,πD,B( R)为取属性 D,B的两列组成新关系
B,π4,2( R)为取属性的值为 4,2的两列组成新关系
C,πD,B( R)与 π4,2( R)是等价的
D,πD,B( R) π4,2( R)是相同关系
18,设 R为 K元关系,则 σ 2>’4’( R) 表示()
A、从 R中挑选 2的值大于 4个分量值的元组所组成的关系
B、从 R中挑选第 2个分量值大于 4的元组所构成的关系。
C、从 R中挑选第 2个分量值大于 4个分量值的元组所构成的关系
D,σ 2>’4’( R) 和 R相比,基数不变,元数减少
19,有关系,R( A,B,C),主键= A;
S( D,A),主键= D,外键= A,参照 R
的属性 A,关系 R和 S的元组如下所示。指出关系 S中违反关系完整性规则的元组是
()
A、( 1,2) B、( 2,null) C、( 3,3) D、
( 4,1)
R
A B C
3 6 7
2 5 7
D A
1 2
2 null
3 3
4 1
S
20,自然连接是构成新关系的有效方法。
一般情况下,要求 R和 S含有一个或多个共有的()
A、元组 B、行 C、记录 D、属性
21、设有属性 A,B,C,D,以下表示中不是关系的是()
A,R( A) B,R( A,B,C,D)
C,R( A× B× C× D) D,R( A,B)
22,设关系 R( A,B,C)和 S( B,C,
D),下列各关系代数表达式不成立的是
()
A,πA( R) ∞ πD( S) B,R ∪ S
C,πB( R) ∩ πB( S) D,R∞ S
23、关系模式的任何属性()
A、不可再分 B、可再分
C、命名在该关系模式中可以不唯一
D、以上都不是
24、试述等值连接和自然连接的区别。
25、在参照完整性中,外码的属性值能否为空?什么时候可以为空?
26,设有如下所示的两个关系 E1和 E2,其中 E2是从 E1中经过关系代数运算所形成的结果,试给出该运算的表达式。
E1
A B C
1 2 3
4 5 6
7 8 9
D A
5 6
8 9
E2
27、
R A B C
3 6 7
2 5 7
7 2 3
4 4 3
A B C
3 4 5
7 2 3
计算,RUS,R- S,R ∩ S,R× S,π3,2(S),
σB<‘5’(R),R S,R S
S
2<2
第三章
1,在 SQL中,关系模式称为 ___,子模式
(外模式)称为 ___,元组称为 ___,属性称为 ___。
2,SQL中,表有两种,___和 ___,也称为
___和 ___。
3,基本表中,,主键,概念应该体现其值的 ___和 ___两个特征。
4,操作,元组 IN (集合),的语义是
___
5,表达式中的通配符,%,表示 ___,
,_‖表示 ___
6,操作,元组 >SOME(集合),的语义是 ___
7,操作,元组 <ALL(集合),的语义是 ___
8,SQL有两种使用方式,___和 ___。
9,嵌入式 SQL的预处理方式,是指预处理程序先对源程序进行扫描,识别出 ___,
并处理成宿主语言的 ___形式。
10,为保证嵌入式 SQL的实现,通常
DBMS制造商提供一个 ___,供编译时使用。
11,SQL语句在嵌入在 C语言程序中时,
必须加上前缀标识 ___和结束标志 ___
12,在 SQL中,用户可以直接进行查询操作的是
A、实表和虚表 B、基本表和实表
C、视图和虚表 D、基本表
13,SQL中,与,NOT IN”等价的操作是
A、= SOME B,<>SOME
C,=ALL D,<>ALL
14,SQL中,谓词 EXISTS可用来测试一个集合是否
A、有重复元组 B、有重复的列名
C、为非空集合 D、有空值
15,基本表 EMP( ENO,ENAME,SALARY,DNO)
表示职工的工号、姓名、工资和所在部门的编号。
基本表 DEPT( DNO,DNAME)表示部门的编号和部门名。
有一 SQL语句,SELECT COUNT(DISTINCT DNO)
FROM EMP;
其等价的查询语句是
A、统计职工的总人数 B、统计每一部门的职工人数
C、统计职工服务的部门数目 D、统计每一职工服务的部门数目
EMP( ENO,ENAME,SALARY,DNO)
DEPT( DNO,DNAME)
16,SELECT ENO,ENAME
FROM EMP
WHERE DNO NOT IN
(SELECT DNO FROM DEPT WHERE
DNAME=?金工车间 ’ );
其等价的关系代数表达式
17,UPDATE EMP
SET SALARY= SALARY*1.05
WHERE DNO=?D6‘
AND SALARY<(SELECT AVG(SALARY)
FROM EMP);
其等价的修改语句为
A、为工资低于 D6部门平均工资的所有职工加薪 5%
B、为工资低于整个企业平均工资的职工加薪 5%
C、为在 D6部门工资、工资低于整个企业平均工资的职工加薪
5%
D、为在 D6部门工资、工资低于本部门平均工资的职工加薪 5%
18,有关嵌入式 SQL的叙述中,不正确的是
A、宿主语言是指 C一类高级程序设计语言
B、宿主语言是指 SQL语言
C、在程序中要区分 SQL语句和宿主语言语句
D,SQL有交互式和嵌入式两种使用方式
19,允许在嵌入的 SQL语句中,引用宿主语言的程序变量,在引用时
A、直接引用
B、这些变量前必须加符号 *
C、这些变量前必须加符号:
D、这些变量前必须加符号 &
20,如果嵌入的 SELECT语句的查询结果肯定是单元组,那么嵌入时
A、肯定不涉及游标机制
B、必须使用游标机制
C、是否使用游标,由程序员决定
D、是否使用游标,由 DBMS决定。
21,请问 SQL的 GRANT和 REVOKE命令属于数据库保护中的()控制
A、完整性 B、安全性
C、并发控制 D、恢复机制
22,SQL语句中,实现数据检索的语句是()
A,SELECT B,INSERT
C,UPDATE D,FIND
23,下列 SQL语句中,修改表结构的是()
A,ALTER B,CREATE
C,UPDATE D,DELETE
24,在 SQL中,如果希望将查询结果排序,应在
SELECT语句中使用()子句
A,ASC B,HAVING
C,DESC D,ORDER BY
25,在 SQL语言中,创建基本表应使用()
语句
A,CREATE VIEW B,CREATE SCHEMA
C,CREATE INDEX D,CREATE TABLE
26,在 SQL语句中,用于测试子查询是否为空的谓词是()
A,EXISTS B,UNIQUE C.SOME D.ALL
27,在 SQL中,建立唯一索引要用到()保留字
A,PRIMARY B,UNIQUE
C,INDEX D,DISTINCT
28,视图创建后,数据库中存放的是()
A、查询语句 B、查询结果
C、视图定义 D、所引用的基本表的定义
29,视图是一个,虚表,,视图的构造基于
()
A、基本表 B、视图
C、基本表或视图 D、数据字典
30,在视图上不能完成的操作是()
A、更新视图 B、查询
C、在视图上定义新的基本表 D、在视图上定义新视图
31,在 WHERE子句的条件表达式中,可以用
()通配符与所在位置的单个字符相匹配。
A),B)% C)? D) _
32,向基本表中增加一个新列后,原有元组在该列上的值是()
A) True B) False C)空值 D)不确定
33,嵌入式 SQL语句中引用主变量时,必须在变量名前加()标志。
A、逗号 B、冒号 C、分号 D、句号
34,在 SELECT语句中,与关系代数中 ∏运算符对应的是()子句
A,SELECT B,FROM
C,WHERE D,GROUP BY
35,在 SELECT语句的下列子句中,通常和 HAVING子句同时使用的是()
A,ORDER BY B,WHERE
C,GROUP BY D、均不需要
36,假定学生关系是 S( S#,Sname,Sex,
Age),课程关系是 C( C#,Cname,
TEACHER),学生选课关系是 SC( S#,
C#,Grade)。要查找选修,数据库系统概论,课程的,男,学生学号,将涉及关系()
A,S B,SC,C
C,S,SC D,S,SC,C
37、为什么将 SQL的视图称为,虚表,?
38、所有的视图是否都可以更新?为什么?
39、相关子查询和不相关子查询在执行上有什么不同?
40、在嵌入式 SQL中是如何区分 SQL语句和主语言语句的?
41、在嵌入式 SQL中是如何解决数据库工作单元与源程序工作单元之间通信的?
42、试述 DELETE语句与 DROP TABLE语句的区别。
43,SQL的集合处理方式与宿主语言的单记录处理方式之间是如何协调的?
S( S#,SNAME,AGE,SEX),
SC(S#,C#,GRADE),
C(C#,CNAME,TEACHER),
用 SQL语句写出下列对 S,SC,C的查询要求:
1)统计有学生选修的课程门数
2)求选修 C4课程的女学生的平均成绩
3)求 LIU老师所授课程的每门课的平均成绩
4)统计每门课程的学生选修人数(超过 10人的课程才统计)。要求显示课程号和人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
5)检索学号比 WANG同学大,而年龄比他小的学生姓名
6)在表 SC中检索成绩为空值的学生学号和课程号
7)检索姓名以 L打头的所有学生的姓名和年龄
8)求年龄大于女同学平均年龄的男生姓名和年龄
9)往关系 C中插入一个课程元组
( ’ C8‘,‘VC++‘,‘BAO‘)
10)检索所授每门课程平均成绩均大于 80分的教师姓名,并把检索到的值送往另一个已存在的表 FACULTY( TNAME)
11)在 SC中删除尚无成绩的选课元组
12)把 MATHS课不及格的成绩全改为 60分
13)在表 SC中,当某个成绩低于全部课程的平均成绩时,提高 5%。
设有基本表 R( A,B,C)和 S( A,B,C),试用 SQL语句表示下列关系代数表达式。
① R U S ② R ∩ S
③ R- S ④ R× S
⑤ ∏A,B(R) ∏B,C(S)
⑥ ∏1,6(σ3=4(R× S))
⑦ ∏1,2,3((R S))
8,R÷ ∏C(S)
下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第四章 关系系统及其查询优化第四章 关系系统及其查询优化
4.1 关系系统
4.2 关系系统的查询优化
4.3 小结关系系统
能够 在一定程度上 支持关系模型的数据库管理系统是关系系统 。
由于关系模型中并非每一部分都是 同等 重要的
并不苛求一个实际的关系系统必须 完全 支持关系模型 。
关系系统与关系模型
关系数据结构
域及域上定义的关系
关系操作
并、交、差、广义笛卡尔积、选择、投影、连接、
除等
关系完整性
实体完整性、参照完整性、用户自己定义的完整性关系系统的定义一个数据库管理系统可定义为关系系统,当且仅当它至少支持:
1,关系数据库 ( 即关系数据结构 )
系统中只有表这种结构
2,支持选择、投影和(自然)连接运算对这些运算不要求用户定义任何物理存取路径对关系系统的 最低 要求关系系统的定义
● 不支持关系数据结构的系统显然不能称为关系系统
● 仅支持关系数据结构,但没有选择,投影和连接运算功能的系统仍不能算作关系系统 。
原因:不能提高用户的生产率
支持选择、投影和连接运算,但要求定义物理存取路径,这种系统也不能算作真正的关系系统
原因:就降低或丧失了数据的物理独立性
选择、投影、连接运算是最有用的运算
4.1.2 关系系统的分类
分类依据:支持关系模型的程度
分类
⒈ 表式系统:支持关系数据结构 (即表 )
⒉ (最小 )关系系统支持:关系数据结构选择、投影、连接关系操作
⒊ 关系完备的系统支持:关系数据结构所有的关系代数操作
⒋ 全关系系统支持:关系模型的所有特征特别是,数据结构中域的概念关系系统的分类 (续)
数据结构 数据操作 完整性表式系统 表
(最小 )关系系统 表 选择,投影,
连接
关系完备的系统 表
全关系系统
第四章 关系系统及其查询优化
4.1 关系系统
4.2 关系系统的查询优化
4.3 小结
4.2 关系系统的查询优化
4.2.1 查询优化概述
4.2.2 查询优化的必要性
4.2.3 查询优化的一般准则
4.2.4 关系代数等价变换规则
4.2.5 关系代数表达式的优化算法
4.2.6 优化的一般步骤
4.2.1 查询优化概述
查询优化的必要性
查询优化极大地影响 RDBMS的性能 。
查询优化的可能性
关系数据语言的 级别很高,使 DBMS可以从关系表达式中分析查询 语义 。
由 DBMS进行查询优化的好处
用户不必考虑如何最好地表达查询以获得较好的效率
系统可以比用户程序的 优化 做得更好
(1) 优化器可以从数据字典中获取许多统计信息,
而用户程序则难以获得这些信息由 DBMS进行查询优化的好处
(2)如果数据库的物理统计信息改变了,系统可以自动对查询 重新优化 以选择相适应的执行计划 。
在非关系系统中必须重写程序,而重写程序在实际应用中往往是不太可能的 。
(3)优化器可以考虑数百种不同的执行计划,而程序员一般只能考虑有限的几种可能性 。
(4)优化器中包括了很多复杂的优化技术查询优化目标
查询优化的总目标选择有效策略,求得给定关系表达式的值
实际系统的查询优化步骤
1,将查询转换成某种内部表示,通常是语法树
2,根据一定的等价变换规则把语法树转换成标准
( 优化 ) 形式实际系统的查询优化步骤
3,选择低层的操作算法对于语法树中的每一个操作
计算各种执行算法的执行代价
选择代价小的执行算法
4,生成查询计划 (查询执行方案 )
查询计划是由一系列内部操作组成的 。
代价模型
集中式数据库
单用户系统总代价 = I/O代价 + CPU代价
多用户系统总代价 = I/O代价 + CPU代价 + 内存代价
分布式数据库总代价 = I/O代价 + CPU代价 [+ 内存代价 ] + 通信代价
4.2.2 查询优化的必要性例:求选修了课程C 2的学生姓名
SELECT Student.Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno
AND SC.Cno='2';
查询优化的必要性(续)
假设 1:外存:
Student:1000条,SC:10000条,选修 2号课程,50条假设 2:一个内存块装元组,10个 Student,或 100个 SC,
内存中一次可以存放,5块 Student元组,
1块 SC元组和若干块连接结果元组假设 3:读写速度,20块 /秒假设 4:连接方法,基于数据块 的嵌套循环法执行策略 1
Q 1 = П S name(бStudent.Sno=SC.Sno ∧ SC.Cno='2'
(Student× SC))
① Student× SC
读取总块数 = 读 Student表块数 + 读 SC表遍数
*每遍块数
=1000/10+(1000/(10× 5)) × (10000/100)
=100+20× 100=2100
读数据时间 =2100/20=105秒不同的执行策略,考虑 I/O时间中间结果大小 = 1000*10000 = 107 (1千万条元组 )
写中间结果时间 = 10000000/10/20 = 50000秒
② б
读数据时间 = 50000秒
③ П
总时间 =105+ 50000+ 50000秒 = 100105秒
= 27.8小时查询优化的必要性(续)
2,Q 2= ПS name(бSC.Cno=' 2' (Student SC))
①
读取总块数 = 2100块读数据时间 =2100/20=105秒中间结果大小 =10000 ( 减少 1000倍 )
写中间结果时间 =10000/10/20=50秒
② б
读数据时间 =50秒
③ П
总时间 = 105+ 50+ 50秒= 205秒 =3.4分查询优化的必要性(续)
3,Q 2= ПSname(Student бSC.Cno=' 2' (SC))
① б
读 SC表总块数 = 10000/100=100块读数据时间 =100/20=5秒中间结果大小 =50条 不必写入外存
②
读 Student表总块数 = 1000/10=100块读数据时间 =100/20=5秒
③ П
总时间 = 5+ 5秒= 10秒查询优化的必要性(续)
4,Q 2= ПS name(Student бSC.Cno='2' (SC))
假设 SC表在 Cno上有索引,Student表在 Sno上有索引
① б
读 SC表索引 =
读 SC表总块数 = 50/100<1块读数据时间中间结果大小 =50条 不必写入外存查询优化的必要性(续)
②
读 Student表索引 =
读 Student表总块数 = 50/10=5块读数据时间
③ П
总时间 <10秒
4.2.3 查询优化的一般准则
选择运算应尽可能先做
目的:减小中间关系
在执行连接操作前对关系适当进行预处理
按连接属性排序
在连接属性上建立索引
投影运算和选择运算同时做
目的:避免重复扫描关系
将投影运算与其前面或后面的双目运算结合
目的:减少扫描关系的遍数查询优化的一般准则 (续)
某些选择运算+在其前面执行的笛卡尔积
===> 连接运算例,бStudent.Sno=SC.Sno (Student× SC)
Student SC
提取公共子表达式
4.2.4 关系代数等价变换规则
关系代数表达式等价
指用相同的关系代替两个表达式中相应的关系所得到的结果是相同的
上面的优化策略大部分都涉及到代数表达式的变换常用的等价变换规则设 E1,E2等是关系代数表达式,F是条件表达式
l,连接、笛卡尔积交换律
E1× E2≡ E2× E1
E1 E2≡ E2 E1
E1 F E2≡ E2 F E1
关系代数等价变换规则(续)
2,连接,笛卡尔积的结合律
(E1× E2) × E3 ≡ E1 × (E2× E3)
(E1 E2) E3 ≡ E1 (E2 E3)
(E1 E2) E3 ≡ E1 (E2 E3)
F F F F
关系代数等价变换规则(续)
3,投影的串接定律
πA1,A2,?,An(π B1,B2,?,Bm(E))≡ πA1,A2,?,An (E)
假设:
1)E是关系代数表达式
2)Ai(i=1,2,…,n),Bj(j=l,2,…,m)是属性名
3){A1,A2,…,An}构成 {Bl,B2,…,Bm}的子集关系代数等价变换规则(续)
4,选择的串接定律
бF1 ( б F2( E)) ≡ бF1∧ F2(E)
选择的串接律说明 选择条件可以合并
这样一次就可检查全部条件 。
关系代数等价变换规则(续)
5,选择与投影的交换律
(1)假设,选择条件 F只涉及属性 A1,…,An
бF (πA1,A2,?,An(E))≡ πA1,A2,?,An(бF(E))
(2)假设,F中有不属于 A1,…,An的属性 B1,…,Bm
π A1,A2,?,An (бF (E))≡
πA1,A2,?,An(бF (πA1,A2,?,An,B1,B2,?,Bm(E)))
关系代数等价变换规则(续)
6,选择与笛卡尔积的交换律
(1) 假设,F中涉及的属性都是 E1中的属性
бF (E1× E2)≡ бF (E1)× E2
(2) 假设,F=F1∧ F2,并且 F1只涉及 E1中的属性,
F2只涉及 E2中的属性则由上面的等价变换规则 1,4,6可推出:
бF(E1× E2) ≡ бF1(E1)× бF2 (E2)
关系代数等价变换规则(续)
(3) 假设,F=F1∧ F2,
F1只涉及 E1中的属性,
F2涉及 E1和 E2两者的属性
бF(E1× E2)≡ б F2(бF1(E1)× E2)
它使部分选择在笛卡尔积前先做关系代数等价变换规则(续)
7,选择与并的交换假设,E=E1∪ E2,E1,E2有相同的属性名
бF(E1∪ E2)≡ бF(E1)∪ бF(E2)
8,选择与差运算的交换假设,E1与 E2有相同的属性名
бF(E1-E2)≡ бF(E1) - бF(E2)
关系代数等价变换规则(续)
9,投影与笛卡尔积的交换假设,E1和 E2是两个关系表达式,
A1,…,An是 E1的属性,
B1,…,Bm是 E2的属性
π A1,A2,…,An,B1,B2,…,Bm ( E1× E2)≡
π A1,A2,…,An( E1)× π B1,B2,…,Bm(E2)
关系代数等价变换规则(续)
l0,投影与并的交换假设,E1和 E2 有相同的属性名
π A1,A2,…,An(E1∪ E2)≡
π A1,A2,…,An(E1)∪ π A1,A2,…,An(E2)
小结
1-2,连接,笛卡尔积 的交换律,结合律
3,合并或分解 投影 运算
4,合并或分解 选择 运算
5-8,选择运算与其他运算交换
5,9,10,投影运算与其他运算交换
4.2 关系系统的查询优化
4.2.1 查询优化概述
4.2.2 查询优化的必要性
4.2.3 查询优化的一般准则
4.2.4 关系代数等价变换规则
4.2.5 关系代数表达式的优化算法
4.2.6 优化的一般步骤
4.2.5 关系代数表达式的优化算法算法:关系表达式的优化输入:一个关系表达式的语法树 。
输出:计算该表达式的程序 。
方法:
( 1) 分解选择运算利用规则 4把形如 бF1 ∧ F2 ∧ … ∧ Fn (E)变换为
бF1 (бF2(… (бFn(E))… ))
关系代数表达式的优化算法 (续 )
( 2) 通过交换选择运算,将其尽可能移到叶端对每一个选择,利用规则 4~ 8尽可能把它移到树的叶端 。
( 3) 通过交换投影运算,将其尽可能移到叶端对每一个投影利用规则 3,9,l0,5中的一般形式尽可能把它移向树的叶端 。
关系代数表达式的优化算法 (续 )
( 4) 合并串接的选择和投影,以便能同时执行或在一次扫描中完成
利用规则 3~ 5把选择和投影的串接合并成单个选择,单个投影或一个选择后跟一个投影 。
使多个选择或投影能同时执行,或在一次扫描中全部完成
尽管这种变换似乎违背,投影尽可能早做,
的原则,但这样做效率更高 。
关系代数表达式的优化算法 (续 )
( 5) 对内结点分组
把上述得到的语法树的内节点分组 。
每一双目运算 (×,,∪,-)和它所有的直接祖先为一组 (这些直接祖先是 б,π运算 )。
如果其后代直到叶子全是单目运算,则也将它们并入该组,但当双目运算是笛卡尔积
(× ),而且其后的选择不能与它结合为等值连接时除外 。 把这些单目运算单独分为一组 。
关系代数表达式的优化算法 (续 )
( 6) 生成程序
生成一个程序,每组结点的计算是程序中的一步 。
各步的顺序是任意的,只要保证任何一组的计算不会在它的后代组之前计算 。
4.2 关系系统的查询优化
4.2.1 查询优化概述
4.2.2 查询优化的必要性
4.2.3 查询优化的一般准则
4.2.4 关系代数等价变换规则
4.2.5 关系代数表达式的优化算法
4.2.6 优化的一般步骤
4.2.6 优化的一般步骤
1,把查询转换成某种内部表示
2,代数优化:把语法树转换成标准 ( 优化 )
形式
3,物理优化:选择低层的存取路径
4.生成查询计划,选择代价最小的优化的一般步骤 (续 )
( 1) 把查询转换成某种内部表示例:求选修了课程C 2的学生姓名
SELECT Student.Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno
AND SC.Cno='2';
( 1)把查询转换成某种内部表示语法树 结果
project(Sname)
select(SC.Cno=?2?)
join(Student.Sno=SC.Sno)
Student SC
关系代数语法树
πSname
SC.Cno=’2’
Student.Sno=SC.S
×
Student SC
( 2)代数优化利用优化算法把语法树转换成标准 ( 优化 ) 形式
πSname
Student.Sno=SC.Sno
SC.Cno=?2?
×
Student
SC
( 3)物理优化:选择低层的存取路径
- 优化器查找数据字典获得当前数据库状态信息
选择字段上是否有索引
连接的两个表是否有序
连接字段上是否有索引
– 然后根据一定的优化规则选择存取路径如本例中若 SC表上建有 Cno的索引,则应该利用这个索引,而不必顺序扫描 SC表 。
( 4)生成查询计划,选择代价最小的
– 在作连接运算时,若两个表 (设为 R1,R2)均无序,连接属性上也没有索引,则可以有下面几种查询计划,
对两个表作排序预处理
对 R1在连接属性上建索引
对 R2在连接属性上建索引
在 R1,R2的连接属性上均建索引
– 对不同的查询计划计算代价,选择代价最小的一个 。
– 在计算代价时主要考虑磁盘读写的 I/O数,内存 CPU处理时间在粗略计算时可不考虑 。
第四章 关系系统及其查询优化
4.1 关系系统
4.2 关系系统的查询优化
4.3 小结
4.3 小结
关系系统
关系系统的定义一个数据库管理系统可定义为关系系统,当且仅当它至少支持:
1,关系数据库 ( 即关系数据结构 )
2,支持选择、投影和(自然)连接运算,
且不要求用户定义任何物理存取路径小结 (续)
关系系统的分类
表式系统
(最小 )关系系统
关系完备系统
全关系系统小结 (续)
关系系统的查询优化
代数优化:关系代数表达式的优化
关系代数等价变换规则
关系代数表达式的优化算法
物理优化:存取路径和低层操作算法的选择下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第五章 关系数据理论第五章 关系数据理论
5.1 问题的提出
5.2 规范化
5.3 数据依赖的公理系统
*5.4 模式的分解
5.5 小结
5.1 问题的提出关系数据库逻辑设计
针对具体问题,如何构造一个适合于它的数据模式
数据库逻辑设计的工具 ── 关系数据库的规范化理论问题的提出一、概念回顾二、关系模式的形式化定义三、什么是数据依赖四、关系模式的简化定义五、数据依赖对关系模式影响一、概念回顾
关系,描述实体、属性、实体间的联系。
从形式上看,它是一张二维表,是所涉及属性的笛卡尔积的一个子集。
关系模式,用来定义关系。
关系数据库,基于关系模型的数据库,利用关系来描述现实世界。
从形式上看,它由一组关系组成。
关系数据库的模式,定义这组关系的关系模式的全体。
二、关系模式的形式化定义关系模式由五部分组成,即它是一个五元组:
R(U,D,DOM,F)
R,关系名
U,组成该关系的属性名集合
D,属性组 U中属性所来自的域
DOM:属性向域的映象集合
F,属性间数据的依赖关系集合三、什么是数据依赖
1,完整性约束的表现形式
限定属性取值范围:例如学生成绩必须在 0-100之间
定义属性 值 间的相互关连(主要体现于值的 相等与否 ),这就是数据依赖,它是数据库模式设计的关键什么是数据依赖(续)
2,数据依赖
是通过一个关系中属性间值的相等与否体现出来的数据间的相互关系
是现实世界属性间相互联系的抽象
是数据内在的性质
是 语义 的体现什么是数据依赖(续)
3,数据依赖的类型
函数依赖( Functional Dependency,简记为 FD)
多值依赖( Multivalued Dependency,简记为 MVD)
其他四、关系模式的简化表示
● 关系模式 R( U,D,DOM,F)
简化为一个三元组:
R( U,F)
● 当且仅当 U上的一个关系 r 满足 F时,r称为关系 模式 R( U,F)的一个 关系五,数据依赖对关系模式的影响例:描述学校的数据库:
学生的学号( Sno)、所在系( Sdept)
系主任姓名( Mname)、课程名( Cname)
成绩( Grade)
单一 的关系模式,Student <U,F>
U ={ Sno,Sdept,Mname,Cname,Grade }
数据依赖对关系模式的影响(续)
学校数据库的语义:
⒈ 一个系有若干学生,一个学生只属于一个系;
⒉ 一个系只有一名主任;
⒊ 一个学生可以选修多门课程,每门课程有若干学生选修;
⒋ 每个学生所学的每门课程都有一个成绩。
数据依赖对关系模式的影响(续)
属性组 U上的一组函数依赖 F:
F ={ Sno → Sdept,Sdept → Mname,
(Sno,Cname) → Grade }
Sno Cname
Sdept Mname
Grade
关系模式 Student<U,F>中存在的问题
⒈ 数据冗余太大
浪费大量的存储空间例:每一个系主任的姓名重复出现
⒉ 更新异常( Update Anomalies)
数据冗余,更新数据时,维护数据完整性代价大。
例:某系更换系主任后,系统必须修改与该系学生有关的每一个元组关系模式 Student<U,F>中存在的问题
⒊ 插入异常( Insertion Anomalies)
该插的数据插不进去例,如果一个系刚成立,尚无学生,我们就无法把这个系及其系主任的信息存入数据库。
⒋ 删除异常( Deletion Anomalies)
不该删除的数据不得不删例,如果某个系的学生全部毕业了,我们在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了。
数据依赖对关系模式的影响(续)
结论:
Student关系模式不是一个好的模式。
,好,的模式:
不会发生插入异常、删除异常、更新异常,
数据冗余应尽可能少。
原因,由存在于模式中的 某些数据依赖 引起的解决方法,通过 分解 关系模式来消除其中不合适的数据依赖。
5.2 规范化规范化理论 正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、
更新异常和数据冗余问题。
5.2.1 函数依赖一、函数依赖二、平凡函数依赖与非平凡函数依赖三、完全函数依赖与部分函数依赖四、传递函数依赖一、函数依赖定义 5.1 设 R(U)是一个属性集 U上的关系模式,X和 Y
是 U的子集。
若对于 R(U)的 任意 一个可能的关系 r,r中不可能存在两个元组在 X上的属性值相等,而在 Y上的属性值不等,
则称,X函数确定 Y‖ 或,Y函数依赖于 X‖,记作 X→ Y。
X称为这个函数依赖的 决定属性集 (Determinant)。
Y=f(x)
说明:
1,函数依赖不是指关系模式 R的某个或某些关系实例满足的约束条件,而是指 R的 所有关系实例 均要满足的约束条件。
2,函数依赖是 语义范畴 的概念。只能根据数据的语义来确定函数依赖。
例如,姓名 → 年龄,这个函数依赖只有在不允许有同名人的条件下成立
3,数据库设计者可以对现实世界作强制的规定。例如规定不允许同名人出现,函数依赖,姓名 → 年龄,成立。所插入的元组必须满足规定的函数依赖,若发现有同名人存在,
则拒绝装入该元组。
函数依赖(续)
例,Student(Sno,Sname,Ssex,Sage,Sdept)
假设不允许重名,则有,
Sno → Ssex,Sno → Sage,Sno → Sdept,
Sno ←→ Sname,Sname → Ssex,Sname → Sage
Sname → Sdept
但 Ssex → Sage
若 X→ Y,并且 Y→ X,则记为 X←→ Y。
若 Y不函数依赖于 X,则记为 X─→ Y。
二、平凡函数依赖与非平凡函数依赖在关系模式 R(U)中,对于 U的子集 X和 Y,
如果 X→ Y,但 Y? X,则称 X→ Y是 非平凡的函数依赖若 X→ Y,但 Y? X,则称 X→ Y是 平凡的函数依赖例:在关系 SC(Sno,Cno,Grade)中,
非平凡函数依赖,(Sno,Cno) → Grade
平凡函数依赖,(Sno,Cno) → Sno
(Sno,Cno) → Cno
平凡函数依赖与非平凡函数依赖(续)
于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义,因此若不特别声明,我们总是讨论非平凡函数依赖 。
三、完全函数依赖与部分函数依赖定义 5.2 在关系模式 R(U)中,如果 X→ Y,并且对于 X
的任何一个真子集 X‘,都有
X‘ Y,则称 Y完全函数依赖于 X,记作 X f Y。
若 X→ Y,但 Y不完全函数依赖于 X,则称 Y部分函数依赖 于 X,记作 X P Y。
完全函数依赖与部分函数依赖(续)
例,在关系 SC(Sno,Cno,Grade)中,
由于,Sno → Grade,Cno → Grade,
因此,(Sno,Cno) f Grade
四、传递函数依赖定义 5.3 在关系模式 R(U)中,如果 X→ Y,Y→ Z,
且 Y?X,Y→ X,则称 Z传递函数依赖 于 X。
注,如果 Y→ X,即 X←→ Y,则 Z直接依赖 于 X。
例,在关系 Std(Sno,Sdept,Mname)中,有:
Sno → Sdept,Sdept → Mname
Mname传递函数依赖于 Sno
5.2.2 码定义 5.4 设 K为关系模式 R<U,F>中的属性或属性组合。
若 K f U,则 K称为 R的一个 侯选码 ( Candidate Key)。
若关系模式 R有多个候选码,则选定其中的一个做为 主码 ( Primary key)。
主属性与非主属性
ALL KEY
外部码定义 5.5 关系模式 R 中属性或属性组 X
并非 R的码,但 X 是另一个关系模式的码,则称 X 是 R 的 外部码( Foreign
key) 也称外码
主码又和外部码一起提供了表示关系间联系的手段 。
5.2.3 范式
范式是符合某一种级别的关系模式的集合。
关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。
范式的种类:
第一范式 (1NF)
第二范式 (2NF)
第三范式 (3NF)
BC范式 (BCNF)
第四范式 (4NF)
第五范式 (5NF)
5.2.3 范式
各种范式之间存在联系:
某一关系模式 R为第 n范式,可简记为 R? nNF。
NF5NF4B C N FNF3NF2NF1
5.2.4 2NF
1NF的定义如果一个关系模式 R的所有属性都是 不可分的基本数据项,则 R? 1NF。
第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库。
但是满足第一范式的关系模式并不一定是一个好的关系模式。
2NF
例,关系模式 SLC(Sno,Sdept,Sloc,Cno,
Grade)
Sloc为学生住处,假设每个系的学生住在同一个地方。
函数依赖包括:
(Sno,Cno) f Grade
Sno → Sdept
(Sno,Cno) P Sdept
Sno → Sloc
(Sno,Cno) P Sloc
Sdept → Sloc
2NF
SLC的码为 (Sno,Cno)
SLC满足第一范式。
非主属性 Sdept和 Sloc部分函数依赖于码 (Sno,Cno)
Sno
Cno
Grade
Sdept
Sloc
SLC
SLC不是一个好的关系模式
(1) 插入异常假设 Sno= 95102,Sdept= IS,Sloc= N的学生还未选课,因课程号是主属性,因此该学生的信息无法插入 SLC。
(2) 删除异常假定某个学生本来只选修了 3号课程这一门课。现在因身体不适,他连 3号课程也不选修了。因课程号是主属性,此操作将导致该学生信息的整个元组都要删除。
SLC不是一个好的关系模式(3) 数据冗余度大如果一个学生选修了 10门课程,那么他的 Sdept和
Sloc值就要重复存储了 10次。
(4) 修改复杂例如学生转系,在修改此学生元组的 Sdept值的同时,还可能需要修改住处( Sloc)。如果这个学生选修了 K门课,则必须无遗漏地修改 K个元组中全部
Sdept,Sloc信息。
2NF
原因
Sdept,Sloc部分函数依赖于码。
解决方法
SLC分解为两个关系模式,以消除这些部分函数依赖
SC( Sno,Cno,Grade)
SL( Sno,Sdept,Sloc)
2NF
SLC的码为 (Sno,Cno)
SLC满足第一范式。
非主属性 Sdept和 Sloc部分函数依赖于码 (Sno,Cno)
Sno
Cno
Grade
Sdept
Sloc
SLC
2NF
函数依赖图,
Sno
Cno
Grade
SC SL
Sno
Sdept
Sloc
2NF
2NF的定义定义 5.6 若关系模式 R? 1NF,并且每一个 非主属性都 完全 函数依赖于 R的码,则 R? 2NF。
例,SLC(Sno,Sdept,Sloc,Cno,Grade)? 1NF
SLC(Sno,Sdept,Sloc,Cno,Grade)
2NF SC( Sno,Cno,Grade)? 2NF
SL( Sno,Sdept,Sloc)? 2NF
第二范式(续)
采用投影分解法将一个 1NF的关系分解为多个
2NF的关系,可以在一定程度上减轻原 1NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
将一个 1NF关系分解为多个 2NF的关系,并不能完全消除关系模式中的各种异常情况和数据冗余。
5.2.5 3NF
例,2NF关系模式 SL(Sno,Sdept,Sloc)中
函数依赖:
Sno→ Sdept
Sdept→ Sloc
Sno→ Sloc
Sloc传递函数依赖于 Sno,即 SL中存在非主属性对码的传递函数依赖。
3NF
函数依赖图,
SL
Sno
Sdept
Sloc
3NF
解决方法采用投影分解法,把 SL分解为两个关系模式,以消除传递函数依赖:
SD( Sno,Sdept)
DL( Sdept,Sloc)
SD的码为 Sno,DL的码为 Sdept。
3NF
SD的码为 Sno,DL的码为 Sdept。
Sno Sdept
SD
Sdept Sloc
DL
3NF
3NF的定义定义 5.8 关系模式 R<U,F> 中若不存在这样的码 X、属性组 Y及 非主属性 Z( Z? Y),使得
X→ Y,Y → X,Y→ Z,成立,则称 R<U,F>
3NF。
例,SL(Sno,Sdept,Sloc)? 2NF
SL(Sno,Sdept,Sloc)? 3NF
SD( Sno,Sdept)? 3NF
DL( Sdept,Sloc)? 3NF
3NF
若 R? 3NF,则 R的每一个 非主属性 既不部分函数依赖于候选码也不传递函数依赖于候选码。
如果 R? 3NF,则 R也是 2NF。
采用投影分解法将一个 2NF的关系分解为多个 3NF的关系,
可以在一定程度上解决原 2NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
将一个 2NF关系分解为多个 3NF的关系后,并不能完全消除关系模式中的各种异常情况和数据冗余。
5.2.6 BC范式( BCNF)
定义 5.9 设关系模式 R<U,F>? 1NF,如果对于 R的 每个函数依赖 X→ Y,若 Y不属于 X,则 X必含有候选码,那么 R? BCNF。
若 R? BCNF
每一个决定属性集(因素)都包含(候选)码
R中的所有属性(主,非主属性)都完全函数依赖于码
R? 3NF(证明)
若 R? 3NF 则 R不一定? BCNF
BCNF
例:在关系模式 STJ( S,T,J)中,S表示学生,
T表示教师,J表示课程。
每一教师只教一门课。每门课由若干教师教,某一学生选定某门课,就确定了一个固定的教师。某个学生选修某个教师的课就确定了所选课的名称,
(S,J)→ T,(S,T)→ J,T→ J
5.2.6 BCNF
S
J
T
S
T
J
STJ
BCNF
STJ? 3NF
(S,J)和 (S,T)都可以作为候选码
S,T,J都是主属性
STJ? BCNF
T→ J,T是决定属性集,T不是候选码
BCNF
解决方法:将 STJ分解为二个关系模式:
SJ(S,J)? BCNF,TJ(T,J)? BCNF
没有 任何属性 对码的部分函数依赖和传递函数依赖
S J
ST
T J
TJ
3NF与 BCNF的关系
如果关系模式 R? BCNF,
必定有 R? 3NF
如果 R? 3NF,且 R只有一个候选码,
则 R必属于 BCNF。
BCNF的关系模式所具有的性质
⒈ 所有 非主属性 都完全函数依赖于每个候选码
⒉ 所有 主属性 都完全函数依赖于每个不包含它的候选码
⒊ 没有任何属性完全函数依赖于 非码 的任何一组属性
5.2.5 多值依赖与第四范式( 4NF)
例,学校中某一门课程由多个教师讲授,他们使用相同的一套参考书。
关系模式 Teaching(C,T,B)
课程 C、教师 T 和 参考书 B
……
…
课 程 C 教 员 T 参 考 书 B
物理数学计算数学李 勇王 军李 勇张 平张 平周 峰普通物理学光学原理物理习题集数学分析微分方程高等代数数学分析表 5.1
普通物理学光学原理物理习题集普通物理学光学原理物理习题集数学分析微分方程高等代数数学分析微分方程高等代数
…
李 勇李 勇李 勇王 军王 军王 军李 勇李 勇李 勇张 平张 平张 平
…
物 理物 理物 理物 理物 理物 理数 学数 学数 学数 学数 学数 学
…
参考书 B教员 T课程 C
用二维表表示 Teaching
多值依赖与第四范式(续)
Teaching? BCNF:
Teach具有唯一候选码 (C,T,B),即全码
Teaching模式中存在的问题
(1)数据冗余度大:有多少名任课教师,参考书就要存储多少次多值依赖与第四范式(续)
(2)插入操作复杂:当某一课程增加一名任课教师时,
该课程有多少本参照书,就必须插入多少个元组例如物理课增加一名教师刘关,需要插入两个元组:
(物理,刘关,普通物理学)
(物理,刘关,光学原理)
多值依赖与第四范式(续)
(3) 删除操作复杂:某一门课要去掉一本参考书,
该课程有多少名教师,就必须删除多少个元组
(4) 修改操作复杂:某一门课要修改一本参考书,
该课程有多少名教师,就必须修改多少个元组
产生原因,存在多值依赖一、多值依赖
定义 5.10
设 R(U)是一个属性集 U上的一个关系模式,X,Y和 Z
是 U的子集,并且 Z= U- X- Y,多值依赖 X→→ Y成立当且仅当对 R的 任一关系 r,r在( X,Z)上的每个值对应一组 Y的值,这组值仅仅决定于 X值而与 Z值无关例 Teaching( C,T,B)
对于 C的每一个值,T有一组值与之对应,而不论 B取何值一、多值依赖
在 R( U)的任一关系 r中,如果存在元组 t,s 使得
t[X]=s[X],那么就必然存在元组 w,v? r,( w,v可以与 s,t相同),使得 w[X]=v[X]=t[X],而 w[Y]=t[Y],
w[Z]=s[Z],v[Y]=s[Y],v[Z]=t[Z](即交换 s,t元组的 Y
值所得的两个新元组必在 r中),则 Y多值依赖于 X,记为
X→→ Y。 这里,X,Y是 U的子集,Z=U-X-Y。
t x y1 z2
s x y2 z1
w x y1 z1
v x y2 z2
多值依赖(续)
平凡多值依赖和非平凡的多值依赖
若 X→→ Y,而 Z= φ,则称
X→→ Y为 平凡的多值依赖
否则称 X→→ Y为 非平凡的多值依赖多值依赖的性质
( 1)多值依赖具有对称性若 X→→ Y,则 X→→ Z,其中 Z= U- X- Y
多值依赖的对称性可以用完全二分图直观地表示出来。
( 2)多值依赖具有传递性若 X→→ Y,Y→→ Z,则 X→→ Z -Y
多值依赖的对称性
Xi
Zi1 Zi2 … Zim
Yi1 Yi2 … Yin
多值依赖的对称性物理普通物理学 光学原理 物理习题集李勇 王军多值依赖(续)
( 3)函数依赖是多值依赖的特殊情况。
若 X→ Y,则 X→→ Y。
( 4)若 X→→ Y,X→→ Z,则 X→→ Y? Z。
( 5)若 X→→ Y,X→→ Z,则 X→→ Y∩ Z。
( 6)若 X→→ Y,X→→ Z,则 X→→ Y-Z,
X→→ Z -Y。
多值依赖与函数依赖的区别
(1) 有效性
多值依赖的有效性与属性集的范围有关若 X→→ Y在 U上成立,则在 W( X Y? W? U)上一定成立;反之则不然,即 X→→ Y在 W( W? U)上成立,在 U上并不一定成立
多值依赖的定义中不仅涉及属性组 X和 Y,而且涉及 U中其余属性 Z。
一般地,在 R( U)上若有 X→→ Y在 W( W? U)
上成立,则称 X→→ Y为 R( U)的嵌入型多值依赖多值依赖与函数依赖的区别
只要在 R( U)的任何一个关系 r中,元组在 X和
Y上的值满足定义 5.l(函数依赖),
则函数依赖 X→ Y在任何属性集 W( X Y? W
U)上成立 。
多值依赖(续)
(2)
若函数依赖 X→ Y在 R( U)上成立,则对于任何 Y'? Y均有 X→ Y' 成立
多值依赖 X→→ Y若在 R(U)上成立,不能断言对于任何 Y'? Y有 X→→ Y' 成立二、第四范式( 4NF)
定义 5.10 关系模式 R<U,F>? 1NF,如果对于 R的每个非平凡多值依赖 X→→ Y( Y? X),
X都含有候选码,则 R? 4NF。
( X→ Y)
如果 R? 4NF,则 R? BCNF
不允许 有非平凡且非函数依赖的 多值依赖允许 的是 函数依赖 (是非平凡多值依赖)
第四范式(续)
例,Teach(C,T,B)? 4NF
存在非平凡的多值依赖 C→→ T,且 C不是候选码
用投影分解法把 Teach分解为如下两个关系模式:
CT(C,T)? 4NF
CB(C,B)? 4NF
C→→ T,C→→ B是平凡多值依赖
5.2 规范化
5.2.1 第一范式( 1NF)
5.2.2 第二范式( 2NF)
5.2.3 第三范式( 3NF)
5.2.4 BC范式( BCNF)
5.2.5 多值依赖与第四范式( 4NF)
5.2.6 规范化
5.2.6 规范化
关系数据库的规范化理论是数据库逻辑设计的工具。
一个关系只要其分量都是不可分的数据项,它就是规范化的关系,但这只是最基本的规范化。
规范化程度可以有多个不同的级别规范化(续)
规范化程度过低的关系不一定能够很好地描述现实世界,可能会存在插入异常、删除异常、
修改复杂、数据冗余等问题
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式集合,
这种过程就叫 关系模式的规范化规范化(续)
关系模式规范化的基本步骤
1NF
↓ 消除非主属性对码的部分函数依赖消除决定属性 2NF
集非码的非平 ↓ 消除非主属性对码的传递函数依赖凡函数依赖 3NF
↓ 消除主属性对码的部分和传递函数依赖
BCNF
↓ 消除非平凡且非函数依赖的多值依赖
4NF
规范化的基本思想
消除不合适的数据依赖
的各关系模式达到某种程度的,分离,
采用,一事一地,的模式设计原则让一个关系描述一个概念、一个实体或者实体间的一种联系。若多于一个概念就把它,分离,出去
所谓规范化实质上是概念的单一化规范化(续)
不能说规范化程度越高的关系模式就越好
在设计数据库模式结构时,必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式
上面的规范化步骤可以在其中任何一步终止第五章 关系数据理论
5.1 数据依赖
5.2 规范化
5.3 数据依赖的公理系统
5.4 模式的分解
5.3 数据依赖的公理系统
逻辑蕴含定义 5.11 对于满足一组 函数依赖 F 的关系模式 R <U,F>,其任何一个关系 r,
若函数依赖 X→ Y都成立,则称
F逻辑蕴含 X → Y
Armstrong公理系统
一套推理规则,是模式分解算法的理论基础
用途
求给定关系模式的码
从一组函数依赖求得蕴含的函数依赖
1,Armstrong公理系统关系模式 R <U,F >来说有以下的推理规则:
Al.自反律 ( Reflexivity):
若 Y? X? U,则 X → Y为 F所蕴含。
A2.增广律 ( Augmentation):若 X→ Y为 F所蕴含,
且 Z? U,则 XZ→ YZ为 F所蕴含。
A3.传递律 ( Transitivity):若 X→ Y及 Y→ Z为 F所蕴含,则 X→ Z为 F所蕴含。
注意:由自反律所得到的函数依赖均是平凡的函数依赖,自反律的使用并不依赖于 F
定理 5.l Armstrong推理规则是正确的
( l)自反律,若 Y? X? U,则 X → Y为 F所蕴含证,设 Y? X? U
对 R <U,F> 的任一关系 r中的任意两个元组 t,s:
若 t[X]=s[X],由于 Y? X,有 t[y]=s[y],
所以 X→ Y成立,
自反律得证定理 5.l
(2)增广律,若 X→ Y为 F所蕴含,且 Z? U,则 XZ→ YZ
为 F所蕴含。
证,设 X→ Y为 F所蕴含,且 Z? U。
设 R<U,F> 的任一关系 r中任意的两个元组 t,s;
若 t[XZ]=s[XZ],则有 t[X]=s[X]和 t[Z]=s[Z];
由 X→ Y,于是有 t[Y]=s[Y],所以 t[YZ]=s[YZ],所以
XZ→ YZ为 F所蕴含,
增广律得证。
定理 5.l
(3) 传递律:若 X→ Y及 Y→ Z为 F所蕴含,则
X→ Z为 F所蕴含。
证,设 X→ Y及 Y→ Z为 F所蕴含。
对 R<U,F> 的任一关系 r中的任意两个元组 t,s。
若 t[X]=s[X],由于 X→ Y,有 t[Y]=s[Y];
再由 Y→ Z,有 t[Z]=s[Z],所以 X→ Z为 F所蕴含,
传递律得证。
2,导出规则
1.根据 A1,A2,A3这三条推理规则可以得到下面三条推理规则:
合并规则,由 X→ Y,X→ Z,有 X→ YZ。
( A2,A3)
伪传递规则,由 X→ Y,WY→ Z,有 XW→ Z。
( A2,A3)
分解规则,由 X→ Y及 Z?Y,有 X→ Z。
( A1,A3)
导出规则
2.根据合并规则和分解规则,可得引理 5.1
引理 5.l X→ A1 A2… Ak成立的充分必要条件是 X→ Ai成立( i=l,2,…,k)。
3,函数依赖闭包定义 5.l2 在关系模式 R<U,F>中为 F所逻辑蕴含的函数依赖的全体叫作 F的闭包,记为 F+。
定义 5.13 设 F为属性集 U上的一组函数依赖,X?U,
XF+ ={ A|X→ A能由 F 根据 Armstrong公理导出 },
XF+称为属性集 X关于函数依赖集 F 的闭包
F的闭包
F={X Y,Y Z},F+计算是 NP完全问题,X A1A2...An
F+={
X φ,Y φ,Z φ,XY φ,XZ φ,YZ φ,XYZ φ,
X X,Y Y,Z Z,XY X,XZ X,YZ Y,XYZ X,
X Y,Y Z,XY Y,XZ Y,YZ Z,XYZ Y,
X Z,Y YZ,XY Z,XZ Z,YZ YZ,XYZ Z,
X XY,XY XY,XZ XY,XYZ XY,
X XZ,XY YZ,XZ XZ,XYZ YZ
X YZ,XY XZ,XZ XY,XYZ XZ,
X ZYZ,XY XYZ,XZ XYZ,XYZ XYZ }
关于闭包的引理
引理 5.2
设 F为属性集 U上的一组函数依赖,X,Y? U,
X→ Y能由 F 根据 Armstrong公理导出的充分必要条件是 Y?XF+
用途将判定 X→ Y是否能由 F根据 Armstrong公理导出的问题,
就转化为求出 XF+,判定 Y是否为 XF+的子集的问题求闭包的算法算法 5.l 求属性集 X( X? U)关于 U上的函数依赖集 F 的闭包 XF+
输入,X,F
输出,XF+
步骤:
( 1)令 X( 0) =X,i=0
( 2)求 B,这里 B = { A |(? V)(? W)(V→ W?F
∧ V? X( i) ∧ A? W)};
( 3) X( i+1) =B∪ X( i)
算法 5.l
( 4)判断 X( i+1) = X ( i) 吗?
( 5)若相等或 X( i) =U,则 X( i) 就是 XF+,
算法终止。
( 6)若否,则 i=i+l,返回第( 2)步。
对于算法 5.l,令 ai =|X( i) |,{ai }形成一个步长大于 1的严格递增的序列,序列的上界是 | U |,因此该算法最多 |U| - |X| 次循环就会终止。
Define XF+ = closure of X
= set of attributes functionally determined byX
Basis,XF+,=X
Induction,If Y XF+,and Y A is a given FD,
then add A to XF+
End when XF+ cannot be changed.
Algorithm
yX+ New X+
A
U={A,B,C,D}; F={A B,BC D};
A+ = AB.
C+ = C.
(AC)+ = ABCD.
Example
A
C
B
Example
A
C
D
B
U={A,B,C,D}; A B,BC D.
(AC)+ = ABCD.
函数依赖闭包
[例 1] 已知关系模式 R<U,F>,其中
U={A,B,C,D,E};
F={AB→ C,B→ D,C→ E,EC→ B,AC→ B}。
求( AB) F+ 。
解 设 X( 0) =AB;
(1)计算 X( 1),逐一的扫描 F集合中各个函数依赖,
找左部为 A,B或 AB的函数依赖。得到两个:
AB→ C,B→ D。
于是 X( 1) =AB∪ CD=ABCD。
函数依赖闭包
(2)因为 X( 0) ≠ X( 1),所以再找出左部为 ABCD
子集的那些函数依赖,又得到 AB→ C,B→ D,
C→ E,AC→ B,
于是 X( 2) =X( 1) ∪ BCDE=ABCDE。
(3)因为 X( 2) =U,算法终止所以( AB) F+ =ABCDE。
4,Armstrong公理系统的有效性与完备性
建立公理系统体系 目的,从已知的 f 推导出未知的 f
明确,1.公理系统推导出来的 f 正确?
2,F+中的每一个 f 都能推导出来?
/ f 不能由 F 导出,f? F+
F F+ f
4,Armstrong公理系统的有效性与完备性
有效性,由 F出发根据 Armstrong公理推导出来的每一个函数依赖一定在 F+中
/* Armstrong正确
完备性,F+中的每一个函数依赖,必定可以由
F出发根据 Armstrong公理推导出来
/* Armstrong公理够用,完全完备性,所有不能用 Armstrong公理推导出来 f,都不为真若 f 不能用 Armstrong公理推导出来,f? F+
有效性与完备性的证明证明:
1,有效性可由定理 5.l得证
2,完备性只需证明 逆否命题,若函数依赖 X→ Y不能由 F从
Armstrong公理导出,那么它必然不为 F所蕴含分三步证明:
有效性与完备性的证明
(1)引理,若 V→ W成立,且 V? XF+,则 W? XF+
证 因为 V? XF+,所以有 X→ V成立;
因为 X → V,V→ W,于是 X→ W成立所以 W? XF+
(2)/* 若 f 不能用 Armstrong公理推导出来,f? F+
/* 若存在 r,F+中的全部函数依赖在 r上成立。
/* 而不能用 Armstrong公理推导出来的 f,在 r上不成立。
构造一张二维表 r,它由下列两个元组构成,可以证明 r必是 R( U,F)
的一个关系,即 F+中的全部函数依赖在 r上成立 。
Armstrong公理系统的有效性与完备性 (续 )
XF+ U-XF+
11......1 00......0
11......1 11......1
若 r不是 R<U,F> 的关系,则必由于 F中有函数依赖 V→ W在 r上不成立所致 。 由 r的构成可知,V必定是 XF+ 的子集,而 W不是 XF+ 的子集,可是由第 ( 1)
步,W? XF+,矛盾 。 所以 r必是 R<U,F>的一个关系 。
Armstrong公理系统的有效性与完备性 (续 )
(3) )/* 若 f 不能用 Armstrong公理推导出来,f? F+
/* 而不能用 Armstrong公理推导出来的 f,在 r上不成立。
若 X→ Y 不能由 F从 Armstrong公理导出,则 Y 不是
XF+ 的子集。(引理 5.2)
因此必有 Y 的子集 Y’ 满足 Y’? U-XF+,则 X→ Y在
r 中不成立,即 X→ Y必不为 R<U,F> 蕴含
/* 因为 F+中的全部函数依赖在 r上成立。
Armstrong公理系统的有效性与完备性 (续 )
Armstrong公理的完备性及有效性说明,
―蕴含,== ―导出,等价的概念
F+ ==由 F出发借助 Armstrong公理导出的函数依赖的集合
5,函数依赖集等价定义 5.14 如果 G+=F+,就说函数依赖集
F覆盖 G( F是 G的覆盖,或 G是 F的覆盖),
或 F与 G等价 。
函数依赖集等价的充要条件引理 5.3 F+ = G+ 的充分必要条件是
F? G+,和 G? F+
证,必要性显然,只证充分性。
( 1)若 F?G+,则 XF+? XG++ 。
( 2)任取 X→ Y?F+ 则有 Y? XF+? XG++ 。
所以 X→ Y? (G+) += G+。即 F+? G+。
( 3)同理可证 G+? F+,所以 F+ = G+。
函数依赖集等价
要判定 F? G+,只须逐一对 F中的函数依赖 X→ Y,考察 Y 是否属于 XG++ 就行了 。
因此引理 5.3 给出了判断两个函数依赖集等价的可行算法 。
6,最小依赖集定义 5.15 如果函数依赖集 F满足下列条件,则称 F为一个 极小函数依赖集 。 亦称为 最小依赖集 或 最小覆盖 。
(1) F中任一函数依赖的右部仅含有一个属性 。
(2) F中不存在这样的函数依赖 X→ A,使得 F与
F-{X→ A}等价 。
(3) F中不存在这样的函数依赖 X→ A,X有真子集 Z使得 F-{X→ A}∪ {Z→ A}与 F等价 。
最小依赖集
[例 2] 对于 5.l节中的关系模式 S<U,F>,其中:
U={ SNO,SDEPT,MN,CNAME,G },
F={ SNO→ SDEPT,SDEPT→ MN,
( SNO,CNAME) → G }
设 F’={SNO→ SDEPT,SNO→ MN,
SDEPT→ MN,(SNO,CNAME)→ G,
(SNO,SDEPT)→ SDEPT}
F是最小覆盖,而 F ’不是。
因为,F ’-{SNO→ MN}与 F ‘等价
F ’-{(SNO,SDEPT)→ SDEPT}也与 F ‘等价
F ’-{(SNO,SDEPT)→ SDEPT}
∪ {SNO→ SDEPT}也与 F ‘等价
7,极小化过程定理 5.3 每一个函数依赖集 F均等价于一个极小函数依赖集 Fm。 此 Fm称为 F的最小依赖集证,构造性证明,依据定义分三步对 F进行,极小化处理,,找出 F的一个最小依赖集 。
(1)逐一检查 F中各函数依赖 FDi,X→ Y,
若 Y=A1A2 … Ak,k > 2,
则用 { X→ Aj |j=1,2,…,k} 来取代 X→ Y。
引理 5.1保证了 F变换前后的等价性 。
极小化过程
(2)逐一检查 F中各函数依赖 FDi,X→ A,
令 G=F-{X→ A},
若 A?XG+,则从 F中去掉此函数依赖。
由于 F与 G =F-{X→ A}等价的充要条件是 A?XG+
因此 F变换前后是等价的。
极小化过程
(3)逐一取出 F中各函数依赖 FDi,X→ A,
设 X=B1B2… Bm,
逐一考查 Bi ( i=l,2,…,m),
若 A?( X-Bi ) F+,
则以 X-Bi 取代 X。
由于 F与 F-{X→ A}∪ {Z→ A}等价的充要条件是
A?ZF+,其中 Z=X-Bi
因此 F变换前后是等价的。
极小化过程由定义,最后剩下的 F就一定是极小依赖集。
因为对 F的每一次,改造,都保证了改造前后的两个函数依赖集等价,因此剩下的 F与原来的 F等价。 证毕
定理 5.3的证明过程 也是求 F极小依赖集的过程极小化过程
[例 3] F = {A→ B,B→ A,B→ C,
A→ C,C→ A}
Fm1,Fm2都是 F的最小依赖集:
Fm1= {A→ B,B→ C,C→ A}
Fm2= {A→ B,B→ A,A→ C,C→ A}
F的最小依赖集 Fm不一定是唯一的它与对各函数依赖 FDi 及 X→ A中 X各属性的处置顺序有关极小化过程
极小化过程 ( 定理 5.3的证明 )也是检验 F
是否为极小依赖集的一个算法
若改造后的 F与原来的 F相同,说明 F本身就是一个最小依赖集极小化过程
在 R<U,F>中可以用与 F等价的依赖集 G
来取代 F
原因:两个关系模式 R1 <U,F>,
R2<U,G>,如果 F与 G等价,那么 R1
的关系一定是 R2的关系。反过来,R2
的关系也一定是 R1的关系。
第五章 关系数据理论
5.1 数据依赖
5.2 规范化
5.3 数据依赖的公理系统
5.4 模式的分解
5.4 模式的分解
把低一级的关系模式分解为若干个高一级的关系模式的方法并不是唯一的
只有能够保证分解后的关系模式与原关系模式等价,分解方法才有意义关系模式分解的标准三种模式分解的等价定义
⒈ 分解具有无损连接性
⒉ 分解要保持函数依赖
⒊ 分解既要保持函数依赖,又要具有无损连接性模式的分解(续)
定义 5.16 关系模式 R<U,F>的一个分解:
ρ={ R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>}
U=U1∪ U2∪ … ∪ Un,且不存在 Ui? Uj,Fi 为 F在 Ui 上的投影定义 5.17 函数依赖集合 {X→ Y | X→ Y? F+∧ XY?Ui}
的一个 覆盖 Fi 叫作 F 在属性 Ui 上的投影模式的分解(续)
例,SL( Sno,Sdept,Sloc)
F={ Sno→ Sdept,Sdept→ Sloc,Sno→ Sloc}
SL? 2NF
存在插入异常,删除异常,冗余度大和修改复杂等问题分解方法可以有多种模式的分解(续)
SL ──────────────────
Sno Sdept Sloc
──────────────────
95001 CS A
95002 IS B
95003 MA C
95004 IS B
95005 PH B
──────────────────
模式的分解(续)
1,SL分解为下面三个关系模式:
SN(Sno)
SD(Sdept)
SO(Sloc)
分解后的关系为:
SN ────── SD ────── SO ──────
Sno Sdept Sloc
────── ────── ──────
95001 CS A
95002 IS B
95003 MA C
95004 PH ─────
95005 ──────
──────
模式的分解(续)
分解后的数据库 丢失了许多信息例如无法查询 95001学生所在系或所在宿舍 。
如果分解后的关系可以通过自然连接恢复为原来的关系,那么这种分解就没有 丢失信息模式的分解(续)
2,SL分解为下面二个关系模式:
NL(Sno,Sloc)
DL(Sdept,Sloc)
分解后的关系为:
NL ──────────── DL ────────────
Sno Sloc Sdept Sloc
──────────── ────────────
95001 A CS A
95002 B IS B
95003 C MA C
95004 B PH B
95005 B ────────────
──────────
模式的分解(续)
NL DL
─────────────
Sno Sloc Sdept
─────────────
95001 A CS
95002 B IS
95002 B PH
95003 C MA
95004 B IS
95004 B PH
95005 B IS
95005 B PH
模式的分解(续)
NL DL比原来的 SL关系多了 3个元组无法知道 95002,95004,95005
究竟是哪个系的学生元组增加了,信息丢失了第三种分解方法
3,将 SL分解为下面二个关系模式:
ND(Sno,Sdept)
NL(Sno,Sloc)
分解后的关系为:
模式的分解(续)
ND ──────────── NL ──────────
Sno Sdept Sno Sloc
──────────── ──────────
95001 CS 95001 A
95002 IS 95002 B
95003 MA 95003 C
95004 IS 95004 B
95005 PH 95005 B
──────────── ───────────
模式的分解(续)
ND NL
──────────────
Sno Sdept Sloc
──────────────
95001 CS A
95002 IS B
95003 MA C
95004 CS A
95005 PH B
──────────────
与 SL关系一样,因此没有丢失信息具有无损连接性的模式分解
关系模式 R<U,F>的一个分解 ρ={ R1<U1,F1>,
R2<U2,F2>,…,Rn<Un,Fn>}
若 R与 R1,R2,…,Rn自然连接的结果相等,则称关系模式 R的这个分解 ρ具有无损连接性( Lossless join)
具有无损连接性的分解保证不丢失信息
无损连接性不一定能解决插入异常、删除异常、修改复杂、数据冗余等问题模式的分解(续)
第三种分解方法具有无损连接性问题,
这种分解方法没有保持原关系中的函数依赖
SL中的函数依赖 Sdept→ Sloc
没有投影到关系模式 ND,NL上保持函数依赖的模式分解设关系模式 R<U,F>被分解为若干个关系模式
R1<U1,F1>,R2<U2,F2>,…,Rn<Un,Fn>
(其中 U=U1∪ U2∪ … ∪ Un,且不存在 Ui? Uj,Fi为 F在 Ui
上的投影),若 F所逻辑蕴含的函数依赖一定也由分解得到的某个关系模式中的函数依赖 Fi所逻辑蕴含,则称关系模式 R的这个分解是保持函数依赖的( Preserve
dependency)。
第四种分解方法将 SL分解为下面二个关系模式:
ND(Sno,Sdept)
DL(Sdept,Sloc)
这种分解方法就保持了函数依赖。
模式的分解(续)
如果一个分解具有无损连接性,则它能够保证不丢失信息。
如果一个分解保持了函数依赖,则它可以减轻或解决各种异常情况。
分解具有无损连接性和分解保持函数依赖是两个互相独立的标准。具有无损连接性的分解不一定能够保持函数依赖。同样,保持函数依赖的分解也不一定具有无损连接性。
模式的分解(续)
第一种分解方法既不具有无损连接性,也未保持函数依赖,它不是原关系模式的一个等价分解第二种分解方法保持了函数依赖,但不具有无损连接性第三种分解方法具有无损连接性,但未持函数依赖第四种分解方法既具有无损连接性,又保持了函数依赖分解算法
算法 5.2 判别一个分解的无损连接性
算法 5.3 ( 合成法 ) 转换为 3NF的保持函数依赖的分解 。
算法 5.4 转换为 3NF既有无损连接性又保持函数依赖的分解
算法 5.5 转换为 BCNF的无损连接分解 ( 分解法 )
算法 5.6 达到 4NF的具有无损连接性的分
解 P196 图 5,11
分解算法
解 P196 图 5,11
若要求分解具有无损连接性,那么模式分解一定能够达到 4NF。
若要求分解保持函数依赖,那么模式分解一定能够达到 3NF,但不一定能够达到 BCNF。
若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到 3NF,但不一定能够达到 BCNF。
泛关系假设
―假设已知一个模式 Sφ,它仅由单个关系模式组成,问题是要设计一个模式 SD,
它与 Sφ?等价 ’,但在某些方面更好一些,
从一个关系模式出发,而不是从一组关系模式出发实行分解
,等价,的定义也是一组关系模式与一个关系模式的,等价,
小结 (续 )
规范化理论为数据库设计提供了理论的指南和工具
也仅仅是指南和工具
并不是规范化程度越高,模式就越好
必须结合应用环境和现实世界的具体情况合理地选择数据库模式下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第六章 数据库设计第六章 数据库设计
6.1 数据库设计概述
6.2 需求分析
6.3 概念结构设计
6.4 逻辑结构设计
6.5 数据库的物理设计
6.6 数据库实施
6.7 数据库运行与维护
6.8 小结
6.1 数据库设计概述
6.1.1 数据库和信息系统
6.1.2 数据库设计的特点
6.1.3 数据库设计方法简述
6.1.4 数据库设计的基本步骤数据库设计概述(续)
什么是数据库设计
数据库设计是指对于一个给定的应用环境,
构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)
在数据库领域内,常常把使用数据库的各类系统统称为数据库应用系统。
6.1.1 数据库和信息系统
数据库是信息系统的核心和基础
把信息系统中大量的数据按一定的模型组织起来
提供存储、维护、检索数据的功能
使信息系统可以方便、及时、准确地从数据库中获得所需的信息
数据库是信息系统的各个部分能否紧密地结合在一起以及如何结合的关键所在
数据库设计是信息系统开发和建设的重要组成部分数据库设计人员应该具备的技术和知识
数据库的基本知识和数据库设计技术
计算机科学的基础知识和程序设计的方法和技巧
软件工程的原理和方法
应用领域的知识
6.1 数据库设计概述
6.1.1 数据库和信息系统
6.1.2 数据库设计的特点
6.1.3 数据库设计方法简述
6.1.4 数据库设计的基本步骤
6.1.2 数据库设计的特点
数据库建设是硬件、软件和干件的结合
三分技术,七分管理,十二分基础数据
技术与管理的界面称之为,干件,
数据库设计应该与应用系统设计相结合
结构(数据)设计:设计数据库框架或数据库结构
行为(处理)设计:设计应用程序、事务处理等数据库设计的特点(续)
结构和行为分离的设计
传统的软件工程忽视对应用中数据语义的分析和抽象,只要有可能就尽量推迟数据结构设计的决策
早期的数据库设计致力于数据模型和建模方法研究,忽视了对行为的设计数据库设计的特点(续)
现实世界概念模型设计子模式设计物理数据库设计逻辑数据库设计建立数据库数据分析 功能分析功能模型 功能说明事务设计程序说明应用程序设计程序编码调试
6.1 数据库设计概述
6.1.1 数据库和信息系统
6.1.2 数据库设计的特点
6.1.3 数据库设计方法简述
6.1.4 数据库设计的基本步骤
6.1.3 数据库设计方法简述
手工试凑法
设计质量与设计人员的经验和水平有直接关系
缺乏科学理论和工程方法的支持,工程的质量难以保证
数据库运行一段时间后常常又不同程度地发现各种问题,增加了维护代价数据库设计方法简述(续)
规范设计法
手工设计方法
基本思想
过程迭代和逐步求精数据库设计方法简述(续)
规范设计法 (续 )
典型方法
新奥尔良( New Orleans)方法
将数据库设计分为四个阶段
S.B.Yao方法
将数据库设计分为五个步骤
I.R.Palmer方法
把数据库设计当成一步接一步的过程数据库设计方法简述(续)
计算机辅助设计
ORACLE Designer 2000
SYBASE PowerDesigner
6.1 数据库设计概述
6.1.1 数据库和信息系统
6.1.2 数据库设计的特点
6.1.3 数据库设计方法简述
6.1.4 数据库设计的基本步骤
6.1.4 数据库设计的基本步骤一、数据库设计的准备工作选定参加设计的人员
1,数据库分析设计人员
数据库设计的核心人员
自始至终参与数据库设计
其水平决定了数据库系统的质量
6.1.4 数据库设计的基本步骤
2,用户
在数据库设计中也是举足轻重的
主要参加需求分析和数据库的运行维护
用户积极参与带来的好处
加速数据库设计
提高数据库设计的质量数据库设计的基本步骤(续)
3,程序员
在系统实施阶段参与进来,负责编制程序
4,操作员
在系统实施阶段参与进来,准备软硬件环境数据库设计的基本步骤(续)
二、数据库设计的过程 (六个阶段 )
⒈需求分析阶段
准确了解与分析用户需求(包括数据与处理)
是整个设计过程的基础,是最困难、最耗费时间的一步数据库设计的基本步骤(续)
⒉概念结构设计阶段
是整个数据库设计的关键
通过对用户需求进行综合、归纳与抽象,形成一个独立于具体 DBMS的概念模型数据库设计的基本步骤(续)
⒊ 逻辑结构设计阶段
将概念结构转换为某个 DBMS所支持的数据模型
对其进行优化数据库设计的基本步骤(续)
⒋ 数据库物理设计阶段
为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)
数据库设计的基本步骤(续)
⒌ 数据库实施阶段
运用 DBMS提供的数据语言、工具及宿主语言,根据逻辑设计和物理设计的结果
建立数据库
编制与调试应用程序
组织数据入库
并进行试运行数据库设计的基本步骤(续)
⒍ 数据库运行和维护阶段
数据库应用系统经过试运行后即可投入正式运行。
在数据库系统运行过程中必须不断地对其进行评价、调整与修改。
数据库设计的基本步骤(续)
设计一个完善的数据库应用系统往往是上述六个阶段的不断反复。
P206图 6.2
设计特点
在设计过程中把数据库的设计和对数据库中数据处理的设计紧密结合起来
将这两个方面的需求分析、抽象、设计、
实现在各个阶段同时进行,相互参照,
相互补充,以完善两方面的设计
设计过程各个阶段的设计描述,P208图
6.3
IPO表 ……
输入:
输出:
处理:
Creat……
Load……
Main( )
……
if……
then
……
end
分区 1
分区 2
……
概念结构设计逻辑结构设计物理设计设计阶段 设 计 描 述数 据 处 理需求分 析数据字典,全系统中数据项,
数据流,数据存储的描述数据流图和判定表 ( 判定树 ),数据字典中处理过程的描述概念模型 ( E-R图 )
数据字典系统说明书包括:
① 新系统要求,
方案和概图
② 反映新系统信息流的数据流图某种数据模型关系 非关系系统结构图
( 模块结构 )
存储安排方法选择存取路径建立模块设计
IPO表实施阶段编写模式装入数据数据库试运行程序编码,
编译联结,
测试运行,
维护 性能监测,转储 /恢复数据库重组和重构新旧系统转换,运行,维护 ( 修正性,
适应性,改善性维护 )
数据库设计的基本步骤(续)
数据库各级模式的形成过程 (P209图 6.4)
需求分析阶段
综合各个用户的应用需求
概念设计阶段
形成独立于机器特点,独立于各个 DBMS
产品的概念模式 (E-R图 )
数据库设计的基本步骤(续)
逻辑设计阶段
首先将 E-R图转换成具体的数据库产品支持的数据模型,如关系模型,形成数据库逻辑模式
然后根据用户处理的要求、安全性的考虑,
在基本表的基础上再建立必要的视图
(View),形成数据的外模式数据库设计的基本步骤(续)
物理设计阶段
根据 DBMS特点和处理的需要,进行物理存储安排,建立索引,形成数据库内模式第六章 数据库设计
6.1 数据库设计概述
6.2 需求分析
6.3 概念结构设计
6.4 逻辑结构设计
6.5 数据库的物理设计
6.6 数据库实施
6.7 数据库运行与维护
6.8 小结
6.2 需求分析
6.2.1 需求分析的任务
6.2.2 需求分析的方法
6.2.3 数据字典需求分析(续)
需求分析就是分析用户的需要与要求
需求分析是设计数据库的起点
需求分析的结果是否准确地反映了用户的实际要求,将直接影响到后面各个阶段的设计,
并影响到设计结果是否合理和实用
6.2 需求分析
6.2.1 需求分析的任务
6.2.2 需求分析的方法
6.2.3 数据字典
6.2.1 需求分析的任务一、需求分析的任务二、需求分析的重点三、需求分析的难点一、需求分析的任务
通过详细调查现实世界要处理的对象
(组织、部门、企业等),充分 了解原系统 (手工系统或计算机系统) 工作概况,明确用户的各种需求
在此基础上 确定新系统的功能 。新系统必须充分考虑今后可能的扩充和改变,
不能仅仅按当前应用需求来设计数据库二、需求分析的重点
需求分析的重点是调查、收集与分析用户在数据管理中的 信息要求、处理要求、安全性与完整性要求 。
信息要求
用户需要从数据库中获得信息的内容与性质
由用户的信息要求可以导出数据要求,即在数据库中需要存储哪些数据需求分析的重点(续)
处理要求
对处理功能的要求
对处理的响应时间的要求
对处理方式的要求 (批处理 / 联机处理 )
新系统的功能必须能够满足用户的信息要求、
处理要求、安全性与完整性要求。
三、需求分析的难点
确定用户最终需求的难点
用户 缺少计算机知识,开始时无法确定计算机究竟能为自己做什么,不能做什么,因此无法一下子准确地表达自己的需求,他们所提出的需求往往不断地变化。
设计人员 缺少用户的专业知识,不易理解用户的真正需求,甚至误解用户的需求。
新 的硬件、软件 技术的出现 也会使用户需求发生变化。
需求分析的难点 (续 )
解决方法
设计人员必须采用有效的方法,与用户不断深入 地进行 交流,才能逐步得以确定用户的实际需求
6.2 需求分析
6.2.1 需求分析的任务
6.2.2 需求分析的方法
6.2.3 数据字典
6.2.2 需求分析的方法
调查清楚用户的实际需求并进行初步分析
与用户达成共识
进一步分析与表达这些需求一,调查与初步分析用户需求
⑴ 调查组织机构情况
组织部门的组成情况
各部门的职责等调查与初步分析用户需求(续)
⑵ 调查各部门的业务活动情况。调查重点之一。
各个部门输入和使用什么数据
如何加工处理这些数据
输出什么信息
输出到什么部门
输出结果的格式是什么调查与初步分析用户需求(续)
⑶ 在熟悉业务活动的基础上,协助用户明确对新系统的各种要求。调查重点之二。
信息要求
处理要求
完全性与完整性要求调查与初步分析用户需求(续)
⑷ 对前面调查的结果进行初步分析
确定新系统的边界
确定哪些功能由计算机完成或将来准备让计算机完成
确定哪些活动由人工完成由计算机完成的功能就是新系统应该实现的功能。
二、常用调查方法
做需求调查时,往往需要同时采用多种方法
无论使用何种调查方法,都必须有用户的积极参与和配合
设计人员应该和用户取得共同的语言,帮助不熟悉计算机的用户建立数据库环境下的共同概念,并对设计工作的最后结果共同承担责任常用调查方法(续)
常用调查方法
⑴跟班作业
通过亲身参加业务工作了解业务活动的情况
能比较准确地理解用户的需求,但比较耗时
⑵开调查会
通过与用户座谈来了解业务活动情况及用户需求
⑶请专人介绍常用调查方法(续)
⑷ 询问
对某些调查中的问题,可以找专人询问
⑸设计调查表请用户填写
如果调查表设计合理,则很有效,且易于为用户接受
⑹查阅记录
查阅与原系统有关的数据记录三、进一步分析和表达用户需求
分析和表达用户的需求 的常用方法
自顶向下的结构化分析方法( Structured
Analysis,简称 SA方法)
SA方法从最上层的系统组织机构入手,采用逐层分解的方式分析系统,并用数据流图和数据字典描述系统。
进一步分析和表达用户需求(续)
1.首先把任何一个系统都抽象为:
数据流数据流数据存储 信息要求数据来源处理 数据输出 处理要求进一步分析和表达用户需求(续)
2.分解处理功能和数据
( 1)分解处理功能
将处理功能的具体内容分解为若干子功能,再将每个子功能继续分解,直到把系统的工作过程表达清楚为止。
( 2)分解数据
在处理功能逐步分解的同时,其所用的数据也逐级分解,形成若干层次的数据流图
数据流图表达了数据和处理过程的关系进一步分析和表达用户需求(续)
( 3)表达方法
处理过程:用判定表或判定树来描述
数据:用数据字典来描述进一步分析和表达用户需求(续)
3.将分析结果再次提交给用户,征得用户的认可四、需求分析小结
P211图 6.6
需求分析小结(续)
实例:假设我们要开发一个学校管理系统。
1.经过可行性分析和初步需求调查,抽象出该系统最高层数据流图,该系统由教师管理子系统、学生管理子系统、后勤管理子系统组成,每个子系统分别配备一个开发小组。
2.进一步细化各个子系统。
其中学生管理子系统开发小组通过进行进一步的需求调查,
明确了该子系统的主要功能是进行学籍管理和课程管理,
包括学生报到、入学、毕业的管理,学生上课情况的管理。
通过详细的信息流程分析和数据收集后,他们生成了该子系统的数据流图。
6.2 需求分析
6.2.1 需求分析的任务
6.2.2 需求分析的方法
6.2.3 数据字典
6.2.3 数据字典一、数据字典的用途二、数据字典的内容一、数据字典的用途
数据字典是各类数据描述的集合
数据字典是进行详细的数据收集和数据分析所获得的主要结果
数据字典在数据库设计中占有很重要的地位二、数据字典的内容
数据字典的内容
数据项
数据结构
数据流
数据存储
处理过程
数据项是数据的最小组成单位
若干个数据项可以组成一个数据结构
数据字典通过对数据项和数据结构的定义来描述数据流、数据存储的逻辑内容。
⒈ 数据项
数据项是不可再分的数据单位
对数据项的描述数据项描述={数据项名,数据项含义说明,
别名,数据类型,长度,取值范围,
取值含义,与其他数据项的逻辑关系}
取值范围、与其他数据项的逻辑关系定义了数据的完整性约束条件
⒉ 数据结构
数据结构反映了数据之间的组合关系。
一个数据结构可以由若干个数据项组成,也可以由若干个数据结构组成,或由若干个数据项和数据结构混合组成。
对数据结构的描述数据结构描述={数据结构名,含义说明,
组成,{数据项或数据结构}}
⒊ 数据流
数据流是数据结构在系统内传输的路径。
对数据流的描述数据流描述={数据流名,说明,数据流来源,
数据流去向,组成,{数据结构},
平均流量,高峰期流量}
数据流来源是说明该数据流来自哪个过程
数据流去向是说明该数据流将到哪个过程去
平均流量是指在单位时间(每天、每周、每月等)
里的传输次数
高峰期流量则是指在高峰时期的数据流量
⒋ 数据存储
数据存储是数据结构停留或保存的地方,也是数据流的来源和去向之一。
对数据存储的描述数据存储描述={数据存储名,说明,编号,
流入的数据流,流出的数据流,
组成,{数据结构},数据量,存取方式}
流入的数据流:指出数据来源
流出的数据流:指出数据去向
数据量:每次存取多少数据,每天(或每小时、每周等)
存取几次等信息
存取方法:批处理 / 联机处理;检索 / 更新;顺序检索 /
随机检索
⒌ 处理过程
处理过程的具体处理逻辑一般用判定表或判定树来描述。数据字典中只需要描述处理过程的说明性信息
处理过程说明性信息的描述处理过程描述={处理过程名,说明,
输入,{数据流},输出,{数据流},
处理,{简要说明}}
处理过程(续)
简要说明:主要说明该处理过程的功能及处理要求
功能:该处理过程用来做什么
处理要求:处理频度要求(如单位时间里处理多少事务,多少数据量);响应时间要求等
处理要求是后面物理设计的输入及性能评价的标准处理过程(续)
例:学生学籍管理子系统的数据字典。
数据项,以,学号,为例:
数据项,学号含义说明:唯一标识每个学生别名,学生编号类型,字符型长度,8
取值范围,00000000至 99999999
取值含义:前两位标别该学生所在年级,
后六位按顺序编号与其他数据项的逻辑关系:
处理过程(续)
数据结构 以,学生,为例
,学生,是该系统中的一个核心数据结构:
数据结构,学生含义说明,是学籍管理子系统的主体数据结构,定义了一个学生的有关信息组成,学号,姓名,性别,年龄,
所在系,年级处理过程(续)
数据流,体检结果,可如下描述:
数据流,体检结果说明,学生参加体格检查的最终结果数据流来源:体检数据流去向:批准组成,……
平均流量,……
高峰期流量,……
处理过程(续)
数据存储,学生登记表,可如下描述:
数据存储,学生登记表说明,记录学生的基本情况流入数据流,……
流出数据流,……
组成,……
数据量,每年 3000张存取方式,随机存取处理过程(续)
处理过程,分配宿舍,可如下描述:
处理过程:分配宿舍说明,为所有新生分配学生宿舍输入,学生,宿舍,
输出,宿舍安排处理,在新生报到后,为所有新生分配学生宿舍。要求同一间宿舍只能安排同一性别的学生,同一个学生只能安排在一个宿舍中。每个学生的居住面积不小于 3平方米。安排新生宿舍其处理时间应不超过 15分钟。
下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第六章 数据库设计 (续 -1)
6.3 概念结构设计
6.3.1 概念结构设计概述
6.3.2 概念结构设计的方法与步骤
6.3.3 数据抽象与局部视图设计
6.3.4 视图的集成
6.3.1 概念结构
什么是 概念结构设计
需求分析阶段描述的用户应用需求是现实世界的具体需求
将需求分析得到的用户需求抽象为信息结构即 概念模型 的过程就是概念结构设计
概念结构是各种数据模型的共同基础,它比数据模型 更独立于机器,更抽象,从而更加稳定。
概念结构设计是整个数据库设计的关键概念结构(续)
现实世界机器世界信息世界需求分析概念结构设计概念结构(续)
概念结构设计的特点
( 1)能真实、充分地反映现实世界,包括事物和事物之间的联系,能满足用户对数据的处理要求。是对现实世界的一个真实模型。
( 2) 易于理解,从而可以用它和不熟悉计算机的用户交换意见,用户的积极参与是数据库的设计成功的关键。
概念结构(续)
概念结构设计的特点 (续 )
( 3)易于更改,当应用环境和应用要求改变时,
容易对概念模型修改和扩充。
( 4) 易于向关系、网状、层次 等各种数据模型转换。
概念结构(续)
描述概念模型的工具
E-R模型
6.3 概念结构设计
6.3.1 概念结构设计概述
6.3.2 概念结构设计的方法与步骤
6.3.3 数据抽象与局部视图设计
6.3.4 视图的集成
6.3.2 概念结构设计的方法与步骤
设计概念结构的四类方法
自顶向下
首先定义全局概念结构的框架,然后逐步细化
自底向上
首先定义各局部应用的概念结构,然后将它们集成起来,得到全局概念结构概念结构设计的方法与步骤(续)
逐步扩张
首先定义最重要的核心概念结构,然后向外扩充,以滚雪球的方式逐步生成其他概念结构,直至总体概念结构
混合策略
将自顶向下和自底向上相结合,用自顶向下策略设计一个全局概念结构的框架,
以它为骨架集成由自底向上策略中设计的各局部概念结构。
概念结构设计的方法与步骤(续)
自顶向下策略概念结构设计的方法与步骤(续)
自底向上策略概念结构设计的方法与步骤(续)
逐步扩张概念结构设计的方法与步骤(续)
常用策略( P215图 6.8)
自顶向下地进行需求分析
自底向上 地设计概念结构
自底向上设计概念结构的步骤
( P216图 6.9)
第 1步,抽象数据并设计局部视图
第 2步,集成局部视图,得到全局概念结构
6.3 概念结构设计
6.3.1 概念结构设计概述
6.3.2 概念结构设计的方法与步骤
6.3.3 数据抽象与局部视图设计
6.3.4 视图的集成
6.3.3 数据抽象与局部视图设计
数据抽象
局部视图设计一、数据抽象
概念结构是对现实世界的一种抽象
从实际的人、物、事和概念中抽取所关心的共同特性,忽略非本质的细节
把这些特性用各种概念精确地加以描述
这些概念组成了某种模型数据抽象(续)
三种常用抽象
1,分类( Classification)
定义某一类概念作为现实世界中一组对象的类型
这些对象具有某些共同的特性和行为
它抽象了对象 值和型 之间的,is member of‖
的语义
在 E-R模型中,实体型就是这种抽象例,P216图 6.10
数据抽象(续)
2,聚集( Aggregation)
定义某一类型的组成成分
它抽象了对象内部类型和成分之间,is part
of‖的语义
在 E-R模型中若干属性的聚集组成了实体型,
就是这种抽象例,P217图 6.11,图 6.12
数据抽象(续)
3,概括( Generalization)
定义类型之间的一种子集联系
它抽象了类型之间的,is subset of‖的语义
概括有一个很重要的性质:继承性。子类继承超类上定义的所有抽象。
例,P217图 6.13
数据抽象(续)
注:原 E-R模型不具有概括,本书对 E-R模型作了扩充,允许定义超类实体型和子类实体型。
用双竖边的矩形框表示子类,
用直线加小圆圈表示超类 -子类的联系数据抽象(续)
数据抽象的用途
对需求分析阶段收集到的数据进行分类、组织(聚集),形成
实体
实体的 属性,标识实体的 码
确定实体之间的 联系类型 (1:1,1:n,m:n)
二、局部视图设计设计分 E-R图的步骤,
⒈ 选择局部应用
⒉逐一设计分 E-R图
⒈ 选择局部应用
需求分析阶段,已用多层数据流图和数据字典描述了整个系统。
设计分 E-R图首先需要根据系统的具体情况,
在多层的数据流图中 选择 一个 适当层次的数据流图,让这组图中每一部分对应一个局部应用,
然后以这一层次的数据流图为出发点,设计分
E-R图。
选择局部应用(续)
例:由于学籍管理、课程管理等都不太复杂,因此可以它们入手设计学生管理子系统的分 E-R图。如果局部应用比较复杂,
则可以从更下层的数据流图入手。
⒉ 逐一设计分 E-R图
任务
标定局部应用中的实体、属性、码,实体间的联系
将各局部应用涉及的数据分别从数据字典中抽取出来,参照数据流图,标定各局部应用中的实体、实体的属性、标识实体的码,确定实体之间的联系及其类型( 1:1,
1:n,m:n)
逐一设计分 E-R图(续)
如何抽象实体和属性
实体,现实世界中一组具有某些共同特性和行为的对象就可以抽象为一个实体。对象和实体之间是,is member of"的关系。
例:在学校环境中,可把张三、李四等对象抽象为学生实体。
逐一设计分 E-R图(续)
属性,对象类型的 组成成分 可以抽象为实体的属性。组成成分与对象类型之间是,is
part of"的关系。
例:学号、姓名、专业、年级等可以抽象为学生实体的属性。其中学号为标识学生实体的码。
逐一设计分 E-R图(续)
如何区分实体和属性
实体与属性是相对而言的 。同一事物,在一种应用环境中作为,属性,,在另一种应用环境中就必须作为,实体,。
例:学校中的系,在某种应用环境中,它只是作为,学生,实体的一个属性,表明一个学生属于哪个系;而在另一种环境中,由于需要考虑一个系的系主任、教师人数、学生人数、办公地点等,这时它就需要作为实体了。
逐一设计分 E-R图(续)
一般原则
属性不能再具有需要描述的性质。即属性必须是不可分的数据项,不能再由另一些属性组成。
属性不能与其他实体具有联系。联系只发生在实体之间。
符合上述两条特性的事物一般作为属性对待。
为了简化 E-R图的处置,现实世界中的事物凡能够作为属性对待的,应尽量作为属性。
逐一设计分 E-R图(续)
举例例 1:,学生,由学号、姓名等属性进一步描述,根据准则1,,学生,只能作为实体,
不能作为属性。
例 2:职称通常作为教师实体的属性,但在涉及住房分配时,由于分房与职称有关,也就是说职称与住房实体之间有联系,根据准则
2,这时把职称作为实体来处理会更合适些。
(教程P 194图 6-10)
逐一设计分 E-R图(续)
设计分 E-R图的步骤
( 1)以数据字典为出发点定义 E-R图。
数据字典中的,数据结构,,,数据流,
和,数据存储,等已是若干属性的有意义的聚合
( 2)按上面给出的准则进行必要的调整。
逐一设计分 E-R图(续)
例:学籍管理局部应用中主要涉及的实体包括学生、宿舍、档案材料、班级、班主任。
实体之间的联系:
由于一个宿舍可以住多个学生,而一个学生只能住在某一个宿舍中,因此宿舍与学生之间是 1:n的联系。
由于一个班级往往有若干名学生,而一个学生只能属于一个班级,因此班级与学生之间也是 1:n的联系 。
逐一设计分 E-R图(续)
由于班主任同时还要教课,因此班主任与学生之间存在指导联系,一个班主任要教多名学生,而一个学生只对应一个班主任,因此班主任与学生之间也是 1:n的联系。
而学生和他自己的档案材料之间,班级与班主任之间都是 1:1的联系。
学籍管理局部应用的分 E-R图草图:教程P
195图 6- 11
逐一设计分 E-R图(续)
接下来需要进一步斟酌该 E-R图,做适当调整。
(1) 在一般情况下,性别通常作为学生实体的属性,但在本局部应用中,由于宿舍分配与学生性别有关,根据准则2,应该把性别作为实体对待。
(2) 数据存储,学生登记表,,由于是手工填写,供存档使用,其中有用的部分已转入学生档案材料中,因此这里就不必作为实体了。
最后得到学籍管理局部应用的分 E-R图:教程P
195如图 6-12。
逐一设计分 E-R图(续)
该 E-R图中省略了各个实体的属性描述:
学生:{ 学号,姓名,出生日期}
性别:{ 性别 }
档案材料:{ 档案号,…… }
班级:{ 班级号,学生人数}
班主任:{ 职工号,姓名,性别,
是否为优秀班主任}
宿舍:{ 宿舍编号,地址,人数}
其中有下划线的属性为实体的码。
逐一设计分 E-R图(续)
同样方法可以得到课程管理局部应用的分 E-R图,
(图 6-13)
各实体的属性分别为:
学生:{姓名,学号,性别,年龄,所在系,
年级,平均成绩}
课程:{ 课程号,课程名,学分}
教师:{ 职工号,姓名,性别,职称}
教科书:{ 书号,书名,价钱}
教室:{ 教室编号,地址,容量}
题目
设有一局部应用,包括 3个实体,,科室,,,医生,和,病人,,且有以下事实:
每位医生属于且仅属于一个科室;每个科室有多位医生可接诊病人;病人根据自己的症状选择相应的科室就诊;一位病人在同一科室中多次看病时,每次可能由不同的医生为其诊断。
设科室的属性包括科室代码、科室名称,医生的属性包括工号、姓名、职称,病人的属性包括姓名、年龄、工作单位,试设计局部 ER图。
6.3 概念结构设计
6.3.1 概念结构
6.3.2 概念结构设计的方法与步骤
6.3.3 数据抽象与局部视图设计
6.3.4 视图的集成
6.3.4 视图的集成
各个局部视图即 分 E-R图 建立好后,还需要对它们进行 合并,集成为一个整体的数据概念结构即 总 E-R图 。
视图的集成(续)
视图集成的两种方式
一次集成( P224图 6.25(a))
一次集成多个分 E-R图
通常用于局部视图比较简单时
逐步累积式( P224图 6.25(b))
首先集成两个局部视图(通常是比较关键的两个局部视图)
以后每次将一个新的局部视图集成进来视图的集成(续)
集成局部 E-R图的步骤
1,合并
2,修改与重构视图的集成(续)
一、合并分 E-R图,生成初步 E-R图
各分E-R图存在冲突
各个局部应用所面向的问题不同由不同的设计人员进行设计各个分 E-R图之间必定会存在许多不一致的地方
合并分 E-R图的主要工作与关键所在:合理消除各分 E-R图的冲突合并分 E-R图,生成初步 E-R图(续)
冲突的种类
属性冲突
命名冲突
结构冲突
⒈ 属性冲突
两类属性冲突
属性域冲突,属性值的类型、取值范围或取值集合不同。
例 1,由于学号是数字,因此 某些部门 (即局部应用)将学号定义为整数形式,而由于学号不用参与运算,因此 另一些部门 (即局部应用)
将学号定义为字符型形式。
例 2,某些部门(即局部应用)以出生日期形式表示学生的年龄,而另一些部门(即局部应用)用整数形式表示学生的年龄。
属性冲突(续)
属性取值单位冲突 。
例:学生的身高,有的以米为单位,有的以厘米为单位,有的以尺为单位。
属性冲突(续)
属性冲突的解决方法
通常用讨论、协商等行政手段加以解决
⒉ 命名冲突
两类命名冲突
同名异义,不同意义的对象在不同的局部应用中具有相同的名字例,局部应用 A中将教室称为房间局部应用 B中将学生宿舍称为房间
异名同义(一义多名),同一意义的对象在不同的局部应用中具有不同的名字例,有的部门把教科书称为课本有的部门则把教科书称为教材命名冲突(续)
命名冲突可能发生在属性级、实体级、
联系级上。其中属性的命名冲突更为常见。
命名冲突的解决方法
通过讨论、协商等行政手段加以解决
⒊ 结构冲突
三类结构冲突
同一对象在不同应用中具有不同的抽象例,,课程,在某一局部应用中被当作实体在另一局部应用中则被当作属性
解决方法:通常是把属性变换为实体或把实体变换为属性,使同一对象具有相同的抽象。变换时要遵循两个准则。
结构冲突(续)
同一实体在不同局部视图中所包含的属性不完全相同,或者属性的排列次序不完全相同 。
产生原因:不同的局部应用关心的是该实体的不同侧面。
解决方法:使该实体的属性取各分 E-R图中属性的并集,再适当设计属性的次序 。
结构冲突(续)
学生学号 姓名 性别 平均成绩
(a)在局部应用 A中结构冲突(续)
学生学号姓名 出生日期 年级
(b)在局部应用 B中所在系结构冲突(续)
学生学号姓名 政治面貌
(c)在局部应用 C中结构冲突(续)
学生政治面貌学号出生日期 年级
(d)合并后所在系 平均成绩姓名 性别结构冲突(续)
实体之间的联系在不同局部视图中呈现不同的类型例 1,实体 E1与 E2在局部应用 A中是多对多联系,
而在局部应用 B中是一对多联系例 2,在局部应用 X中 E1与 E2发生联系,而在局部应用 Y中 E1,E2,E3三者之间有联系。
解决方法:根据应用语义对实体联系的类型进行综合或调整。 (P226图 6.27)
合并分 E-R图,生成初步 E-R图实例例:生成学校管理系统的初步 E-R图以合并学籍管理局部视图,课程管理局部视图为例这两个分 E-R图存在着多方面的冲突:
合并分 E-R图,生成初步 E-R图实例
(1) 班主任实际上也属于教师,也就是说学籍管理中的班主任实体与课程管理中的教师实体在一定程度上属于异名同义,可以应将学籍管理中的班主任实体与课程管理中的教师实体统一称为教师,统一后教师实体的属性构成为:
教师:{ 职工号,姓名,性别,职称,
是否为优秀班主任}
合并分 E-R图,生成初步 E-R图实例(续)
(2) 将班主任改为教师后,教师与学生之间的联系在两个局部视图中呈现两种不同的类型,一种是学籍管理中教师与学生之间的指导联系,
一种是课程管理中教师与学生之间的教学联系,
由于指导联系实际上可以包含在教学联系之中,
因此可以将这两种联系综合为教学联系。
合并分 E-R图,生成初步 E-R图实例(续)
(3) 性别在两个局部应用中具有不同的抽象,它在学籍管理中为实体,在课程管理中为属性,
按照前面提到的两个原则,在合并后的 E-R图中性别只能作为实体,否则它无法与宿舍实体发生联系。
合并分 E-R图,生成初步 E-R图实例(续)
(4) 在两个局部 E-R图中,学生实体属性组成及次序都存在差异,应将所有属性综合,并重新调整次序。假设调整结果为:
学生:{ 学号,姓名,出生日期,年龄,所在系,年级,平均成绩}
解决上述冲突后,学籍管理分 E-R图与课程管理分 E-R图合并为P 198图 6-16的形式。
二、修改与重构
基本任务
消除不必要的冗余,设计生成基本 E-R图合并初步 E-R图分 E-R图可能存在冗余的数据和冗余的实体间联系基本 E-R图消除不必要的冗余修改与重构(续)
1.冗余
2.消除冗余的方法
1.冗余
冗余的数据是指可由基本数据导出的数据,
冗余的联系是指可由其他联系导出的联系。
冗余数据和冗余联系容易破坏数据库的完整性,
给数据库维护增加困难
并不是所有的冗余数据与冗余联系都必须加以消除,有时为了提高某些应用的效率,不得不以冗余信息作为代价。
冗余(续)
设计数据库概念结构时,哪些冗余信息必须消除,哪些冗余信息允许存在,需要根据用户的整体需求来确定。
消除不必要的冗余后的初步 E-R图称为基本 E-
R图。
2.消除冗余的方法
分析方法
以数据字典和数据流图为依据,根据数据字典中关于数据项之间逻辑关系的说明来消除冗余。
消除冗余的方法 (续 )
例,教师工资单中包括该教师的基本工资、各种补贴、应扣除的房租水电费以及实发工资。
由于实发工资可以由前面各项推算出来,因此可以去掉,在需要查询实发工资时根据基本工资、各种补贴、应扣除的房租水电费数据临时生成。
消除冗余的方法(续)
如果是为了提高效率,人为地保留了一些冗余数据,则应把数据字典中数据关联的说明作为完整性约束条件。
一种更好的方法是把冗余数据定义在视图中消除冗余的方法(续)
规范化理论
函数依赖的概念提供了消除冗余联系的形式化工具消除冗余的方法(续)
方法
1,确定分 E-R图实体之间的数据依赖 FL 。实体之间一对一、一对多、多对多的联系可以用实体码之间的函数依赖来表示。
例:
班级和学生之间一对多的联系:
学号?班级号学生和课程之间多对多的联系:
(学号,课程号)?成绩消除冗余的方法(续)
2,求 FL的最小覆盖 GL,差集为
D = FL-GL。
逐一考察 D中的函数依赖,确定是否是冗余的联系,若是,就把它去掉。
消除冗余的方法(续)
由于规范化理论受到泛关系假设的限制,应注意下面两个问题:
1.冗余的联系一定在 D中,而 D中的联系不一定是冗余的;
2.当实体之间存在多种联系时要将实体之间的联系在形式上加以区分。
例 P229图 6.30中部门和职工之间两种联系表示为:
负责人,职工号?部门号部门号?负责人,职工号泛关系假设
假设存在着一个单一的关系模式
,假设已知一个模式 Sφ,它仅由单个关系模式组成,问题是要设计一个模式 SD,它与 Sφ‘等价 ’,但在某些方面更好一些,
从一个关系模式出发,而不是从一组关系模式出发实行分解
,等价,的定义也是一组关系模式与一个关系模式的,等价,
泛关系假设 (续 )
泛关系假设是运用规范化理论时的障碍
承认了泛关系假设,就等于承认了现实世界各实体间只能有一种联系消除冗余,设计生成基本 E-R图实例教程P 198图 6-16的初步 E-R图中存在着冗余数据和冗余联系:
(1) 学生实体中的年龄属性可以由出生日期推算出来,属于冗余数据,应该去掉。这样不仅可以节省存储空间,而且当某个学生的出生日期有误,进行修改后,无须相应修改年龄,减少了产生数据不一致的机会。
学生:{ 学号,姓名,出生日期,所在系,
年级,平均成绩}
消除冗余,设计生成基本 E-R图实例(续)
(2) 教室实体与班级实体的上课联系可以由教室与课程之间的开设联系、课程与学生之间的选修联系、学生与班级之间的组成联系三者推导出来,因此属于冗余联系,可以消去。
消除冗余,设计生成基本 E-R图实例(续)
(3) 学生实体中的平均成绩可以从选修联系中的成绩属性中推算出来
由于应用中需要经常查询某个学生的平均成绩,每次都进行这种计算效率就会太低,因此为提高效率,保留该冗余数据
但定义一个触发器来保证学生的平均成绩等于该学生各科成绩的平均值。
任何一科成绩修改后,或该学生学了新的科目并有成绩后,就触发该触发器去修改该学生的平均成绩属性值。
消除冗余,设计生成基本 E-R图实例(续)
教程P 200图 17是对图 16进行修改和重构后生成的基本 E-R图。
学生管理子系统的基本 E-R图与教师管理子系统以及后勤管理子系统的基本 E-R图合并后,生成整个学校管理系统的基本
E-R图三、验证整体概念结构
视图集成后形成一个整体的数据库概念结构,
对该整体概念结构还必须进行进一步验证,确保它能够满足下列条件,
整体概念结构内部必须具有一致性,不存在互相矛盾的表达。
整体概念结构能准确地反映原来的每个视图结构,包括属性、实体及实体间的联系。
整体概念结构能满足需要分析阶段所确定的所有要求。
验证整体概念结构(续)
整体概念结构最终还应该提交给用户,
征求用户和有关人员的意见,进行评审、
修改和优化,然后把它确定下来,作为数据库的概念结构,作为进一步设计数据库的依据 。
数据库设计
数据库的设计过程
需求分析
概念结构设计
逻辑结构设计
物理数据库设计
实施
运行维护设计过程中往往还会有许多反复。
概念结构设计小结
什么是概念结构设计现实世界机器世界信息世界需求分析概念结构设计概念结构设计小结
概念结构设计的步骤
抽象数据并设计局部视图
集成局部视图,得到全局概念结构
验证整体概念结构概念结构设计小结
数据抽象
分类
聚集
概括概念结构设计小结
设计局部视图
⒈ 选择局部应用
⒉ 逐一设计分 E-R图
标定局部应用中的实体、属性、码,实体间的联系
用 E-R图描述出来概念结构设计小结
集成局部视图
1.合并分 E-R图,生成初步 E-R图
消除冲突
属性冲突
命名冲突
结构冲突
2,修改与重构
消除不必要的冗余,设计生成基本 E-R图
分析方法
规范化理论下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第六章 数据库设计 (续 -2)
第六章 数据库设计
6.1 数据库设计概述
6.2 需求分析
6.3 概念结构设计
6.4 逻辑结构设计
6.5 数据库的物理设计
6.6 数据库实施
6.7 数据库运行与维护
6.8 小结
6.4 逻辑结构设计
逻辑结构设计的任务
概念结构是各种数据模型的共同基础
为了能够用某一 DBMS实现用户需求,还必须将概念结构进一步转化为相应的数据模型,
这正是数据库逻辑结构设计所要完成的任务。
6.4 逻辑结构设计
逻辑结构设计的步骤
将概念结构转化为一般的关系,网状,层次模型
将转化来的关系,网状,层次模型向特定
DBMS支持下的数据模型转换
对数据模型进行优化逻辑结构设计转化为一般数据模型转化为特定 DBMS
支持下的据模型优化模型概念结构设计数据库物理设计基本 E-R图转换规则特定
DBMS的特点与限制优化方法如规范化理论逻辑模型
6.4 逻辑结构设计
6.4.1 E-R图向关系模型的转换
6.4.2 向特定 DBMS规定的模型进行转换
6.4.3 数据模型的优化
6.4.4 设计用户子模式
6.4.1 E-R图向关系模型的转换
转换内容
转换原则
E-R图向关系模型的转换(续)
转换内容
E-R图由实体、实体的属性和实体之间的联系三个要素组成
关系模型的逻辑结构是一组关系模式的集合
将 E-R图转换为 关系模型,将实体、实体的属性和实体之间的联系转化为关系模式。
E-R图向关系模型的转换(续)
转换原则
⒈ 一个 实体型 转换为一个关系模式。
关系的属性,实体型的属性
关系的码,实体型的码例,学生实体可以转换为如下关系模式:
学生( 学号,姓名,出生日期,所在系,
年级,平均成绩)
性别、宿舍、班级、档案材料、教师、课程、教室、
教科书都分别转换为一个关系模式。
学生学号 出生日期 年级所在系 平均成绩姓名
E-R图向关系模型的转换(续)
⒉ 一个 m:n联系 转换为一个关系模式。
关系的属性,与该联系相连的各实体的码以及联系本身的属性
关系的码,各实体码的组合例,,选修,联系是一个 m:n联系,可以将它转换为如下关系模式,其中学号与课程号为关系的组合码:
选修( 学号,课程号,成绩)
E-R图向关系模型的转换(续)
⒊ 一个 1:n联系 可以转换为一个独立的关系模式,
也可以与 n端对应的关系模式合并。
1) 转换为一个独立的关系模式
关系的属性,与该联系相连的各实体的码以及联系本身的属性
关系的码,n端实体的码
E-R图向关系模型的转换(续)
2) 与 n端对应的关系模式合并
合并后关系的属性,在 n端关系中加入 1端关系的码和联系本身的属性
合并后关系的码,不变
可以减少系统中的关系个数,一般情况下更倾向于采用这种方法
E-R图向关系模型的转换(续)
例,,组成,联系为 1:n联系。
将其转换为关系模式的两种方法:
1)使其成为一个独立的关系模式:
组成( 学号,班级号)
2)将其学生关系模式合并:
学生( 学号,姓名,出生日期,所在系,
年级,班级号,平均成绩)
E-R图向关系模型的转换(续)
⒋ 一个 1:1联系可以转换为一个独立的关系模式,
也可以与任意一端对应的关系模式合并。
1) 转换为一个独立的关系模式
关系的属性,与该联系相连的各实体的码以及联系本身的属性
关系的候选码,每个实体的码均是该关系的候选码
E-R图向关系模型的转换(续)
2) 与某一端对应的关系模式合并
合并后关系的属性,加入对应关系的码和联系本身的属性
合并后关系的码,不变
E-R图向关系模型的转换(续)
例,,管理,联系为 1:1联系,可以有三种转换方法:
( 1)转换为一个独立的关系模式:
管理( 职工号,班级号)
或 管理(职工号,班级号 )
( 2),管理,联系与班级关系模式合并,则只需在班级关系中加入教师关系的码,即职工号:
班级:( 班级号,学生人数,职工号 )
( 3),管理,联系与教师关系模式合并,则只需在教师关系中加入班级关系的码,即班级号:
教师:( 职工号,姓名,性别,职称,班级号,
是否为优秀班主任)
E-R图向关系模型的转换(续)
注意:
从理论上讲,1:1联系可以与任意一端对应的关系模式合并。
但在一些情况下,与不同的关系模式合并效率会大不一样。因此究竟应该与哪端的关系模式合并需要依应用的具体情况而定。
由于连接操作是最费时的操作,所以一般应以尽量减少连接操作为目标。
例如,如果经常要查询某个班级的班主任姓名,则将管理联系与教师关系合并更好些。
E-R图向关系模型的转换(续)
⒌ 三个或三个以上实体间的一个 多元联系 转换为一个关系模式。
关系的属性,与该多元联系相连的各实体的码以及联系本身的属性
关系的码,各实体码的组合例,,讲授,联系是一个三元联系,可以将它转换为如下关系模式,其中课程号、职工号和书号为关系的组合码:
讲授( 课程号,职工号,书号 )
E-R图向关系模型的转换(续)
⒍ 同一实体集的实体间的联系,即 自联系,也可按上述 1:1,1:n和 m:n三种情况分别处理。
例,如果教师实体集内部存在领导与被领导的
1:n自联系,我们可以将该联系与教师实体合并,这时主码职工号将多次出现,但作用不同,
可用不同的属性名加以区分:
教师:{ 职工号,姓名,性别,职称,系主任 }
E-R图向关系模型的转换(续)
⒎ 具有相同码的关系模式可合并。
目的:减少系统中的关系个数。
合并方法:将其中一个关系模式的全部属性加入到另一个关系模式中,然后去掉其中的同义属性(可能同名也可能不同名),并适当调整属性的次序。
E-R图向关系模型的转换(续)
例,,拥有,关系模式:
拥有( 学号,性别)
与学生关系模式:
学生( 学号,姓名,出生日期,所在系,年级,
班级号,平均成绩)
都以学号为码,可以将它们合并为一个关系模式:
学生( 学号,姓名,性别,出生日期,所在系,
年级,班级号,平均成绩)
E-R图向关系模型的转换(续)
实例
按照上述七条原则,学生管理子系统中的 18个实体和联系可以转换为下列关系模型:
学生( 学号,姓名,性别,出生日期,所在系,
年级,班级号,平均成绩,档案号)
性别( 性别,宿舍楼)
宿舍( 宿舍编号,地址,性别,人数)
班级( 班级号,学生人数)
教师( 职工号,姓名,性别,职称,班级号,
是否为优秀班主任)
E-R图向关系模型的转换(续)
教学( 职工号,学号 )
课程( 课程号,课程名,学分,教室号)
选修( 学号,课程号,成绩)
教科书( 书号,书名,价钱)
教室( 教室编号,地址,容量)
讲授( 课程号,教师号,书号 )
档案材料( 档案号,…… )
E-R图向关系模型的转换(续)
该关系模型由 12个关系模式组成。
其中:
学生关系模式包含了,拥有,联系,,组成,
联系,,归档,联系所对应的关系模式
教师关系模式包含了,管理,联系所对应的关系模式;
宿舍关系模式包含了,住宿,联系所对应的关系模式;
课程关系模式包含了,开设,联系所对应的关系模式 。
6.4 逻辑结构设计
6.4.1 E-R图向关系模型的转换
6.4.2 向特定 DBMS规定的模型进行转换
6.4.3 数据模型的优化
6.4.4 设计用户子模式
6.4.2 向特定 DBMS规定的模型进行转换
一般的数据模型还需要向特定 DBMS规定的模型进行转换。
转换的主要依据是所选用的 DBMS的功能及限制。没有通用规则。
对于关系模型来说,这种转换通常都比较简单。
6.4 逻辑结构设计
6.4.1 E-R图向关系模型的转换
6.4.2 向特定 DBMS规定的模型进行转换
6.4.3 数据模型的优化
6.4.4 设计用户子模式
6.4.3 数据模型的优化
数据库逻辑设计的结果不是唯一的。
得到初步数据模型后,还应该适当地修改、调整数据模型的结构,以进一步提高数据库应用系统的性能,这就是数据模型的优化。
关系数据模型的优化通常以 规范化理论为指导。
数据模型的优化(续)
优化数据模型的方法
⒈ 确定数据依赖
按需求分析阶段所得到的语义,分别写出每个关系模式内部各属性之间的数据依赖以及不同关系模式属性之间数据依赖 。
数据模型的优化(续)
例,课程关系模式内部存在下列数据依赖:
课程号 → 课程名课程号 → 学分课程号 → 教室号选修关系模式中存在下列数据依赖:
(学号,课程号) → 成绩数据模型的优化(续)
⒉ 对于各个关系模式之间的数据依赖进行极小化处理,消除冗余的联系。
数据模型的优化(续)
⒊ 按照数据依赖的理论对关系模式逐一进行分析,
考查是否存在部分函数依赖、传递函数依赖、多值依赖等,确定各关系模式分别属于第几范式。
例如经过分析可知,课程关系模式属于 BC范式。
数据模型的优化(续)
⒋ 按照需求分析阶段得到的各种应用对数据处理的要求,分析对于这样的应用环境这些模式是否合适,确定是否要对它们进行 合并 或分解 。
数据模型的优化(续)
并不是规范化程度越高的关系就越优。
当一个应用的查询中经常涉及到两个或多个关系模式的属性时,系统必须经常地进行联接运算,而联系运算的代价是相当高的,可以说关系模型低效的主要原因就是做联接运算引起的,因此在这种情况下,第二范式甚至第一范式也许是最好的。
数据模型的优化(续)
非 BCNF的关系模式虽然从理论上分析会存在不同程度的更新异常,但如果在实际应用中对此关系模式只是查询,并不执行更新操作,则就不会产生实际影响。
对于一个具体应用来说,到底规范化进行到什么程度,需要权衡响应时间和潜在问题两者的利弊才能决定。一般说来,第三范式就足够了。
数据模型的优化(续)
例:在关系模式学生成绩单 (学号,英语,数学,语文,平均成绩 )
中存在下列函数依赖:
学号 → 英语学号 → 数学学号 → 语文学号 → 平均成绩
(英语,数学,语文 )→ 平均成绩数据模型的优化(续)
显然有:
学号 → (英语,数学,语文 )
因此该关系模式中存在传递函数信赖,是
2NF关系。
虽然平均成绩可以由其他属性推算出来,但如果应用中需要经常查询学生的平均成绩,
为提高效率,我们仍然可保留该冗余数据,
对关系模式不再做进一步分解。
数据模型的优化(续)
⒌ 按照需求分析阶段得到的各种应用对数据处理的要求,对关系模式进行必要的分解或合并,以提高数据操作的效率和存储空间的利用率
常用分解方法
水平分解
垂直分解数据模型的优化(续)
水平分解
什么是水平分解
把 (基本 )关系的元组分为若干子集合,
定义每个子集合为一个子关系,以提高系统的效率 。
数据模型的优化(续)
水平分解的适用范围
1,满足,80/20原则,的应用
80/20原则:一个大关系中,经常被使用的数据只是关系的一部分,约 20%
把经常使用的数据分解出来,形成一个子关系,可以减少查询的数据量 。
数据模型的优化(续)
水平分解的适用范围
2,并发事务经常存取不相交的数据
如果关系 R上具有 n个事务,而且多数事务存取的数据不相交,则 R可分解为少于或等于 n个子关系,使每个事务存取的数据对应一个关系 。
数据模型的优化(续)
水平分解
什么是水平分解
把 (基本 )关系的元组分为若干子集合,
定义每个子集合为一个子关系,以提高系统的效率 。
水平分解的适用范围
满足,80/20原则,的应用
并发事务经常存取不相交的数据数据模型的优化(续)
满足,80/20原则,的应用
80/20原则:一个大关系中,经常被使用的数据只是关系的一部分,约 20%
把经常使用的数据分解出来,形成一个子关系,可以减少查询的数据量 。
并发事务经常存取不相交的数据
如果关系 R上具有 n个事务,而且多数事务存取的数据不相交,则 R可分解为少于或等于 n个子关系,使每个事务存取的数据对应一个关系 。
数据模型的优化(续)
垂直分解
什么是垂直分解
把关系模式 R的属性分解为若干子集合,
形成若干子关系模式 。
垂直分解的原则
经常在一起使用的属性从 R中分解出来形成一个子关系模式 。
数据模型的优化(续)@
垂直分解的 优点
可以提高某些事务的效率
垂直分解的 缺点
可能使另一些事务不得不执行连接操作,从而降低了效率 。
数据模型的优化(续)
垂直分解的适用范围
取决于分解后 R上的所有事务的总效率是否得到了提高 。
进行垂直分解的方法
简单情况:直观分解
复杂情况:用第五章中的模式分解算法
垂直分解必须不损失关系模式的语义 (保持无损连接性和保持函数依赖 )。
6.4 逻辑结构设计
6.4.1 E-R图向关系模型的转换
6.4.2 向特定 DBMS规定的模型进行转换
6.4.3 数据模型的优化
6.4.4 设计用户子模式
6.4.4 设计用户子模式
定义数据库模式主要是从系统的时间效率、空间效率、易维护等角度出发。
定义 用户外模式 时应该更注重考虑用户的习惯与方便。包括三个方面:
设计用户子模式(续)
(1) 使用更符合用户习惯的别名
合并各分 E-R图曾做了消除命名冲突的工作,
以使数据库系统中同一关系和属性具有唯一的名字。这在设计数据库整体结构时是非常必要的。
但对于某些局部应用,由于改用了不符合用户习惯的属性名,可能会使他们感到不方便,
设计用户子模式(续)
因此在设计用户的子模式时可以重新定义某些属性名,使其与用户习惯一致。
当然,为了应用的规范化,我们也不应该一味地迁就用户。
例:负责学籍管理的用户习惯于称教师模式的职工号为教师编号。因此可以定义视图,
在视图中职工号重定义为教师编号设计用户子模式(续)
(2) 针对不同级别的用户定义不同的外模式,以满足系统对安全性的要求。
设计用户子模式(续)
例:
教师关系模式中包括职工号、姓名、性别、出生日期、婚姻状况、学历、学位、政治面貌、职称、
职务、工资、工龄、教学效果等属性。
学籍管理应用 只能查询教师的职工号、姓名、
性别、职称数据;
课程管理应用 只能查询教师的职工号、姓名、
性别、学历、学位、职称、教学效果数据;
教师管理应用 则可以查询教师的全部数据。
设计用户子模式(续)
定义两个外模式:
教师 _学籍管理 (职工号,姓名,性别,职称 )
教师 _课程管理 (工号,姓名,性别,学历,
学位,职称,教学效果 )
授权学籍管理应用只能访问教师 _学籍管理视图授权课程管理应用只能访问教师 _课程管理视图授权教师管理应用能访问教师表这样就可以防止用户非法访问本来不允许他们查询的数据,保证了系统的安全性。
设计用户子模式(续)
(3) 简化用户对系统的使用
如果某些局部应用中经常要使用某些很复杂的查询,为了方便用户,可以将这些复杂查询定义为视图。
逻辑结构设计 小结
任务
将概念结构转化为具体的数据模型
逻辑结构设计的步骤
将概念结构转化为一般的关系、网状、层次模型
将转化来的关系、网状、层次模型向特定 DBMS
支持下的数据模型转换
对数据模型进行优化
设计用户子模式逻辑结构设计小结
E-R图向关系模型的转换内容
将 E-R图转换为关系模型:将实体、实体的属性和实体之间的联系转化为关系模式。
逻辑结构设计小结
E-R图向关系模型的转换原则
⒈ 一个 实体型 转换为一个关系模式。
⒉ 一个 m:n联系 转换为一个关系模式。
⒊ 一个 1:n联系 可以转换为一个独立的关系模式,
也可以与 n端对应的关系模式合并。
⒋ 一个 1:1联系 可以转换为一个独立的关系模式,
也可以与任意一端对应的关系模式合并。
逻辑结构设计小结
⒌ 三个或三个以上实体间的一个 多元联系 转换为一个关系模式。
⒍ 同一实体集的实体间的联系,即 自联系,也可按上述 1:1,1:n和 m:n三种情况分别处理。
⒎ 具有 相同码 的关系模式可合并。
逻辑结构设计小结
优化数据模型的方法
⒈ 确定数据依赖
⒉ 对于各个关系模式之间的数据依赖进行极小化处理,消除冗余的联系。
⒊ 确定各关系模式分别属于第几范式。
⒋ 分析对于应用环境这些模式是否合适,确定是否要对它们进行合并或分解。
⒌ 对关系模式进行必要的分解或合并逻辑结构设计小结
设计用户子模式
1,使用更符合用户习惯的别名
2,针对不同级别的用户定义不同的外模式,以满足系统对安全性的要求。
3,简化用户对系统的使用第六章 数据库设计
6.1 数据库设计概述
6.2 需求分析
6.3 概念结构设计
6.4 逻辑结构设计
6.5 数据库的物理设计
6.6 数据库实施
6.7 数据库运行与维护
6.8 小结
6.5 数据库的物理设计
什么是数据库的物理设计
数据库在 物理设备 上的 存储结构 与 存取方法称为数据库的物理结构,它依赖于给定的计算机系统。
为一个给定的逻辑数据模型选取一个最适合应用环境的物理结构的过程,就是数据库的物理设计。
6.5 数据库的物理设计
数据库物理设计的步骤
确定数据库的物理结构
对物理结构进行评价,评价的重点是时间和空间效率
如果评价结果满足原设计要求则可进入到物理实施阶段,否则,就需要重新设计或修改物理结构,有时甚至要返回逻辑设计阶段修改数据模型。
数据库物理设计确定数据库的物理结构评价数据库的物理结构逻辑结构设计数据库实施物理模型逻辑模型
6.5 数据库的物理设计
6.5.1 数据库的物理设计的内容和方法
6.5.2 关系模式存取方法选择
6.5.3 确定数据库的存储结构
6.5.4 评价物理结构
6.5 数据库的物理设计
6.5.1 数据库的物理设计的内容和方法
6.5.2 关系模式存取方法选择
6.5.3 确定数据库的存储结构
6.5.4 评价物理结构
6.5.1 数据库的物理设计的内容和方法
设计物理数据库结构的准备工作
1,充分了解应用环境,详细分析要运行的事务,以获得选择物理数据库设计所需参数
2,充分了解所用 RDBMS的内部特征,特别是系统提供的存取方法和存储结构数据库的物理设计的内容和方法(续)
选择物理数据库设计所需参数
数据库查询事务
查询的关系
查询条件所涉及的属性
连接条件所涉及的属性
查询的投影属性数据库的物理设计的内容和方法(续)
选择物理数据库设计所需参数 (续 )
数据更新事务
被更新的关系
每个关系上的更新操作条件所涉及的属性
修改操作要改变的属性值
每个事务在各关系上运行的频率和性能要求数据库的物理设计的内容和方法(续)
关系数据库物理设计的内容
1,为关系模式选择 存取方法 (建立存取路径 )
2,设计关系、索引等数据库文件的 物理存储结构
6.5 数据库的物理设计
6.5.1 数据库的物理设计的内容和方法
6.5.2 关系模式存取方法选择
6.5.3 确定数据库的存储结构
6.5.4 评价物理结构
6.5.2 关系模式存取方法选择
数据库系统是多用户共享的系统,对同一个关系要建立多条存取路径才能满足多用户的多种应用要求。
物理设计的第一个任务就是要确定选择哪些存取方法,即建立哪些存取路径。
关系模式存取方法选择(续)
DBMS常用存取方法
索引方法,目前主要是 B+树索引方法
聚簇( Cluster)方法
HASH方法一、索引存取方法的选择
选择索引存取方法的主要内容根据应用要求确定
对哪些属性列建立索引
对哪些属性列建立组合索引
对哪些索引要设计为唯一索引索引存取方法的选择(续)
选择索引存取方法的一般规则
如果一个 (或一组 )属性经常在 查询 条件中出现,则考虑在这个 (或这组 )属性上建立索引
(或组合索引 )
如果一个属性经常作为 最大值和最小值 等聚集函数的参数,则考虑在这个属性上建立索引
如果一个 (或一组 )属性经常在 连接 操作的连接条件中出现,则考虑在这个 (或这组 )属性上建立索引索引存取方法的选择(续)
关系上定义的索引数 过多 会带来较多的额外开销
维护索引的开销
查找索引的开销二、聚簇存取方法的选择
什么是聚簇
为了提高某个属性(或属性组)的查询速度,
把这个或这些属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块称为聚簇
许多关系型 DBMS都提供了聚簇功能
聚簇存放与聚簇索引的区别建立聚簇索引 (复习)
聚簇索引
建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放 。 也即聚簇索引的索引项顺序与表中元组的物理顺序一致 。
例:
CREATE CLUSTER INDEX Stusname ON Student(Sname);
在 Student表的 Sname( 姓名 ) 列上建立一个聚簇索引,而且 Student表中的记录将按照 Sname值的升序存放建立聚簇索引 (复习)
在一个基本表上最多只能建立一个聚簇索引
聚簇索引的用途:对于某些类型的查询,可以提高查询效率
聚簇索引的适用范围
很少对基表进行增删操作
很少对其中的变长列进行修改操作聚簇存取方法的选择(续)
聚簇的用途
1,大大提高按聚簇属性进行查询的效率例:假设学生关系按所在系建有索引,现在要查询信息系的所有学生名单。
信息系的 500名学生分布在 500个不同的物理块上时,至少要执行 500次 I/O操作。
如果将同一系的学生元组集中存放,则每读一个物理块可得到多个满足查询条件的元组,
从而显著地减少了访问磁盘的次数。
聚簇存取方法的选择(续)
2,节省存储空间
聚簇以后,聚簇码相同的元组集中在一起了,因而聚簇码值不必在每个元组中重复存储,只要在一组中存一次就行了聚簇存取方法的选择(续)
聚簇的局限性
1,聚簇只能提高某些特定应用的性能
2,建立与维护聚簇的开销相当大
对已有关系建立聚簇,将导致关系中元组移动其物理存储位置,并使此关系上原有的索引无效,必须重建。
当一个元组的聚簇码改变时,该元组的存储位置也要做相应移动。
聚簇存取方法的选择(续)
聚簇的适用范围
1,既适用于单个关系独立聚簇,也适用于多个关系组合聚簇例:假设用户经常要按系别查询学生成绩单,这一查询涉及学生关系和选修关系的连接操作,即需要按学号连接这两个关系,为提高连接操作的效率,可以把具有相同学号值的学生元组和选修元组在物理上聚簇在一起。这就相当于把多个关系按,预连接,的形式存放,从而大大提高连接操作的效率。
聚簇存取方法的选择(续)
2,当通过聚簇码进行访问或连接是该关系的主要应用,与聚簇码无关的其他访问很少或者是次要的时,可以使用聚簇。
尤其当 SQL语句中包含有与聚簇码有关的
ORDER BY,GROUP BY,UNION,
DISTINCT等子句或短语时,使用聚簇特别有利,可以省去对结果集的排序操作聚簇存取方法的选择(续)
选择聚簇存取方法
1,设计候选聚簇
对经常在一起进行连接操作的关系可以建立组合聚簇;
如果一个关系的一组属性经常出现在相等比较条件中,则该单个关系可建立聚簇;
如果一个关系的一个 (或一组 )属性上的值重复率很高,则此单个关系可建立聚簇。
即对应每个聚簇码值的平均元组数不太少。
太少了,聚簇的效果不明显。
聚簇存取方法的选择(续)
2,检查候选聚簇中的关系,取消其中不必要的关系
从独立聚簇中删除经常进行全表扫描的关系;
从独立 /组合聚簇中删除更新操作远多于查询操作的关系;
从独立 /组合聚簇中删除重复出现的关系
当 一个关系同时加入多个聚簇 时,必须 从这多个聚簇方案 (包括不建立聚簇 )中选择一个较优的,即在这个聚簇上运行各种事务的总代价最小。
三,HASH存取方法的选择
选择 HASH存取方法的规则
当一个关系满足下列两个条件时,可以选择
HASH存取方法
该关系的属性主要出现在 等值连接 条件中或主要出现在 相等比较 选择条件中
该关系的大小可预知,而且不变;
或该关系的大小动态改变,但所选用的
DBMS提供了动态 HASH存取方法。
6.5 数据库的物理设计
6.5.1 数据库的物理设计的内容和方法
6.5.2 关系模式存取方法选择
6.5.3 确定数据库的存储结构
6.5.4 评价物理结构
6.5.3 确定数据库的存储结构
确定数据库物理结构的内容
1,确定数据的存放位置和存储结构
关系
索引
聚簇
日志
备份
2,确定系统配置
1,确定数据的存放位置
影响数据存放位置和存储结构的因素
硬件环境
应用需求
存取时间
存储空间利用率
维护代价这三个方面常常是相互矛盾的例:消除一切冗余数据虽能够节约存储空间和减少维护代价,但往往会导致检索代价的增加必须进行权衡,选择一个折中方案 。
确定数据的存放位置(续)
基本原则
根据应用情况将
易变 部分与 稳定 部分
存取频率较高 部分与 存取频率较低 部分分开存放,以提高系统性能确定数据的存放位置(续)
例:
数据库数据备份、日志文件备份等由于只在故障恢复时才使用,而且数据量很大,
可以考虑存放在磁带上。
如果计算机有多个磁盘,可以考虑将表和索引分别放在不同的磁盘上,在查询时,
由于两个磁盘驱动器分别在工作,因而可以保证物理读写速度比较快。
确定数据的存放位置(续)
例(续):
可以将比较大的表分别放在两个磁盘上,
以加快存取速度,这在多用户环境下特别有效。
可以将日志文件与数据库对象(表、索引等)放在不同的磁盘以改进系统的性能。
2,确定系统配置
DBMS产品一般都提供了一些存储分配参数
同时使用数据库的用户数
同时打开的数据库对象数
使用的缓冲区长度、个数
时间片大小
数据库的大小
装填因子
锁的数目
等等
6.5 数据库的物理设计
6.5.1 数据库的物理设计的内容和方法
6.5.2 关系模式存取方法选择
6.5.3 确定数据库的存储结构
6.5.4 评价物理结构
6.5.4 评价物理结构
评价内容
对数据库物理设计过程中产生的多种方案进行细致的评价,从中选择一个较优的方案作为数据库的物理结构
6.5.4 评价物理结构
评价方法
定量估算各种方案
存储空间
存取时间
维护代价
对估算结果进行权衡、比较,选择出一个较优的合理的物理结构
如果该结构不符合用户需求,则需要修改设计第六章 数据库设计
6.1 数据库设计概述
6.2 需求分析
6.3 概念结构设计
6.4 逻辑结构设计
6.5 数据库的物理设计
6.6 数据库实施
6.7 数据库运行与维护
6.8 小结
6.6 数据库的实施
数据库实施的工作内容
用 DDL定义数据库结构
组织数据入库
编制与调试应用程序
数据库试运行数据库实施定义数据库结构数据装载数据库试运行数据库物理设计 数据库运行和维护物理模型编制与调试应用程序数据库系统一、定义数据库结构
确定了数据库的逻辑结构与物理结构后,
就可以用所选用的 DBMS提供的数据定义语言( DDL)来严格描述数据库结构。
定义数据库结构(续)
例,对于前面的例子,可以用 SQL语句如下定义表结构:
CREATE TABLE 学生
(学号 CHAR(8),
……………
);
CREATE TABLE 课程
(
……………
);
……………
定义数据库结构(续)
接下来是在这些基本表上定义视图:
CREATE VIEW,...
(
……………
);
……………
如果需要使用聚簇,在建基本表之前,应先用
CREATE CLUSTER语句定义聚族。
二、数据装载
数据库结构建立好后,就可以向数据库中装载数据了。组织数据入库是数据库实施阶段最主要的工作。
数据装载方法
人工方法
计算机辅助数据入库数据装载(续)
人工方法:适用于小型系统
步骤
1) 筛选数据 。需要装入数据库中的数据通常都分散在各个部门的数据文件或原始凭证中,所以首先必须把需要入库的数据筛选出来。
2) 转换数据格式 。筛选出来的需要入库的数据,其格式往往不符合数据库要求,还需要进行转换。这种转换有时可能很复杂。
3) 输入数据 。将转换好的数据输入计算机中。
4) 校验数据 。检查输入的数据是否有误。
数据装载(续)
计算机辅助数据入库:适用于中大型系统
步骤
1) 筛选数据
2) 输入数据 。由录入员将原始数据直接输入计算机中。数据输入子系统应提供输入界面。
3) 校验数据 。数据输入子系统采用多种检验技术检查输入数据的正确性。
数据装载(续)
4) 转换数据 。数据输入子系统根据数据库系统的要求,从录入的数据中 抽取 有用成分,对其进行 分类,然后 转换 数据格式。
抽取、分类和转换数据是数据输入子系统的主要工作,也是数据输入子系统的复杂性所在。
5) 综合数据 。数据输入子系统对转换好的数据根据系统的要求进一步综合成最终数据 。
数据装载(续)
如果数据库是在老的文件系统或数据库系统的基础上设计的,则数据输入子系统只需要完成转换数据、综合数据两项工作,直接将老系统中的数据转换成新系统中需要的数据格式。
为了保证数据能够及时入库,应在数据库物理设计的同时编制数据输入子系统。
三、编制与调试应用程序
数据库应用程序的设计应该与数据设计并行进行。
在数据库实施阶段,当数据库结构建立好后,
就可以开始编制与调试数据库的应用程序。调试应用程序时由于数据入库尚未完成,可先使用模拟数据。
四、数据库试运行
应用程序调试完成,并且已有一小部分数据入库后,就可以开始数据库的试运行。
数据库试运行也称为联合调试,其主要工作包括:
1) 功能测试,实际运行应用程序,执行对数据库的各种操作,测试应用程序的各种功能。
2) 性能测试,测量系统的性能指标,分析是否符合设计目标 。
数据库试运行(续)
数据库性能指标的测量
数据库物理设计阶段在评价数据库结构估算时间、
空间指标时,作了许多简化和假设,忽略了许多次要因素,因此结果必然很粗糙。
数据库试运行则是要实际测量系统的各种性能指标(不仅是时间、空间指标),如果结果不符合设计目标,则需要返回物理设计阶段,调整物理结构,修改参数;有时甚至需要返回逻辑设计阶段,调整逻辑结构。
数据库试运行(续)
数据的分期入库
重新设计物理结构甚至逻辑结构,会导致数据重新入库。
由于数据入库工作量实在太大,所以可以采用分期输入数据的方法
先输入小批量数据供先期联合调试使用
待试运行基本合格后再输入大批量数据
逐步增加数据量,逐步完成运行评价数据库试运行(续)
数据库的转储和恢复
在数据库试运行阶段,系统还不稳定,硬、
软件故障随时都可能发生
系统的操作人员对新系统还不熟悉,误操作也不可避免
因此必须做好数据库的转储和恢复工作,尽量减少对数据库的破坏。
第六章 数据库设计
6.1 数据库设计概述
6.2 需求分析
6.3 概念结构设计
6.4 逻辑结构设计
6.5 数据库的物理设计
6.6 数据库实施
6.7 数据库运行与维护
6.8 小结
6.7 数据库运行与维护
数据库试运行结果符合设计目标后,数据库就可以真正投入运行了。
数据库投入运行标着开发任务的基本完成和维护工作的开始
对数据库设计进行评价、调整、修改等维护工作是一个长期的任务,也是设计工作的继续和提高。
应用环境在不断变化
数据库运行过程中物理存储会不断变化数据库运行与维护(续)
在数据库运行阶段,对数据库经常性的维护工作主要是由 DBA完成的,包括:
⒈数据库的转储和恢复
转储和恢复是系统正式运行后最重要的维护工作之一。
DBA要针对不同的应用要求制定不同的转储计划,
定期对数据库和日志文件进行备份。
一旦发生介质故障,即利用数据库备份及日志文件备份,尽快将数据库恢复到某种一致性状态。
数据库运行与维护(续)
⒉ 数据库的安全性、完整性控制
DBA必须根据用户的实际需要授予不同的操作权限
在数据库运行过程中,由于应用环境的变化,对安全性的要求也会发生变化,DBA需要根据实际情况修改原有的安全性控制。
由于应用环境的变化,数据库的完整性约束条件也会变化,也需要 DBA不断修正,以满足用户要求。
数据库运行与维护(续)
⒊ 数据库性能的监督、分析和改进
在数据库运行过程中,DBA必须监督系统运行,对监测数据进行分析,找出改进系统性能的方法。
利用监测工具获取系统运行过程中一系列性能参数的值
通过仔细分析这些数据,判断当前系统是否处于最佳运行状态
如果不是,则需要通过调整某些参数来进一步改进数据库性能数据库运行与维护(续)
⒋ 数据库的重组织和重构造
1)数据库的重组织
为什么要重组织数据库
数据库运行一段时间后,由于记录的不断增、删、改,会使数据库的物理存储变坏,
从而降低数据库存储空间的利用率和数据的存取效率,使数据库的性能下降。
数据库运行与维护(续)
重组织的形式
全部重组织
部分重组织
只对频繁增、删的表进行重组织
重组织的目标
提高系统性能数据库运行与维护(续)
重组织的工作
按原设计要求
重新安排存储位置
回收垃圾
减少指针链
数据库的重组织不会改变原设计的数据逻辑结构和物理结构数据库运行与维护(续)
2)数据库的重构造
为什么要进行数据库的重构造
数据库应用环境发生变化,会导致实体及实体间的联系也发生相应的变化,使原有的数据库设计不能很好地满足新的需求
增加新的应用或新的实体
取消某些已有应用
改变某些已有应用数据库运行与维护(续)
数据库重构造的主要工作
根据新环境调整数据库的模式和内模式
增加新的数据项
改变数据项的类型
改变数据库的容量
增加或删除索引
修改完整性约束条件数据库运行与维护(续)
重构造数据库的程度是有限的
若应用变化太大,已无法通过重构数据库来满足新的需求,或重构数据库的代价太大,则表明现有数据库应用系统的生命周期已经结束,应该重新设计新的数据库系统,开始新数据库应用系统的生命周期了。
第六章 数据库设计
6.1 数据库设计概述
6.2 需求分析
6.3 概念结构设计
6.4 逻辑结构设计
6.5 数据库的物理设计
6.6 数据库实施
6.7 数据库运行与维护
6.8 小结
6.8 小结
数据库的设计过程
需求分析
概念结构设计
逻辑结构设计
物理设计
实施
运行维护设计过程中往往还会有许多反复。
小结(续)
数据库各级模式的形成
数据库的各级模式是在设计过程中逐步形成的
需求分析阶段综合各个用户的应用需求(现实世界的需求)。
概念设计阶段形成独立于机器特点、独立于各个 DBMS产品的 概念模式 (信息世界模型),用 E-R图来描述。
小结(续)
在逻辑设计阶段将 E-R图转换成具体的数据库产品支持的数据模型如关系模型,形成数据库 逻辑模式 。然后根据用户处理的要求,
安全性的考虑,在基本表的基础上再建立必要的视图( VIEW)形成数据的 外模式 。
在物理设计阶段根据 DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库 内模式 。
复习题
1,ER图一般用于描述()阶段的工作成果。
A、需求分析
B、概念结构设计
C、逻辑结构设计
D、物理结构设计
2、下列模型中,适宜作为设计人员与用户间交流工具的是()
A、概念模型
B、逻辑模型
C、物理模型
D、关系模型
ER图的三要素是()
A、实体、属性、实体集
B、实体、键、联系
C、实体、属性、联系
D、实体、域、候选键设有两个实体集 A和 B,A中实体可能与 B中零个或多个实体相联系,而 B中实体至多和
A中一个实体有联系,则称 A和 B具有()
联系
A、一对一
B、一对多
C、多对多
D、多对一先从中层数据流图出发设计系统的局部 ER图,
再对各局部 ER图进行集成和优化,这种方法属于概念结构设计中的()方法
A、自顶向下
B、自底向上
C、自内向外
D、混合策略下列对 ER图设计的说法错误的是()
A、设计局部 ER图中,能作为属性处理的客观事物应尽量作为属性处理
B、局部 ER图中的属性均应为原子属性,即不能再细分为子属性的组合
C、对局部 ER图集成时既可以一次实现全部集成,
也可以两两集成,逐步进行
D、集成后所得的 ER图中可能存在冗余数据和冗余联系,应予以全部清除。
下列属于逻辑结构设计阶段任务的是()
A、生成数据字典
B、集成局部 ER图
C、将 ER图转换为一组关系模式
D、确定数据存取方法
若在两个局部 ER图中,实体,商品,的编号一个被定义为数值型,另一个被定义为字符型,则称之为()
A、属性冲突
B、命名冲突
C、联系冲突
D、结构冲突
在数据库的概念设计和逻辑设计之间起桥梁作用的是()
A、数据结构图
B、功能模块图
C、实体联系图
D、数据流图
将一个一对多联系型转换为一个独立关系模式时,应取()为关键字。
A、一端实体型的关键属性
B、多端实体型的关键属性
C、两个实体型的关键属性的组合
D、联系型的全体属性
将一个 M对 N( M>N)的联系型转换为关系模式时,应()
A、转换为一个独立的关系模式
B、与 M端的实体型所对应的关系模式合并
C、与 N端的实体型所对应的关系模式合并
D、以上都可以
在从 ER图到关系模式的转化过程中,下列说法错误的是()
A、一个一对一的联系可以转换为一个独立的关系模式
B、一个涉及到 3个以上实体的多元联系也可以转换为一个独立的关系模式
C、对关系模型优化时有些模式可能要进一步分解,
有些模式可能要合并
D、关系模式的规范化程度越高,查询的效率就越高。
设在一个 ER模型中有 6个不同的实体集和 9个不同的二元联系,其中包括 3个一对一联系,3
个一对多联系和 3个多对多联系,则将此 ER模型转换成关系模型时,至少得到()个关系模式。
A,6
B,9
C,12
D,15
对数据库的物理设计优劣评价的重点是
()
A、时空效率
B、动态和静态性能
C、用户界面的友好性
D、成本和效益数据库的物理结构设计的目的是()
A、找到一个有效、可实现的数据库存储结构
B、导出特定的 DBMS可以处理的数据库模式和外模式
C、产生反映企业组织信息需求的数据库概念结构
D、收集支持系统目标的基础数据及其处理方法
不属于数据库物理结构设计阶段任务的
()
A、确定选用的 DBMS
B、确定数据的存放位置
C、确定数据的存取方法
D、初步确定系统的配置画出 ER图
设有一商业企业的局部应用,包含 3个实体:
,顾客,,,商品,和,厂家,,且有如下事实:顾客可以根据自己的意愿选择要购买的商品;每种商品可以有多个厂家供应。若顾客的属性包括顾客姓名、电话号码,商品的属性包括代码、品名、单价,厂家的属性包括代码、名称、地址。试画出 ER图。
设某百货公司下设若干连锁店,每家连锁店有若干职工,每个职工只能服务于一家连锁店,每家连锁店经营若干商品,
各连锁店经营的商品不完全相同。试自行设计属性,画出该百货公司管理数据库的 ER图,并将 ER图转换为关系模型。
设有电影放映管理系统的一个局部 ER图,
试将其转化为关系模型,并根据语义确定各关系模式的关键字。
电影 影院摄制单位 票房总额 所在城市影院代码结束日期起始日期发行代号电影名称放映n m
作业设某商业集团数据库中有 3个实体集。一是,公司,实体集,属性有公司编号、公司名、地址等;二是,仓库,
实体集,属性有仓库编号、仓库名、地址等;三是
,职工,实体集,属性有职工编号、姓名、性别等。
公司与仓库间存在,隶属,联系,每个公司管辖若干仓库,每个仓库只能属于一个公司管辖;仓库与职工之间存在,聘用,联系,每个仓库可聘用多个职工,每个职工只能在一个仓库工作,仓库聘用职工有聘期和工资。
( 1)试画出 ER图,并在图上注明属性、联系的类型
( 2)将 ER图转换成关系模式集,并指出每个关系模式的主键和外键。
数据库系统概论
An Introduction to Database System
第七章 数据库恢复技术第三篇 系统篇
数据库系统中的数据是由 DBMS统一管理和控制的,为了适应数据共享的环境,DBMS必须提供数据保护能力,以保证数据库中数据的安全可靠和正确有效 。
数据保护
安全性
完整性
并发控制
数据库恢复第三篇 系统篇第七章 数据库恢复技术第八章 并发控制第九章 数据库安全性第十章 数据库完整性第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.1 事务的基本概念一、什么是事务二、如何定义事务三、事务的特性一、什么是事务
事务 (Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位
事务和程序是两个概念
在关系数据库中,一个事务可以是一条 SQL语句,
一组 SQL语句或整个程序
一个应用程序通常包含多个事务
事务是恢复和并发控制的基本单位二、如何定义事务
显式定义方式
BEGIN TRANSACTION BEGIN TRANSACTION
SQL 语句 1 SQL 语句 1
SQL 语句 2 SQL 语句 2
。。。。。 。。。。。
COMMIT ROLLBACK
隐式方式当用户没有显式地定义事务时,
DBMS按缺省规定自动划分事务事务结束
COMMIT
事务正常结束提交 事务的所有操作( 读 +更新 )
事务中所有对数据库的更新 永久 生效
ROLLBACK
事务异常终止
事务运行的过程中发生了故障,不能继续执行回滚事务的所有 更新 操作
事务滚回到 开始 时的状态三、事务的特性 (ACID特性 )
事务的 ACID特性:
原子性( Atomicity)
一致性( Consistency)
隔离性( Isolation)
持续性( Durability )
1,原子性
事务是数据库的逻辑工作单位
事务中包括的诸操作要么都做,要么都不做
2,一致性事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态一致性状态,
数据库中只包含成功事务提交的结果不一致状态,
数据库中包含失败事务的结果一 致性与原子性银行转帐:从帐号 A中取出一万元,存入帐号 B。
定义一个事务,该事务包括两个操作
这两个操作要么全做,要么全不做
全做或者全不做,数据库都处于一致性状态。
如果只做一个操作,数据库就处于不一致性状态 。
B=B+1
A=A-1
BA
3,隔离性对并发执行而言一个事务的执行不能被其他事务干扰
一个事务内部的操作及使用的数据对其他并发事务是隔离的
并发执行的各个事务之间不能互相干扰
T1的修改被 T2覆盖了!
读 A=16
A← A-3
写回 A=13
① 读 A=16
②
③ A← A-1
写回 A=15
④
T2T1
4,持续性
持续性也称永久性( Permanence)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
接下来的其他操作或故障不应该对其执行结果有任何影响。
事务的特性
保证事务 ACID特性是事务处理的任务
破坏事务 ACID特性的因素
多个事务并行运行时,不同事务的操作交叉执行
事务在运行过程中被强行停止第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.2 数据库恢复概述
故障是不可避免的
计算机硬件故障
系统软件和应用软件的错误
操作员的失误
恶意的破坏
故障的影响
运行事务非正常中断
破坏数据库数据库恢复概述(续)
数据库管理系统对故障的对策
DBMS提供恢复子系统
保证故障发生后,能把数据库中的数据从错误状态恢复到某种逻辑一致的状态
保证事务 ACID
恢复技术是衡量系统优劣的重要指标第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结一、事务故障
什么是事务故障
某个事务在运行过程中由于种种原因未运行至正常终止点就夭折了
事务故障的常见原因
输入数据有误
运算溢出
违反了某些完整性限制
某些应用程序出错
并行事务发生死锁
。。。。
事务故障的恢复
发生事务故障时,夭折的事务可能已把对数据库的部分修改写回磁盘
事务故障的恢复,撤消事务( UNDO)
强行回滚( ROLLBACK)该事务
清除该事务对数据库的所有修改,使得这个事务象根本没有启动过一样二、系统故障
什么是系统故障
整个系统的正常运行突然被破坏
所有正在运行的事务都非正常终止
内存中数据库缓冲区的信息全部丢失
外部存储设备上的数据未受影响系统故障的常见原因
操作系统或 DBMS代码错误
操作员操作失误
特定类型的硬件错误(如 CPU故障)
突然停电系统故障的恢复
清除尚未完成的事务对数据库的所有修改
系统 重新启动时,恢复程序要强行撤消
( UNDO)所有未完成事务
将缓冲区中已完成事务提交的结果写入数据库
系统 重新启动时,恢复程序需要重做
( REDO)所有已提交的事务
7.3 故障的种类
事务故障
系统故障
介质故障三、介质故障
硬件故障使存储在外存中的数据部分丢失或全部丢失
介质故障比前两类故障的可能性小得多,
但破坏性大得多介质故障的常见原因
硬件故障
磁盘损坏
磁头碰撞
操作系统的某种潜在错误
瞬时强磁场干扰介质故障的恢复
装入 数据库发生介质故障前某个时刻的数据 副本
重做自此时始的所有 成功事务,将这些事务已提交的结果重新记入数据库恢复操作的基本原理
恢复操作的基本原理,冗余
利用 存储在系统其它地方的 冗余数据 来 重建数据库中已被破坏或不正确的那部分数据
恢复的实现技术:复杂
一个大型数据库产品,恢复子系统的代码要占全部代码的 10%以上第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.4 恢复的实现技术恢复机制涉及的关键问题
1,如何建立冗余数据
数据转储( backup)
登录日志文件( logging)
2,如何利用这些冗余数据实施数据库恢复
7.4.1 数据转储一、什么是转储二、转储的用途三、转储方法一、什么是转储
转储是指 DBA将整个数据库复制到磁带或另一个磁盘上保存起来的过程。
这些备用的数据文本称为后备副本或后援副本。
转储故障发生点转储 运行事务 ↓
正常运行 ─┼───────┼─────────────
Ta Tb Tf
重装后备副本 重新运行事务恢复 ─┼───────┴ ----------- - →
三、转储方法
1.静态转储与动态转储
2.海量转储与增量转储
3.转储方法小结
1.静态转储
在系统中无运行事务时进行转储
转储开始时数据库处于一致性状态
转储期间不允许对数据库的任何存取、修改活动
优点,实现简单
缺点,降低了数据库的可用性
转储必须等用户事务结束
新的事务必须等转储结束利用静态转储副本进行恢复故障发生点静态 转储 运行事务 ↓
正常运行 ─┼───────┼─────────────
Ta Tb Tf
重装后备副本恢复 ─┼─────── ┥
动态转储
转储操作与用户事务并发进行
转储期间允许对数据库进行存取或修改
优点
不用等待正在运行的用户事务结束
不会影响新事务的运行
动态转储的缺点
不能保证副本中的数据正确有效动态转储
利用动态转储得到的副本进行故障恢复
需要把动态转储期间各事务对数据库的修改活动登记下来,建立日志文件
后备副本加上日志文件才能把数据库恢复到某一时刻的正确状态利用动态转储副本进行恢复运行事务 故障发生点动态 转储 运行事务 ↓
正常运行 ─┼───────┼─────────────
Ta Tb Tf
重装后备副本 利用日志文件恢复恢复 ━━━━━━╋ ━ ━ ━ ┥
利用动态转储副本进行恢复
Ta Tb Tf
动态 转储 运行事务 故障发生点正常运行 ─┼───────┼─────────────
登记日志文件 登记新日志文件
─────────┼─────────────
转储日志文件重装后备副本,然后利用转储的日志文件恢复恢复到一 ━━━━━━┥
致性状态
2.海量转储与增量转储
海量转储,每次转储全部数据库
增量转储,只转储上次转储后更新过的数据
海量转储与增量转储比较
从恢复角度看,使用海量转储得到的后备副本进行恢复往往更方便
但如果数据库很大,事务处理又十分频繁,
则增量转储方式更实用更有效
3.转储方法小结
转储方法分类转储状态动态转储 静态转储转储方式海量转储 动态海量转储 静态海量转储增量转储 动态增量转储 静态增量转储转储策略
应定期进行数据转储,制作后备副本。
但转储又是十分耗费时间和资源的,不能频繁进行。
DBA应该根据数据库使用情况确定适当的转储周期和转储方法。
例:
每天晚上进行动态增量转储
每周进行一次动态海量转储
每月进行一次静态海量转储
7.4 恢复的实现技术
7.4.1 数据转储
7.4.2 登记日志文件
7.4.2 登记日志文件一、日志文件的内容二、日志文件的用途三、登记日志文件的原则一、日志文件的内容
1,什么是日志文件日志文件 (log)是用来记录事务对数据库的更新操作的文件
2,日志文件的格式以记录为单位的日志文件以数据块为单位的日志文件日志文件的内容(续)
3,日志文件内容
各个事务的开始标记 (BEGIN TRANSACTION)
各个事务的结束标记 (COMMIT或 ROLLBACK)
各个事务的所有更新操作
与 事务有关的内部更新操作日志文件中的一个日志记录 (log record)
4,基于记录的日志文件每条日志记录的内容
事务标识
操作类型(插入、删除或修改)
操作对象(记录 ID,Block NO.)
更新前数据的旧值(对插入操作而言,此项为空值)
更新后数据的新值(对删除操作而言,此项为空值)
5,基于数据块的日志文件每条日志记录的内容
事务标识(标明是那个事务)
操作对象(记录 ID,Block NO.)
更新前数据所在的整个数据块的值(对插入操作而言,此项为空值)
更新后整个数据块的值(对删除操作而言,
此项为空值)
二、日志文件的用途
1.用途
进行事务故障恢复
进行系统故障恢复
协助后备副本进行介质故障恢复日志文件的用途(续)
2.与静态转储后备副本配合进行介质故障恢复
静态转储的数据已是一致性的数据
如果静态转储完成后,仍能定期转储日志文件,
则在出现介质故障重装数据副本后,可以利用这些日志文件副本对已完成的事务进行重做处理
这样不必重新运行那些已完成的事务程序就可把数据库恢复到故障前某一时刻的正确状态日志文件的用途(续)
故障发生点静态转储 运行事务 ↓
正常运行 ─┼──────┼──────────┼──
Ta Tb Tf
登记日志文件
└─────────── ┴ ──
重装后备副本 利用日志文件恢复事务 继续运行介质故障恢复 ─────────┴ ----- ─ ------- ┴──────
登记日志文件
└──────
日志文件的用途(续)
3,介质故障恢复,LOG FILE + 动态转储后备副本
动态转储数据库:同时转储同一时点的日志文件
后备副本与该日志文件结合起来才能将数据库恢复到一致性状态。
利用这些日志文件副本进一步恢复事务,避免重新运行事务程序。
三、登记日志文件的原则
为保证数据库是可恢复的,登记日志文件时必须遵循两条原则
登记的次序严格按并行事务执行的时间次序
必须先写日志文件,后写数据库
写日志文件操作:把表示这个修改的日志记录写到日志文件
写数据库操作:把对数据的修改写到数据库中登记日志文件的原则(续)
为什么要先写日志文件
写数据库和写日志文件是两个不同的操作
在这两个操作之间可能发生故障
如果先写了数据库修改,而在日志文件中没有登记下这个修改,则以后就无法恢复这个修改了
如果先写日志,但没有修改数据库,按日志文件恢复时只不过是多执行一次不必要的 UNDO操作,并不会影响数据库的正确性第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.5 恢复策略
7.5.1 事务故障的恢复
7.5.2 系统故障的恢复
7.5.3 介质故障的恢复
7.5.1 事务故障的恢复
事务故障:事务在运行至正常终止点前被中止
恢复方法
由恢复子系统应利用日志文件撤消( UNDO)
此事务已对数据库进行的修改
事务故障的恢复由系统自动完成,不需要用户干预事务故障的恢复步骤
1,反向扫描文件日志(即从最后向前扫描日志文件),
查找该事务的更新操作。
2,对该事务的更新操作执行逆操作。即将日志记录中
,更新前的值,( Befor Image,BI)写入数据库。
插入操作,,更新前的值,为空,则相当于做删除操作
删除操作,,更新后的值,为空,则相当于做插入操作
若是修改操作,则用 BI 代替 AI( After Image)
事务故障的恢复步骤
3,继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。
4,如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。
7.5.2 系统故障的恢复
系统故障造成数据库不一致状态的原因
一些未完成事务对数据库的更新已写入数据库
一些已提交事务对数据库的更新还留在缓冲区没来得及写入数据库
恢复方法
1,Undo 故障发生时未完成的事务
2,Redo 已完成的事务
系统故障的恢复由系统在 重新启动时 自动完成,
不需要用户干预系统故障的恢复 步骤
1.正向扫描日志文件(即从头扫描日志文件)
Redo队列,在故障发生前已经提交的事务
T1,T3,T8…,.
Undo队列,故障发生时尚未完成的事务
T2,T4,T5,T6,T7,T9 …,..
系统故障的恢复步骤
2,对 Undo队列事务进行 UNDO处理反向扫描日志文件,对每个 UNDO事务的更新操作执行逆操作
T2,T4,T5,T6,T7,T9 ……
3,对 Redo队列事务进行 REDO处理正向扫描日志文件,对每个 REDO事务重新执行登记的操作
T1,T3,T8…,.
7.5.3 介质故障的恢复
1,重装数据库,
使数据库恢复到一致性状态
2,重做已完成的事务
7.5.3 介质故障的恢复
恢复步骤
1,装入最新的后备数据库副本,使数据库恢复到最近一次转储时的一致性状态。
对于静态转储的数据库副本,装入后数据库即处于一致性状态
对于动态转储的数据库副本,还须同时装入转储时刻的日志文件副本,利用与恢复系统故障相同的方法(即 REDO+UNDO),才能将数据库恢复到一致性状态。
利用静态转储副本将数据库恢复到一致性状态故障发生点静态 转储 运行事务 ↓
正常运行 ─┼───────┼─────────────
Ta Tb Tf
登记日志文件
└─────────────
重装后备副本恢复 ━━━━━━┥
利用动态转储副本将数据库恢复到一致性状态
Ta Tb Tf
动态 转储 运行事务 故障发生点正常运行 ─┼───────┼─────────────
登记日志文件 登记新日志文件
─────────┼─────────────
转储日志文件重装后备副本,然后利用转储的日志文件恢复恢复到一 ━━━━━━┥
致性状态介质故障的恢复(续)
2,装入有关的日志文件副本,重做已完成的事务。
首先扫描日志文件,找出故障发生时已提交的事务的标识,将其记入重做队列。
然后正向扫描日志文件,对重做队列中的所有事务进行重做处理。即将日志记录中,更新后的值,写入数据库。
介质故障的恢复(续)
介质故障的恢复需要 DBA介入
DBA的工作
重装最近转储的数据库副本和有关的各日志文件副本
执行系统提供的恢复命令
具体的恢复操作仍由 DBMS完成第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.6 具有检查点的恢复技术一、问题的提出二、检查点技术三、利用检查点的恢复策略一、问题的提出
两个问题
搜索整个日志将耗费大量的时间
REDO处理:重新执行,浪费了大量时间解决方案
具有检查点( checkpoint)的恢复技术
在日志文件中增加检查点记录
( checkpoint)
增加重新开始文件
恢复子系统在登录日志文件期间动态地维护日志二、检查点技术
检查点记录的内容
1,建立检查点时刻所有正在执行的事务清单
2,这些事务最近一个日志记录的地址
重新开始文件的内容
记录各个检查点记录在日志文件中的地址在检查点 维护日志文件
1,将当前 日志 缓冲区中的所有日志记录写入磁盘的日志文件上。
2,在日志文件中写入一个检查点记录。
3,将当前 数据 缓冲区的所有数据记录写入磁盘的数据库中。
4,把检查点记录在日志文件中的地址写入一个重新开始文件。
建立检查点
定期
按照预定的一个时间间隔
不定期
按照某种规则,如日志文件已写满一半建立一个检查点三、利用检查点的恢复策略
当事务 T在一个检查点之前提交
T对数据库所做的修改已写入数据库
在进行恢复处理时,没有必要对事务 T执行 REDO操作利用检查点的恢复策略(续)
Tc (检查点 ) Tf(系统故障 )
REDO
UNDO
UNDO
REDO
T2
T3
T4
T5
不要 REDOT1
利用检查点的 恢复步骤
1,从重新开始文件中找到最后一个检查点记录在日志文件中的地址
2 由该地址在日志文件中找到最后一个检查点记录利用检查点的恢复策略(续)
2.由该检查点记录得到检查点建立时刻所有正在执行的事务清单 ACTIVE-LIST
建立两个事务队列
UNDO-LIST
REDO-LIST
把 ACTIVE-LIST暂时放入 UNDO-LIST队列,
REDO队列暂为空。
利用检查点的恢复策略(续)
3.从检查点开始正向扫描日志文件,直到日志文件结束
如有新开始的事务 Ti,把 Ti暂时放入 UNDO-
LIST队列
如有提交的事务 Tj,把 Tj从 UNDO-LIST队列移到 REDO-LIST队列
4.对 UNDO-LIST中的每个事务执行 UNDO操作,对
REDO-LIST中的每个事务执行 REDO操作第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.7 数据库镜像
介质故障是对系统影响最为严重的一种故障,
严重影响数据库的可用性
介质故障恢复比较费时
为预防介质故障,DBA必须周期性地转储数据库
提高数据库可用性的解决方案
数据库镜像( Mirror)
数据库镜像(续)
数据库镜像
DBMS自动把整个数据库或其中的关键数据复制到另一个磁盘上
DBMS自动保证镜像数据与主数据的一致性
(图 7.5a)
数据库镜像的用途
出现介质故障时
DBMS自动利用镜像磁盘数据进行数据库的恢复,不需要关闭系统和重装数据库副本
(图 7.5b)
没有出现故障时
可用于并发操作 (图 7.5a)
一个用户对数据加排他锁修改数据
其他用户可以读镜像数据库上的数据数据库镜像(续)
第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.8 Oracle的恢复技术
1,转储
2,登记日志文件
7.8 Oracle的恢复技术:转储
转储后备副本的方法
文件拷贝
EXPORT实用程序
用 SQL命令 SPOOL
自己编程实现重装后备副本的方法
文件拷贝
IMPORT实用程序
SQL*LOADER实用程序
自己编程实现
2,登记日志文件
ORACLE V.5:以数据块为单位
ORACLE V.7,REDO日志 + 回滚段
ORACLE V.5的恢复技术
日志文件以数据块为单位,恢复操作不是基于操作,而是基于数据块
将更新前的旧值与更新后的新值分别放在两个不同的日志文件中
记录数据库更新前旧值的日志文件称为数据库前像文件( Before Image,简称
BI文件)
记录数据库更新后新值的日志文件称为数据库的后像文件( After Image,简称
AI文件)
OracleV.5 的恢复技术(续)
BI文件是必须的,AI文件是任选的
没有 AI文件:只能执行 UNDO处理,不能执行 REDO处理
Oracle v.7的恢复技术(续)
REDO日志文件:更新数据的前像和后像
回滚段 (Rollback Segment):记录尚未完成的更新事务的更新数据的前像
事务故障恢复
根据回滚段中的数据,撤消该事务的操作
Oracle V.7 的恢复技术(续)
系统故障恢复
首先扫描 REDO日志文件,重做所有操作,
并对更新操作建立回滚段数据。当遇到提交记录,取消相应回滚段中数据。
再根据回滚段中的数据,撤消未正常提交的事务的操作(图 7.6)
优点:只需要扫描日志文件一遍
Oracle的恢复技术(续)
图 7.6 Oracle的恢复过程
(a) 发生故障,事务非正常终止
Ta Tf
T1 T3
T2 T44
时间
Oracle的恢复技术(续)
(b) 利用 REDO文件,重做所有操作时间
T1 T3
T2 T44
Oracle的恢复技术(续)
(c) 利用回滚段撤消未提交的事务数据库恢复到一致性状态时间
T1
T2
Oracle的恢复技术(续)
ORACLE V.7的恢复技术 (续 )
介质故障恢复
重装数据库后备副本文件,恢复到转储时的数据库一致性状态
利用在此之后转储的 REDO日志文件副本将数据库恢复到最近点 (类似于系统故障恢复 )
第七章 数据库恢复技术
7.1 事务的基本概念
7.2 数据库恢复概述
7.3 故障的种类
7.4 恢复的实现技术
7.5 恢复策略
7.6 具有检查点的恢复技术
7.7 数据库镜像
7.8 Oracle的恢复技术
7.9 小结
7.9 小结
如果数据库只包含成功事务提交的结果,就说数据库处于一致性状态。保证数据一致性是对数据库的最基本的要求。
事务是数据库的逻辑工作单位
DBMS保证系统中一切事务的原子性、一致性、隔离性和持续性小结(续)
DBMS必须对事务故障、系统故障和介质故障进行恢复
恢复中最经常使用的技术:数据库转储和登记日志文件
恢复的基本原理:利用存储在后备副本、日志文件和数据库镜像中的冗余数据来重建数据库小结(续)
常用恢复技术
事务故障的恢复
UNDO
系统故障的恢复
UNDO + REDO
介质故障的恢复
重装备份并恢复到一致性状态 + REDO
小结(续)
提高恢复效率的技术
检查点技术
可以提高系统故障的恢复效率
可以在一定程度上提高利用动态转储备份进行介质故障恢复的效率
镜像技术
镜像 技术可以改善介质故障的恢复效率下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第八章 并发控制第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结并发控制概述多事务执行方式
(1)事务串行执行
每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行
不能充分利用系统资源,发挥数据库共享资源的特点并发控制(续)
(2)交叉并发方式 ( interleaved concurrency)
事务的并行执行是这些并行事务的并行操作轮流交叉运行
是单处理机系统中的并发方式,能够减少处理机的空闲时间,提高系统的效率并发控制(续)
(3)同时并发方式 ( simultaneous concurrency)
多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,
实现多个事务真正的并行运行
最理想的并发方式,但受制于硬件环境
更复杂的 并发方式机制事务并发执行带来的问题
可能会存取和存储不正确的数据,破坏事务的隔离性和数据库的一致性
DBMS必须提供并发控制机制
并发控制机制是衡量一个 DBMS性能的重要标志之一
8.1 并发控制概述
并发控制机制的任务
对并发操作进行正确调度
保证事务的隔离性
保证数据库的一致性
T1的修改被 T2覆盖了!
读 A=16
A← A-3
写回 A=13
① 读 A=16
②
③ A← A-1
写回 A=15
④
事务 T2事务 T1
数据不一致实例:飞机订票系统并发操作带来的数据不一致性
丢失修改 ( lost update)
不可重复读 ( non-repeatable read)
读,脏,数据 ( dirty read)
1,丢失修改丢失修改是指事务 1与事务 2从数据库中读入同一数据并修改事务 2的提交结果破坏了事务 1提交的结果,
导致事务 1的修改被丢失 。
2,不可重复读不可重复读是指事务 1读取数据后,事务 2
执行更新操作,使事务 1无法再现前一次读取结果 。
三类 不可重复读事务 1读取某一数据后:
1。 事务 2对其做了修改,当事务 1再次读该数据时,得到与前一次不同的值。
2,事务 2删除了其中部分记录,当事务 1再次读取数据时,发现某些记录神密地消失了。
3,事务 2插入了一些记录,当事务 1再次按相同条件读取数据时,发现多了一些记录。
后两种不可重复读有时也称为 幻影 现象( phantom
row)
3,读,脏,数据事务 1修改某一数据,并将其写回磁盘事务 2读取同一数据后事务 1由于某种原因被撤消,这时事务 1已修改过的数据恢复原值事务 2读到的数据就与数据库中的数据不一致,
是不正确的数据,又称为,脏,数据 。
图 8.1 三种数据不一致性
T1 T2
① 读 A=16
②
③ A← A-1
写回
A=15
④
读 A=16
A← A-1
写回 A=15
(a) 丢失修改图 8.1 三种数据不一致性 (续 )
读 B=100
B← B*2
写回 B=200
① 读 A=50
读 B=100
求和 =150
②
③ 读 A=50
读 B=200
求和 =250
(验算不对 )
T2T1
(b) 不可重复读图 8.1 三种数据不一致性 (续 )
读 C=200
① 读 C=100
C← C*2
写回 C
②
③ ROLLBACK
C恢复为 100
T2T1
(c) 读“脏”数据第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.2 封锁一、什么是封锁二、基本封锁类型三、基本锁的相容矩阵一、什么是封锁
封锁就是事务 T在对某个数据对象(例如表、
记录等)操作之前,先向系统发出请求,对其加锁
加锁后事务 T就对该数据对象有了一定的控制,
在事务 T释放它的锁之前,其它的事务不能更新此数据对象。
封锁是实现并发控制的一个非常重要的技术
8.2 封锁一、什么是封锁二、基本封锁类型三、基本锁的相容矩阵二、基本封锁类型
DBMS通常提供了多种类型的封锁。一个事务对某个数据对象加锁后究竟拥有什么样的控制是由封锁的类型决定的。
基本封锁类型
排它锁( eXclusive lock,简记为 X锁)
共享锁( Share lock,简记为 S锁)
排它锁
排它锁又称为写锁
若事务 T对数据对象 A加上 X锁,则只允许
T读取和修改 A,其它任何事务都不能再对 A加任何类型的锁,直到 T释放 A上的锁共享锁
共享锁又称为读锁
若事务 T对数据对象 A加上 S锁,则其它事务只能再对 A加 S锁,而不能加 X锁,直到
T释放 A上的 S锁
8.2 封锁一、什么是封锁二、基本封锁类型三、基本锁的相容矩阵三、锁的相容矩阵
Y=Yes,相容的请求
N=No,不相容的请求
T1
T2
X S -
X N N Y
S N Y Y
- Y Y Y
第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.3 封锁协议
在运用 X锁和 S锁对数据对象加锁时,需要约定一些规则:封锁协议( Locking Protocol)
何时申请 X锁或 S锁
持锁时间、何时释放
不同的封锁协议,在 不同的程度上 为并发操作的正确调度提供一定的保证
常用的封锁协议:三级封锁协议
1级封锁协议
事务 T在修改数据 R之前必须先对其加 X锁,
直到事务结束才释放
正常结束 ( COMMIT)
非正常结束 ( ROLLBACK)
1级封锁协议可防止丢失修改
在 1级封锁协议中,如果是读数据,不需要加锁的,所以它不能保证可重复读和不读,脏,
数据。
1级封锁协议
T1 T2
① Xlock A
获得
② 读 A=16
③ A← A-1
写回 A=15
Commit
Unlock A
④
⑤
Xlock A
等待等待等待等待获得 Xlock A
读 A=15
A← A-1
写回 A=14
Commit
Unlock A
没有丢失修改
1级封锁协议读 A=15
① Xlock A
获得
② 读 A=16
A← A-1
写回 A=15
③
④ Rollback
Unlock A
T2T1
读“脏”数据
1级封锁协议
Xlock B
获得读 B=100
B← B*2
写回 B=200
Commit
Unlock B
① 读 A=50
读 B=100
求和 =150
②
③ 读 A=50
读 B=200
求和 =250
(验算不对 )
T2T1
不可重复读
2级封锁协议
1级封锁协议 +事务 T在读取数据 R前必须 先加 S锁,读完后即可释放 S锁
2级封锁协议可以防止丢失修改和读,脏,
数据。
在 2级封锁协议中,由于读完数据后即可释放 S锁,所以它不能保证可重复读 。
2级封锁协议不可重复读
① Sclock A
获得读 A=50
Unlock A
② Sclock B
获得读 B=100
Unlock B
③ 求和 =150
Xlock B
等待等待获得 Xlock B
读 B=100
B← B*2
写回 B=200
Commit
Unlock B
T2T1
④ Sclock A
获得读 A=50
Unlock A
Sclock B
获得读 B=200
Unlock B
求和 =250
(验算不对 )
T2T1 (续 )
3级封锁协议
1级封锁协议 + 事务 T在读取数据 R之前必须先对其加 S锁,直到 事务结束才释放
3级封锁协议可防止丢失修改、读脏数据和不可重复读。
3级封锁协议T
1 T2
① Slock A
读 A=50
Slock B
读 B=100
求和 =150
②
③ 读 A=50
读 B=100
求和 =150
Commit
Unlock A
Unlock B
④
⑤
Xlock B
等待等待等待等待等待等待等待等待获得 Xlock B
读 B=100
B← B*2
写回 B=200
Commit
Unlock B
可重复读
3级封锁协议
T1 T2
① Xlock C
读 C= 100
C← C*2
写回 C=200
②
③ ROLLBACK
(C恢复为 100)
Unlock C
④
⑤
Slock C
等待等待等待等待获得 Slock C
读 C=100
Commit C
Unlock C
不读“脏”数据
4.封锁协议小结
三级协议的主要区别
什么操作需要申请封锁
何时释放锁(即持锁时间)
封锁协议小结 (续 )
第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.4 活锁和死锁
封锁技术可以有效地解决并行操作的一致性问题,但也带来一些新的问题
死锁
活锁
8.4.1 活锁如何避免活锁采用先来先服务的策略:
当多个事务请求封锁同一数据对象时
按请求封锁的先后次序对这些事务排队
该数据对象上的锁一旦释放,首先批准申请队列中第一个事务获得锁 。
8.4.2 死锁
T1 T2
Xlock R1
.
.
.
Xlock R2
等待等待等待
.
.
.
Xlock R2
.
.
Xlock R1
等待等待
.
解决死锁的方法两类方法
1,预防死锁
2,死锁的诊断与解除
1,死锁的预防
产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据对象加锁,从而出现死等待。
预防死锁的发生就是要破坏产生死锁的条件死锁的预防 (续)
预防死锁的方法
一次封锁法
顺序封锁法
( 1)一次封锁法
要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行
一次封锁法存在的问题:降低并发度
扩大封锁范围
将以后要用到的全部数据加锁,势必扩大了封锁的范围,从而降低了系统的并发度一次封锁法(续)
难于事先精确确定封锁对象
数据库中数据是不断变化的,原来不要求封锁的数据,在执行过程中可能会变成封锁对象,所以很难事先精确地确定每个事务所要封锁的数据对象
解决方法:将事务在执行过程中可能要封锁的数据对象全部加锁,这就进一步降低了并发度 。
( 2)顺序封锁法
顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
顺序封锁法存在的问题
维护成本高
数据库系统中可封锁的数据对象极其众多,
并且随数据的插入、删除等操作而不断地变化,要维护这样极多而且变化的资源的封锁顺序非常困难,成本很高顺序封锁法(续)
难于实现
事务的封锁请求可以随着事务的执行而动态地决定,很难事先确定每一个事务要封锁哪些对象,因此也就很难按规定的顺序去施加封锁。
例:规定数据对象的封锁顺序为 A,B,C,D,E。事务 T3起初要求封锁数据对象 B,C,E,但当它封锁了 B,C后,才发现还需要封锁 A,这样就破坏了封锁顺序,
死锁的预防(续)
结论
在操作系统中广为采用的预防死锁的策略并不很适合数据库的特点
DBMS在解决死锁的问题上更普遍采用的是诊断并解除死锁的方法
2,死锁的诊断与解除
允许死锁发生
解除死锁
由 DBMS的并发控制子系统定期检测系统中是否存在死锁
一旦检测到死锁,就要设法解除检测死锁,超时法
如果一个事务的等待时间超过了规定的时限,就认为发生了死锁
优点:实现简单
缺点
有可能误判死锁
时限若设置得太长,死锁发生后不能及时发现等待图法
用事务等待图动态反映所有事务的等待情况
事务等待图是一个有向图 G=(T,U)
T为结点的集合,每个结点表示正运行的事务
U为边的集合,每条边表示事务等待的情况
若 T1等待 T2,则 T1,T2之间划一条有向边,从 T1指向 T2
并发控制子系统周期性地(比如每隔 1 min)检测事务等待图,如果发现图中存在回路,则表示系统中出现了死锁。
死锁的诊断与解除(续)
解除死锁
选择一个处理死锁代价最小的事务,
将其撤消,释放此事务持有的所有的锁,使其它事务能继续运行下去。
第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.5 并发调度的可串行性一、什么样的并发操作调度是正确的二、如何保证并发操作的调度是正确的
8.5 并发调度的可串行性一、什么样的并发操作调度是正确的二、如何保证并发操作的调度是正确的一、什么样的并发操作调度是正确的
计算机系统对并行事务中并行操作的调度是的随机的,而不同的调度可能会产生不同的结果。
将所有事务串行起来的调度策略一定是正确的调度策略。
如果一个事务运行过程中没有其他事务在同时运行,也就是说它没有受到其他事务的干扰,那么就可以认为该事务的运行结果是正常的或者预想的什么样的并发操作调度是正确的(续)
以不同的顺序串行执行事务也有可能会产生不同的结果,但由于不会将数据库置于不一致状态,所以都可以认为是正确的。
几个事务的并行执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同。
这种并行调度策略称为可串行化( Serializable)
的调度。
什么样的并发操作调度是正确的(续)
可串行性是并行事务正确性的唯一准则例:现在有两个事务,分别包含下列操作:
事务 1:读 B; A=B+1;写回 A;
事务 2:读 A; B=A+1;写回 B;
假设 A的初值为 2,B的初值为 2。
什么样的并发操作调度是正确的(续)
对这两个事务的不同调度策略
串行执行
串行调度策略 1
串行调度策略 2
交错执行
不可串行化的调度
可串行化的调度
(a) 串行调度策略,正确的调度
Slock B
Y=B=2
Unlock B
Xlock A
A=Y+1
写回 A(=3)
Unlock A
Slock A
X=A=3
Unlock A
Xlock B
B=X+1
写回 B(=4)
Unlock B
T1 T2
(b) 串行调度策略,正确的调度
Slock B
Y=B=3
Unlock B
Xlock A
A=Y+1
写回 A(=4)
Unlock A
SlockA
X=A=2
Unlock A
Xlock B
B=X+1
写回 B(=3)
Unlock B
T1 T2
(c) 不可串行化的调度
Slock B
Y=B=2
Unlock B
Xlock A
A=Y+1
写回 A(=3)
Unlock A
Slock A
X=A=2
Unlock A
Xlock B
B=X+1
写回 B(=3)
Unlock B
T1 T2
(c) 不可串行化的调度 (续 )
由于其执行结果与 (a),(b)的结果都不同,
所以是错误的调度。
(d) 可串行化的调度
Slock B
Y=B=2
Unlock B
Xlock A
A=Y+1
写回 A(=3)
Unlock A
Slock A
等待等待等待
X=A=3
Unlock A
Xlock B
B=X+1
写回 B(=4)
Unlock B
T1 T2
(d) 可串行化的调度(续)
由于其执行结果与串行调度( a)的执行结果相同,所以是正确的调度。
8.5 并发调度的可串行性一、什么样的并发操作调度是正确的二、如何保证并发操作的调度是正确的二、如何保证并发操作的调度是正确的
为了保证并行操作的正确性,DBMS的并行控制机制必须提供一定的手段来保证调度是可串行化的。
从理论上讲,在某一事务执行时禁止其他事务执行的调度策略一定是可串行化的调度,这也是最简单的调度策略,但这种方法实际上是不可行的,因为它使用户不能充分共享数据库资源。
如何保证并发操作的调度是正确的(续)
保证并发操作调度正确性的方法
封锁方法,两段锁 ( Two-Phase Locking,
简称 2PL) 协议
时标方法
乐观方法第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.6 两段锁协议
两段锁协议的内容
1,在对任何数据进行读、写操作之前,
事务首先要获得对该数据的封锁
2,在释放一个封锁之后,事务不再获得任何其他封锁。
两段锁协议(续)
―两段,锁的含义
事务分为两个阶段
第一阶段是获得封锁,也称为扩展阶段;
第二阶段是释放封锁,也称为收缩阶段。
两段锁协议(续)
例:
事务 1的封锁序列:
Slock A,.,Slock B,.,Xlock C,.,Unlock B,.,Unlock A,.,
Unlock C;
事务 2的封锁序列:
Slock A,.,Unlock A,.,Slock B,.,Xlock C,.,Unlock C,.,
Unlock B;
事务 1遵守两段锁协议,而事务 2不遵守两段协议。
两段锁协议(续)
并行执行的所有事务均遵守两段锁协议,则对这些事务的所有并行调度策略都是可串行化的。
所有遵守两段锁协议的事务,其并行执行的结果一定是正确的
事务遵守两段锁协议是可串行化调度的 充分条件,
而不是必要条件
可串行化的调度中,不一定所有事务都必须符合两段锁协议。
两段锁协议(续)
T1
Slock B
读 B=2
Y=B
Xlock A
A=Y+1
写回 A=3
Unlock B
Unlock A
T2
Slock A
等待等待等待等待等待
Slock A
读 A=3
Y=A
Xlock B
B=Y+1
写回 B=4
Unlock B
Unlock A
T1
Slock B
读 B=2
Y=B
Unlock B
Xlock A
A=Y+1
写回 A=3
Unlock A
T2
Slock A
等待等待等待等待
Slock A
读 A=3
X=A
Unlock A
Xlock B
B=X+1
写回 B=4
Unlock B
(a) 遵守两段锁协议 (b) 不遵守两段锁协议
T1
Slock B
读 B=2
Y=B
Unlock B
Xlock A
A=Y+1
写回 A=3
Unlock A
T2
Slock A
读 A=2
X=A
Unlock A
Xlock B
等待
Xlock B
B=X+1
写回 B=3
Unlock B
(c) 不遵守两段锁协议两段锁协议(续)
两段锁协议与防止死锁的一次封锁法
一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,
因此一次封锁法遵守两段锁协议
但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁两段锁协议(续)
图 8.7 遵守两段锁协议的事务发生死锁
T1
Slock B
读 B=2
Xlock A
等待等待
T2
Slock A
读 A=2
Xlock A
等待两段锁协议(续)
两段锁协议与三级封锁协议
两类不同目的的协议
两段锁协议
保证并发调度的正确性
三级封锁协议
在不同程度上保证数据一致性
遵守第三级封锁协议必然遵守两段协议第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.7 封锁的粒度
8.7.1 封锁粒度
8.7.2 多粒度封锁
8.7.3 意向锁
8.7.1 封锁粒度一、什么是封锁粒度二、选择封锁粒度的原则一、什么是封锁粒度
X锁和 S锁都是加在某一个数据对象上的
封锁的对象,逻辑单元,物理单元例:在关系数据库中,封锁对象:
逻辑单元,属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库等
物理单元:页(数据页或索引页)、物理记录等什么是封锁粒度(续)
封锁对象可以很大也可以很小例,对整个数据库加锁对某个属性值加锁
封锁对象的大小称为封锁的粒度 (Granularity)
多粒度封锁 (multiple granularity locking)
在一个系统中同时支持多种封锁粒度供不同的事务选择
8.7.1 封锁粒度一、什么是封锁粒度二、选择封锁粒度的原则二、选择封锁粒度的原则
封锁的粒度越 大,小,
系统被封锁的对象 少,多,
并发度 小,高,
系统开销 小,大,
选择封锁粒度:
考虑封锁机构和并发度两个因素对系统开销与并发度进行权衡选择封锁粒度的原则(续)
需要处理多个关系的大量元组的用户事务:以数据库为封锁单位;
需要处理大量元组的用户事务:以关系为封锁单元;
只处理少量元组的用户事务:以元组为封锁单位
8.7 封锁的粒度
8.7.1 封锁粒度
8.7.2 多粒度封锁
8.7.3 意向锁
8.7.2 多粒度封锁
多粒度树
以树形结构来表示多级封锁粒度
根结点是整个数据库,表示最大的数据粒度
叶结点表示最小的数据粒度多粒度封锁(续)
例:三级粒度树。根结点为数据库,数据库的子结点为关系,关系的子结点为元组。
数据库关系 Rn关系 R1
元组 元组元组 元组
……
…………
多粒度 封锁协议
允许多粒度树中的每个结点被独立地加锁
对一个结点加锁意味着这个结点的所有后裔结点也被加以同样类型的锁
在多粒度封锁中一个数据对象可能以两种方式封锁,显式封锁和隐式封锁显式封锁和隐式封锁
显式封锁,直接加到数据对象上的封锁
隐式封锁,由于其上级结点加锁而使该数据对象加上了锁
显式封锁和隐式封锁的效果是一样的对某个数据对象加锁时系统检查的内容
该数据对象
有无显式封锁与之冲突
所有上级结点
检查本事务的显式封锁是否与该数据对象上的隐式封锁冲突,(由上级结点封锁造成的)
所有下级结点
看上面的显式封锁是否与本事务的隐式封锁 (将加到下级结点的封锁) 冲突。
8.7 封锁的粒度
8.7.1 封锁粒度
8.7.2 多粒度封锁
8.7.3 意向锁
8.7.3 意向锁
引进意向锁( intention lock)目的
提高对某个数据对象加锁时系统的检查效率什么是意向锁
对任一结点加基本锁,必须 先 对它的上层结点 加意向锁
如果对一个结点加意向锁,则说明该结点的 下层结点 正在被加锁意向锁 (续 )
例:对任一元组 r 加锁,先关系 R加意向锁
事务 T要对关系 R加 X锁,系统只要检查根结点数据库和关系 R是否已加了不相容的锁,
不需要搜索和检查 R中的每一个元组是否加了 X
锁常用意向锁
意向共享锁 (Intent Share Lock,简称 IS锁 )
意向排它锁 (Intent Exclusive Lock,简称 IX
锁 )
共享意向排它锁 (Share Intent Exclusive
Lock,简称 SIX锁 )
意向锁(续)
IS锁
如果对一个数据对象加 IS锁,表示它的后裔结点拟 ( 意向 ) 加 S锁 。
例:要对某个元组加 S锁,则要首先对关系和数据库加 IS锁意向锁(续)
IX锁
如果对一个数据对象加 IX锁,表示它的后裔结点拟(意向)加 X锁。
例:要对某个元组加 X锁,则要首先对关系和数据库加 IX锁。
意向锁(续)
SIX锁
如果对一个数据对象加 SIX锁,表示对它加 S
锁,再加 IX锁,即 SIX = S + IX。
例:对某个表加 SIX锁,则表示该事务要读整个表(所以要对该表加 S锁),同时会更新个别元组(所以要对该表加 IX锁)。
意向锁(续)
意向锁的相容矩阵
T1 T2 S X IS IX SIX -
S Y N Y N N Y
X N N N N N Y
IS Y N Y Y Y Y
IX N N Y Y N Y
SIX N N Y N N Y
- Y Y Y Y Y Y
意向锁(续)
锁的强度
锁的强度是指它对其他锁的排斥程度
一个事务在申请封锁时以强锁代替弱锁是安全的,反之则不然
SIX
X
S IX
-
IS
意向锁(续)
具有意向锁的多粒度封锁方法
申请封锁时应该按自上而下的次序进行;
释放封锁时则应该按自下而上的次序进行例:事务 T要对一个数据对象加锁,必须先对它的上层结点加意向锁第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.8 Oracle的并发控制
Oracle采用封锁技术保证并发操作的可串行性
Oracle锁的种类
字典锁
数据锁(亦称 DML锁)
1,字典锁
ORACLE DBMS内部用于对字典表的封锁
由 DBMS在必要的时候自动加锁和释放锁,用户无权控制
字典锁类型
语法分析锁
DDL锁
2,数据锁
数据锁类型
共享锁( S锁)
排它锁( X锁)
行级共享锁( RS锁)
行级排它锁( RX锁)
共享行级排它锁( SRX锁)
其中 RS锁,RX锁,SRX锁实际上就是 IS锁,IX锁、
SIX锁。
数据锁(续)
封锁粒度
行级
表级数据锁(续)
数据锁的相容矩阵
T1 T2 S X RS RX SRX -
S Y N Y N N Y Y=Yes,表示相容的请求
X N N N N N Y
RS Y N Y Y Y Y N=No,表示不相容的请求
RX N N Y Y N Y
SRX N N Y N N Y
- Y Y Y Y Y Y
数据锁(续)
数据封锁的两种方式
数据封锁由系统控制,对用户是透明的
允许用户用 LOCK TABLE语句显式对封锁对象加锁数据锁(续)
ORACLE数据锁的特点
缺省情况下,读数据不加锁
ORACLE通过回滚段( Rollback Segment)
来保证用户不读,脏,数据和可重复读。
优点:提高数据的并发度数据锁(续)
死锁
采用死锁诊断与解除法
周期性诊断系统中有无死锁
存在死锁,则撤消执行更新操作次数最少的事务第八章 并发控制
8.1 并发控制概述
8.2 封锁
8.3 封锁协议
8.4 活锁和死锁
8.5 并发调度的可串行性
8.6 两段锁协议
8.7 封锁的粒度
8.8 Oracle的并发控制
8.9 小结
8.9 小结
数据共享与数据一致性是一对矛盾
数据库的价值在很大程度上取决于它所能提供的数据共享度。
数据共享在很大程度上取决于系统允许对数据并发操作的程度。
数据并发程度又取决于数据库中的并发控制机制
另一方面,数据的一致性也取决于并发控制的程度。
施加的并发控制愈多,数据的一致性往往愈好。
小结(续)
数据库的并发控制以事务为单位
数据库的并发控制通常使用封锁机制
两类最常用的封锁
不同级别的封锁协议提供不同的数据一致性保证,提供不同的数据共享度。
三级封锁协议小结(续)
并发控制机制调度并发事务操作是否正确的判别准则是可串行性
并发操作的正确性则通常由两段锁协议来保证。
两段锁协议是可串行化调度的充分条件,但不是必要条件小结(续)
对数据对象施加封锁,带来问题
活锁,先来先服务
死锁:
预防方法
一次封锁法
顺序封锁法
死锁的诊断与解除
超时法
等待图法小结(续)
不同的数据库管理系统提供的封锁类型、封锁协议、达到的系统一致性级别不尽相同。但是其依据的基本原理和技术是共同的。
下课了。。。
休息一会儿。。。
数据库系统概论
An Introduction to Database System
第九章 数据库安全性第九章 数据库安全性
问题的提出
数据库的一大特点是数据可以共享
但数据共享必然带来数据库的安全性问题
数据库系统中的数据共享不能是无条件的共享例:军事秘密,国家机密,新产品实验数据,
市场需求分析,市场营销策略,销售计划,
客户档案,医疗档案,银行储蓄数据数据库安全性(续)
数据库中数据的共享是在 DBMS统一的严格的控制之下的共享,即只允许有合法使用权限的用户访问允许他存取的数据
数据库系统的安全保护措施是否有效是数据库系统主要的性能指标之一数据库安全性(续)
什么是数据库的安全性
数据库的安全性是指保护数据库,防止因用户非法使用数据库造成数据泄露,更改或破坏 。
什么是数据的保密
数据保密是指用户合法地访问到机密数据后能否对这些数据保密 。
通过制订法律道德准则和政策法规来保证 。
第九章 数据库安全性
9.1 计算机安全性概论
9.2 数据库安全性控制
9.3 统计数据库安全性
9.4 Oracle数据库的安全性措施
9.5 小结第九章 数据库安全性
9.1 计算机安全性概论
9.2 数据库安全性控制
9.3 统计数据库安全性
9.4 Oracle数据库的安全性措施
9.5 小结
9.1 计算机安全性概论
9.1.1 计算机系统的三类安全性问题
9.1.2 可信计算机系统评测标准
9.1 计算机安全性概论
9.1.1 计算机系统的三类安全性问题
9.1.2 可信计算机系统评测标准
9.1.1 计算机系统的三类安全性问题
什么是计算机系统安全性
为计算机系统建立和采取的各种安全保护措施,以保护计算机系统中的 硬件,软件 及 数据,防止其因偶然或恶意的原因使系统遭到破坏,数据遭到更改或泄露等。
计算机系统的三类安全性问题(续)
计算机安全涉及问题
计算机系统本身的技术问题
计算机安全理论与策略
计算机安全技术
管理问题
安全管理
安全评价
安全产品计算机系统的三类安全性问题(续)
计算机安全涉及问题 (续 )
法学
计算机安全法律
犯罪学
计算机犯罪与侦察
安全监察
心理学计算机系统的三类安全性问题(续)
三类计算机系统安全性问题
技术安全类
管理安全类
政策法律类计算机系统的三类安全性问题(续)
技术安全
指计算机系统中采用具有一定 安全性的 硬件、软件 来实现 对计算机系统及其所存数据的安全保护,当计算机系统受到无意或恶意的攻击时仍能保证系统正常运行,保证系统内的数据不增加、不丢失、不泄露。
计算机系统的三类安全性问题(续)
管理安全
软硬件意外故障、场地的意外事故、
管理不善导致的计算机设备和数据介质的物理破坏、丢失等安全问题计算机系统的三类安全性问题(续)
政策法律类
政府部门建立的有关计算机犯罪、数据安全保密的法律道德准则和政策法规、法令
9.1 计算机安全性概论
9.1.1 计算机系统的三类安全性问题
9.1.2 可信计算机系统评测标准
9.1.2 可信计算机系统评测标准
为降低进而消除对系统的安全攻击,各国引用或制定了一系列安全标准
TCSEC (桔皮书 )
TDI (紫皮书 )
可信计算机系统评测标准(续)
1985年美国国防部( DoD)正式颁布,DoD可信计算机系统评估标准,(简称 TCSEC或 DoD85)
TCSEC又称桔皮书
TCSEC标准的目的
提供一种标准,使 用户 可以对其计算机系统内敏感信息安全操作的 可信程度 做 评估 。
给计算机行业的 制造商 提供 一种可循的 指导规则,
使其产品能够更好地满足敏感应用的安全需求。
可信计算机系统评测标准(续)
1991年 4月美国 NCSC(国家计算机安全中心)
颁布了,可信计算机系统评估标准关于可信数据库系统的解释,( Trusted Database
Interpretation 简称 TDI)
TDI又称紫皮书。它将 TCSEC扩展到数据库管理系统。
TDI中定义了数据库管理系统的设计与实现中需满足和用以进行安全性级别评估的标准。
可信计算机系统评测标准(续)
TDI/TCSEC标准的基本内容
TDI与 TCSEC一样,从 四个方面 来描述安全性级别划分的指标
安全策略
责任
保证
文档可信计算机系统评测标准(续)
R1 安全策略( Security Policy)
R1.1 自主存取控制 ( Discretionary Access
Control,简记为
DAC)
R1.2 客体重用( Object Reuse)
R1.3 标记( Labels)
R1.4 强制存取控制( Mandatory Access
Control,简记为
MAC)
可信计算机系统评测标准(续)
R2 责任( Accountability)
R2.1 标识与鉴别( Identification &
Authentication)
R2.2 审计( Audit)
R3 保证( Assurance)
R3.1 操作保证( Operational Assurance)
R3.2 生命周期保证( Life Cycle Assurance)
可信计算机系统评测标准(续)
R4 文档( Documentation)
R4.1 安全特性用户指南( Security Features
User's Guide)
R4.2 可信设施手册( Trusted Facility
Manual)
R4.3 测试文档( Test Documentation)
R4.4 设计文档( Design Documentation)
可信计算机系统评测标准(续)
TCSEC/TDI安全级别划分安 全 级 别 定 义
A1 验证设计 ( Verified Design)
B3 安全域 ( Security Domains)
B2 结构化保护 ( Structural Protection)
B1 标记安全保护 ( Labeled Security Protection)
C2 受控的存取保护 ( Controlled Access Protection)
C1 自主安全保护 ( Discretionary Security Protection)
D 最小保护 ( Minimal Protection)
可信计算机系统评测标准(续)
四组 (division)七个等级
D
C( C1,C2)
B( B1,B2,B3)
A( A1)
按系统可靠或可信程度逐渐增高
各安全级别之间具有一种偏序向下兼容的关系,
即较高安全性级别提供的安全保护要包含较低级别的所有保护要求,同时提供更多或更完善的保护能力。
可信计算机系统评测标准(续)
D级
将一切不符合更高标准的系统均归于 D组
典型例子,DOS是安全标准为 D的操作系统
DOS在安全性方面几乎没有什么专门的机制来保障可信计算机系统评测标准(续)
C1级
非常初级的自主安全保护
能够实现对用户和数据的分离,进行自主存取控制( DAC),保护或限制用户权限的传播。
可信计算机系统评测标准(续)
C2级
安全产品的最低档次
提供受控的存取保护,将 C1级的 DAC进一步细化,以个人身份注册负责,并实施审计和资源隔离
达到 C2级的产品在其名称中往往不突出,安全,(Security)这一特色可信计算机系统评测标准(续)
典型例子
操作系统
Microsoft的 Windows NT 3.5,
数字设备公司的 Open VMS VAX 6.0和 6.1
数据库
Oracle公司的 Oracle 7
Sybase公司的 SQL Server 11.0.6
可信计算机系统评测标准(续)
B1级
标记安全保护。,安全,(Security)或,可信的,(Trusted)产品。
对系统的数据加以标记,对标记的主体和客体实施强制存取控制( MAC)、审计等安全机制可信计算机系统评测标准(续)
典型例子
操作系统
数字设备公司的 SEVMS VAX Version 6.0
惠普公司的 HP-UX BLS release 9.0.9+
数据库
Oracle公司的 Trusted Oracle 7
Sybase公司的 Secure SQL Server version 11.0.6
Informix公司的 Incorporated INFORMIX-
OnLine / Secure 5.0
可信计算机系统评测标准(续)
B2级
结构化保护
建立形式化的安全策略模型并对系统内的所有主体和客体实施 DAC和 MAC。
经过认证的 B2级以上的安全系统非常稀少可信计算机系统评测标准(续)
典型例子
操作系统
只有 Trusted Information Systems公司的
Trusted XENIX一种产品
标准的网络产品
只有 Cryptek Secure Communications公司的 LLC
VSLAN一种产品
数据库
没有符合 B2标准的产品可信计算机系统评测标准(续)
B3级
安全域。
该级的 TCB必须满足访问监控器的要求,审计跟踪能力更强,并提供系统恢复过程。
可信计算机系统评测标准(续)
A1级
验证设计,即提供 B3级保护的同时给出系统的形式化设计说明和验证以确信各安全保护真正实现。
可信计算机系统评测标准(续)
B2以上的系统
还处于理论研究阶段
应用多限于一些特殊的部门如军队等
美国正在大力发展安全产品,试图将目前仅限于少数领域应用的 B2安全级别下放到商业应用中来,并逐步成为新的商业标准。
可信计算机系统评测标准(续)
可信计算机系统评测标准(续)
表示该级不提供对该指标的支持;
表示该级新增的对该指标的支持;
表示该级对该指标的支持与相邻低一级的等级一样;
表示该级对该指标的支持较下一级有所增加或改动 。
第九章 数据库安全性
9.1 计算机安全性概论
9.2 数据库安全性控制
9.3 统计数据库安全性
9.4 Oracle数据库的安全性措施
9.5 小结
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.1 数据库安全性控制概述
非法使用数据库的情况
用户编写一段合法的程序绕过 DBMS及其授权机制,通过操作系统直接存取、修改或备份数据库中的数据;
直接或编写应用程序执行非授权操作;
数据库安全性控制概述(续)
通过多次合法查询数据库从中推导出一些保密数据例:某数据库应用系统禁止查询单个人的工资,但允许查任意一组人的平均工资。用户甲想了解张三的工资,于是他:
首先查询包括张三在内的一组人的平均工资然后查用自己替换张三后这组人的平均工资从而推导出张三的工资
破坏安全性的行为可能是无意的,故意的,
恶意的。
计算机系统中的安全模型应用 DBMS OS DB
低高安全性控制层次方法,用户标识和鉴定存取控制审计视图操作系统安全保护 密码存储数据库安全性控制概述(续)
数据库安全性控制的常用方法
用户标识和鉴定
存取控制
视图
审计
密码存储
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.2 用户标识与鉴别
用户标识与鉴别( Identification &
Authentication)
系统提供的最外层安全保护措施
9.2.2 用户标识与鉴别基本方法
系统提供一定的方式让用户标识自己的名字或身份;
系统内部记录着所有合法用户的标识;
每次用户要求进入系统时,由系统核对用户提供的身份标识;
通过鉴定后才提供机器使用权。
用户标识和鉴定可以重复多次用户标识自己的名字或身份
用户名 /口令
简单易行,容易被人窃取
每个用户预先约定好一个 计算过程 或者 函数
系统提供一个随机数
用户根据自己预先约定的计算过程或者函数进行计算
系统根据用户计算结果是否正确鉴定用户身份
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.3 存取控制
存取控制机制的功能
存取控制机制的组成
定义存取权限
检查存取权限用户权限定义和合法权检查机制一起组成了 DBMS的安全子系统存取控制(续)
定义存取权限
在数据库系统中,为了保证用户只能访问他有权存取的数据,必须预先对每个用户定义存取权限。
检查存取权限
对于通过鉴定获得上机权的用户(即合法用户),系统根据他的存取权限定义对他的各种操作请求进行控制,确保他只执行合法操作。
存取控制(续)
常用存取控制方法
自主存取控制 ( Discretionary Access
Control,简称 DAC)
C2级
灵活
强制存取控制 ( Mandatory Access Control,
简称 MAC)
B1级
严格自主存取控制方法
同一用户对于不同的数据对象有不同的存取权限
不同的用户对同一对象也有不同的权限
用户还可将其拥有的存取权限转授给其他用户强制存取控制方法
每一个数据对象被标以一定的密级
每一个用户也被授予某一个级别的许可证
对于任意一个对象,只有具有合法许可证的用户才可以存取
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.4 自主存取控制方法
定义存取权限
存取权限
存取权限由两个要素组成
数据对象
操作类型自主存取控制方法(续)
关系系统中的存取权限
类型数据对象 操作类型模 式 模 式 建立、修改、删除、检索外模式 建立、修改、删除、检索内模式 建立、删除、检索数 据 表 查找、插入、修改、删除属性列 查找、插入、修改、删除自主存取控制方法(续)
关系系统中的存取权限 (续 )
定义方法
GRANT/REVOKE
自主存取控制方法(续)
关系系统中的存取权限 (续 )
例,一张授权表用户名 数据对象名 允许的操作类型王 平 关系 Student SELECT
张明霞 关系 Student UPDATE
张明霞 关系 Course ALL
张明霞 SC,Grade UPDATE
张明霞 SC,Sno SELECT
张明霞 SC,Cno SELECT
自主存取控制方法(续)
检查存取权限
对于获得上机权后又进一步发出存取数据库操作的用户
DBMS查找数据字典,根据其存取权限对操作的合法性进行检查
若用户的操作请求超出了定义的权限,系统将拒绝执行此操作自主存取控制方法(续)
授权粒度
授权粒度是指可以定义的数据对象的范围
它是衡量授权机制是否灵活的一个重要指标。
授权定义中数据对象的粒度越细,即可以定义的数据对象的范围越小,授权子系统就越灵活。
自主存取控制方法(续)
关系数据库中授权的数据对象粒度
数据库
表
属性列
行
能否提供与数据值有关的授权反映了授权子系统精巧程度自主存取控制方法(续)
实现与数据值有关的授权
利用存取谓词
存取谓词可以很复杂
可以引用系统变量,如终端设备号,系统时钟等,实现与时间地点有关的存取权限,
这样用户只能在某段时间内,某台终端上存取有关数据例:规定,教师只能在每年 1月份和 7月份星期一至星期五上午 8点到下午 5点处理学生成绩数据,。
自主存取控制方法(续)
例:扩充后的授权表用户名 数据对象名 允许的操作类型 存取谓词王平 关系 Student SELECT Sdept=?CS?
张明霞 关系 Student UPDATE Sname=?张明霞?
张明霞 关系 Course ALL 空自主存取控制方法(续)
自主存取控制小结
定义存取权限
用户
检查存取权限
DBMS
自主存取控制方法(续)
自主存取控制小结 (续 )
授权粒度
数据对象粒度:数据库、表、属性列、行
数据值粒度:存取谓词
授权粒度越细,授权子系统就越灵活,能够提供的安全性就越完善。但另一方面,因数据字典变大变复杂,系统定义与检查权限的开销也会相应地增大。
自主存取控制方法(续)
自主存取控制小结 (续 )
优点
能够通过授权机制有效地控制其他用户对敏感数据的存取自主存取控制方法(续)
自主存取控制小结 (续 )
缺点
可能存在数据的,无意泄露,
原因:这种机制仅仅通过对数据的存取权限来进行安全控制,而数据本身并无安全性标记。
解决:对系统控制下的所有主客体实施强制存取控制策略
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.5 强制存取控制方法
什么是强制存取控制
强制存取控制 (MAC)是指系统为保证更高程度的安全性,按照 TDI/TCSEC标准中安全策略的要求,所采取的强制存取检查手段。
MAC不是用户能直接感知或进行控制的。
MAC适用于对数据有严格而固定密级分类的部门
军事部门
政府部门强制存取控制方法(续)
主体与客体
在 MAC中,DBMS所管理的全部实体被分为主体和客体两大类
主体 是系统中的活动实体
DBMS所管理的实际用户
代表用户的各进程
客体 是系统中的被动实体,是受主体操纵的
文件
基表
索引
视图强制存取控制方法(续)
敏感度标记
对于主体和客体,DBMS为它们每个实例
(值)指派一个敏感度标记( Label)
敏感度标记分成若干级别
绝密( Top Secret)
机密( Secret)
可信( Confidential)
公开( Public)
强制存取控制方法(续)
主体的敏感度标记称为许可证级别
( Clearance Level)
客体的敏感度标记称为密级( Classification
Level)
MAC机制就是通过对比主体的 Label和客体的 Label,最终确定主体是否能够存取客体强制存取控制方法(续)
强制存取控制规则
当某一用户(或某一主体)以标记 label注册入系统时,系统要求他对任何客体的存取必须遵循下面两条规则:
( 1)仅当主体的许可证级别 大于或等于 客体的密级时,该主体才能 读 取相应的客体;
( 2)仅当主体的许可证级别 等于 客体的密级时,该主体才能 写 相应的客体。
强制存取控制方法(续)
修正规则:
主体的许可证级别 <=客体的密级主体能写客体
用户可为写入的数据对象赋予高于自己的许可证级别的密级
一旦数据被写入,该用户自己也不能再读该数据对象了。
强制存取控制方法(续)
规则的共同点禁止了拥有高许可证级别的主体更新低密级的数据对象强制存取控制方法(续)
强制存取控制的特点
MAC是对数据本身进行密级标记
无论数据如何复制,标记与数据是一个不可分的整体
只有符合密级标记要求的用户才可以操纵数据
从而提供了更高级别的安全性
MAC与 DAC
DAC与 MAC共同构成 DBMS的安全机制
原因:较高安全性级别提供的安全保护要包含较低级别的所有保护
先进行 DAC检查,通过 DAC检查的数据对象再由系统进行 MAC检查,只有通过
MAC检查的数据对象方可存取。
强制存取控制方法(续)
DAC + MAC安全检查示意图
SQL语法分析 & 语义检查
DAC 检 查安全检查
MAC 检 查继 续
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.6 视图机制
视图机制把要保密的数据对无权存取这些数据的用户隐藏起来,
视图机制更主要的功能在于提供数据独立性,
其安全保护功能太不精细,往往远不能达到应用系统的要求。
视图机制(续)
视图机制与授权机制配合使用,
首先用视图机制屏蔽掉一部分保密数据
视图上面再进一步定义存取权限
间接实现了支持存取谓词的用户权限定义视图机制(续)
例:王平只能检索计算机系学生的信息先建立计算机系学生的视图 CS_Student
CREATE VIEW CS_Student
AS
SELECT
FROM Student
WHERE Sdept='CS';
视图机制(续)
在视图上进一步定义存取权限
GRANT SELECT
ON CS_Student
TO 王平 ;
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.7 审计
什么是审计
启用一个专用的审计日志( Audit Log)
将用户对数据库的所有操作记录在上面
DBA可以利用审计日志中的追踪信息找出非法存取数据的人
C2以上安全级别的 DBMS必须具有审计功能审计(续)
审计功能的可选性
审计很费时间和空间
DBA可以根据应用对安全性的要求,
灵活地打开或关闭审计功能。
审计(续)
强制性机制,
用户识别和鉴定、存取控制、视图
预防监测手段,
审计技术
9.2 数据库安全性控制
9.2.1 数据库安全性控制概述
9.2.2 用户标识与鉴别
9.2.3 存取控制
9.2.4 自主存取控制方法
9.2.5 强制存取控制方法
9.2.6 视图机制
9.2.7 审计
9.2.8 数据加密
9.2.8 数据加密
数据加密
防止数据库中数据在存储和传输中失密的有效手段
加密的基本思想
根据一定的算法将原始数据(术语为明文,
Plain text)变换为不可直接识别的格式(术语为密文,Cipher text)
不知道解密算法的人无法获知数据的内容数据加密(续)
加密方法
替换方法
使用密钥( Encryption Key)将明文中的每一个字符转换为密文中的一个字符
置换方法
将明文的字符按不同的顺序重新排列
混合 方法美国 1977年制定的官方加密标准:数据加密标准
( Data Encryption Standard,简称 DES)
数据加密(续)
DBMS中的数据加密
有些数据库产品提供了数据加密例行程序
有些数据库产品本身未提供加密程序,但提供了接口数据加密(续)
数据加密功能通常也作为可选特征,允许用户自由选择
数据加密与解密是比较费时的操作
数据加密与解密程序会占用大量系统资源
应该只对高度机密的数据加密第九章 数据库安全性
9.1 计算机安全性概论
9.2 数据库安全性控制
9.3 统计数据库安全性
9.4 Oracle数据库的安全性措施
9.5 小结
9.3 统计数据库安全性
统计数据库的特点
允许用户查询 聚集 类型的信息(例如合计、
平均值等)
不允许查询 单个 记录信息例:允许查询,程序员的平均工资是多少?,
不允许查询,程序员张勇的工资?,
统计数据库安全性(续)
统计数据库中特殊的安全性问题
隐蔽的信息通道
从合法的查询中推导出不合法的信息统计数据库安全性(续)
例 1:下面两个查询都是合法的:
1.本公司共有多少女高级程序员?
2.本公司女高级程序员的工资总额是多少?
如果第一个查询的结果是,1‖,
那么第二个查询的结果显然就是这个程序员的工资数。
规则 1:任何查询至少要涉及 N(N足够大 )个以上的记录统计数据库安全性(续)
例 2:用户 A发出下面两个合法查询:
1.用户 A和其他 N个程序员的工资总额是多少?
2.用户 B和其他 N个程序员的工资总额是多少?
若第一个查询的结果是 X,第二个查询的结果是 Y,
由于用户 A知道自己的工资是 Z,
那么他可以计算出用户 B的工资 =Y-(X-Z)。
原因:两个查询之间有很多重复的数据项规则 2:任意两个查询的相交数据项不能超过 M个统计数据库安全性(续)
可以证明,在上述两条规定下,如果想获知用户 B
的工资额
A至少需要进行 1+(N-2)/M次查询规则 3:任一用户的查询次数不能超过 1+(N-2)/M
如果两个用户合作查询就可以使这一规定失效统计数据库安全性(续)
数据库安全机制的设计目标:
试图破坏安全的人所花费的代价 >>
得到的利益第九章 数据库安全性
9.1 计算机安全性概论
9.2 数据库安全性控制
9.3 统计数据库安全性
9.4 Oracle数据库的安全性措施
9.5 小结
9.4 Oracle数据库的安全性措施
ORACLE的安全措施,
用户标识和鉴定
授权和检查机制
审计技术
用户通过触发器灵活定义自己的安全性措施一,ORACLE的用户标识和鉴定
ORACLE允许用户重复标识三次
如果三次仍未通过,系统自动退出二,ORACLE的授权与检查机制
ORACLE授权和检查机制的特色
ORACLE的权限包括 系统权限 和 数据库对象的权限
采用非集中式的授权机制
每个用户授予与回收自己创建的数据库对象的权限
DBA负责授予与回收系统权限,也可以授予与回收所有数据库对象的权限
允许重复授权,即可将某一权限多次授予同一用户,
系统不会出错
允许无效回收,即用户不具有某权限,但回收此权限的操作仍是成功的。
1.系统权限
80多种系统权限
创建会话
创建表
创建视图
创建用户系统权限(续)
DBA在创建一个用户时需要将其中的一些权限授予该用户
角色
一组系统权限的集合,目的在于简化权限管理。
ORACLE允许 DBA定义角色
ORACLE提供的预定义角色
CONNECT
RESOURCE
DBA
系统权限(续)
CONNECT角色
允许用户登录数据库并执行数据查询和操纵
ALTER TABLE
CREATE VIEW / INDEX
DROP TABLE / VIEW / INDEX
GRANT,REVOKE
INSERT,UPDATE,DELETE
SELETE
AUDIT / NOAUDIT
系统权限(续)
RESOURCE角色
允许用户建表,即执行 CREATE TABLE操作
由于创建表的用户将拥有该表,因此他具有对该表的任何权限系统权限(续)
DBA角色
允许用户执行授权命令,建表,对任何表的数据进行操纵。
DBA角色涵盖了前两种角色,此外还可以执行一些管理操作。
DBA角色拥有最高级别的权限。
系统权限(续)
例,DBA建立一用户 U12后,欲将 ALTER TABLE、
CREATE VIEW,CREATE INDEX,DROP TABLE、
DROP VIEW,DROP INDEX,GRANT,REVOKE、
INSERT,SELETE,UPDATE,DELETE,AUDIT、
NOAUDIT等系统权限授予 U12
GRANT CONNECT TO U12;
这样就可以省略十几条 GRANT语句
ORACLE的授权与检查机制(续)
ORACLE的权限
系统权限
数据库对象的权限
2.数据库对象的权限
ORACLE可以授权的数据库对象
基本表
视图
序列
同义词
存储过程
函数数据库对象的权限(续)
基本表的安全性级别
表级
行级
列级数据库对象的权限(续)
表级权限
ALTER,修改表定义
DELETE:删除表记录
INDEX,在表上建索引
INSERT,向表中插入数据记录
SELECT:查找表中记录
UPDATE:修改表中的数据
ALL,上述所有权限数据库对象的权限(续)
表级授权使用 GRANT/ REVOKE语句例,GRANT SELECT ON SC TO U12;
数据库对象的权限(续)
行级安全性
ORACLE行级安全性由视图间接实现数据库对象的权限(续)
例:用户 U1只允许用户 U12查看自己创建的
Student表中有关信息系学生的信息,则首先创建视图信息系学生视图 S_IS:
CREATE VIEW S_IS
AS
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student
WHERE Sdept='IS';
然后将关于该视图的 SELECT权限授予 U12用户:
GRANT SELECT ON S_IS TO U12;
数据库对象的权限(续)
列级安全性
实现方法
由视图间接实现
直接在基本表上定义数据库对象的权限(续)
列级安全性 (续 )
借助视图实现列级安全性
CREATE VIEW S_V
AS
SELECT Sno.Sname
FROM Student;
GRANT SELECT ON S_V TO U12;
数据库对象的权限(续)
列级安全性 (续 )
直接在基本表上定义列级安全性例,GRANT UPDATE(Sno,Cno) ON SC TO U12;
数据库对象的权限(续)
上一级对象的权限制约下一级对象的权限例:当一个用户拥有了对某个表的 UPDATE权限相当于在表的所有列了都拥有
UPDATE 权限数据库对象的权限(续)
ORACLE对数据库对象的权限采用分散控制方式
允许具有 WITH GRANT OPTION的用户把相应权限或其子集传递授予其他用户
ORACLE不允许循环授权
U1 ───→ U2 ───→ U3 ───→ U4
↑ │
└─────── × ─────────┘
ORACLE的授权与检查机制(续)
ORACLE的权限 信息记录在数据字典中
当用户进行数据库操作时
ORACLE首先根据数据字典中的权限信息,
检查操作的合法性
9.4 Oracle数据库的安全性措施
ORACLE的安全措施,
用户标识和鉴定
授权和检查机制
审计技术
用户通过触发器灵活定义自己的安全性措施三,ORACLE的审计技术
审计分类
用户级审计
系统级审计三,ORACLE的审计技术
用户级审计
由用户设置
用户针对自己创建的数据库表或视图进行审计
审计内容
所有用户对这些表或视图的一切 成功 和/或 不成功的访问要求
所有用户对这些表或视图的各类 SQL操作
ORACLE的审计技术 (续 )
系统级审计
DBA设置
审计对象和内容
成功或失败的登录要求
GRANT和 REVOKE操作
其他数据库级权限下的操作
ORACLE的 审计设置可以自由设置
AUDIT:设置审计功能例,AUDIT ALTER,UPDATE ON SC;
NOAUDIT:取消审计功能例,NOAUDIT ALL ON SC;
对哪些表进行审计
对哪些操作进行审计
ORACLE的审计技术(续)
与审计功能有关的数据字典表
SYS.TABLES:审计设置
SYS.AUDIT_TRAIL:审计内容
SYSTEM.AUDIT_ACTION
ORACLE的审计技术(续)
SYS.TABLES:
TAB$NAME,表名;
TAB$OWNER:表的拥有者(即创建者)
TAB$AUDIT,审计设置
9.4 Oracle数据库的安全性措施
ORACLE的安全措施,
用户标识和鉴定
授权和检查机制
审计技术
用户通过触发器灵活定义自己的安全性措施四、用户定义的安全性措施
用数据库级 触发器 定义用户级安全性例:规定只能在工作时间内更新 Student表可以定义如下触发器:
用户定义的安全性措施(续)
CREATE OR REPLACE TRIGGER secure_student
BEFORE INSERT OR UPDATE OR DELETE ON Student
BEGIN
IF (TO_CHAR(sysdate,'DY') IN ('SAT','SUN'))
OR (TO_NUMBER(sysdate,'HH24') NOT
BETWEEN 8 AND 17)
THEN
RAISE_APPLICATION_ERROR(-20506,'You may
only change data during normal business
hours.')
END IF;
END;
用户定义的安全性措施(续)
触发器存放在数据字典中
用户每次对 Student表执行 INSERT、
UPDATE或 DELETE自动触发该触发器
系统检查当时的系统时间,如是周六或周日,
或者不是 8点至 17点,系统会拒绝执行用户的更新操作,并提示出错信息。
用户定义的安全性措施(续)
利用触发器进一步细化审计规则,使审计操作的粒度更细第九章 数据库安全性
9.1 计算机安全性概论
9.2 数据库安全性控制
9.3 统计数据库安全性
9.4 Oracle数据库的安全性措施
9.5 小结
9.5 小结
随着计算机网络的发展,数据的共享日益加强,
数据的安全保密越来越重要
DBMS是管理数据的核心,因而其自身必须具有一整套完整而有效的安全性机制。
小结(续)
,可信计算机系统评测标准,TCSEC/TDI是目前各国所引用或制定的一系列安全标准中最重要的一个。
CSEC/TDI从 安全策略,责任,保证 和 文档 四个方面描述了安全性级别的指标小结(续)
实现数据库系统安全性的技术和方法有多种,最重要的是 存取控制 技术和 审计 技术。
目前许多大型 DBMS 达到了 C2级,其安全版本达到了 B1
C2级 的 DBMS必须具有 自主存取控制 功能和 初步的审计 功能
B1级 的 DBMS必须具有 强制存取控制 和 增强的审计 功能
自主存取控制功能一般是通过 SQL 的 GRANT语句和 REVOKE语句来实现的下课了。。。
休息一会儿。。。
中国人民大学信息学院计算机系数据库系统概论
An Introduction to Database System
第十章 数据库完整性第十章 数据库完整性什么是数据库的完整性
数据的正确性和相容性
防止不合语义的数据进入数据库 。
例,学生的年龄必须是整数,取值范围为 14--29;
学生的性别只能是男或女;
学生的学号一定是唯一的;
学生所在的系必须是学校开设的系;
完整性:否真实地反映现实世界完整性控制机制
1.完整性约束条件定义机制
2.完整性检查机制
3.违约反应完整性约束条件定义
完整性约束条件:数据模型的组成部分约束数据库中数据的语义
DBMS应提供定义数据库完整性约束条件,
并把它们作为模式的一部分存入数据库中完整性控制机制
检查用户发出的操作请求是否违背了完整性约束条件违约反应
如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。
第十章 数据库完整性
10.1 完整性约束条件
10.2 完整性控制
10.3 Oracle的完整性
10.4 小结完整性约束条件(续)
完整性约束条件作用的对象
列:对属性的取值类型、范围、精度等的约束条件
元组:对元组中各个属性列间的联系的约束
关系:对若干元组间、关系集合上以及关系之间的联系的约束完整性约束条件(续)
静态
对静态对象的约束是反映数据库状态合理性的约束
动态
对动态对象的约束是反映数据库状态变迁的约束完整性约束条件分类六类完整性约束条件
静态列级约束
静态元组约束
静态关系约束
动态列级约束
动态元组约束
动态关系约束完整性约束条件(续)
对象状态动态列级约束 动态元组约束 动态关系约束动态 ④ ⑤ ⑥
静态列级约束 静态元组约束 静态关系约束静态 ① ② ③
列 元组 关系 对象粒度完整性约束条件(续)
1,静态列级约束
静态列级约束:对的取值域的说明
最常见、最简单、最容易实现的一类完整性约束完整性约束条件(续)
五类静态列级约束
1) 数据类型约束:数据的类型、长度、单位、精度等例:学生姓名的数据类型为字符型,长度为 8
2) 对数据格式的约束例:
学号:前两位表示入学年份,后四位为顺序编号日期,YY.MM.DD。
完整性约束条件(续)
3) 取值范围或取值集合的约束例:规定成绩的取值范围为 0-100
年龄的取值范围为 14-29
性别的取值集合为 [男,女 ]
4) 对空值的约束空值:未定义或未知的值空值:与零值和空格不同有的列允许空值,有的则不允许,如成绩可为空值
5) 其他约束例:关于列的排序说明,组合列等完整性约束条件(续)
2,静态元组约束规定元组的各个列之间的约束关系例:订货关系中发货量 <=订货量教师关系中教授的工资 >=700元静态元组约束只局限在元组上完整性约束条件(续)
3,静态关系约束关系的各个元组之间或若干关系之间存在的各种联系或约束常见静态关系约束:
1) 实体完整性约束
2) 参照完整性约束
3) 函数依赖约束
4) 统计约束函数依赖约束
关系字段间存在的函数依赖例:在学生-课程-教师关系
SJT(S,J,T) 的函数依赖:
( (S,J) → T,T→ J )
主码,(S,J)
统计约束
定义某个字段值一个关系多个元组的统计值之间的约束关系
例:职工平均工资的 2倍 <=部门经理的工资 <=
职工平均工资的 5倍职工平均工资值,统计值完整性约束条件(续)
4,动态列级约束动态列级约束是修改列定义或列值时应满足的约束条件完整性约束条件(续)
1) 修改列 定义 时的约束例:将原来允许空值的列改为不允许空值时,
该列目前已存在空值,则拒绝这种修改
2) 修改列值时的约束修改列值时新旧值之间要满足的约束条件例:职工工资调整 >= 原来工资年龄只能增长完整性约束条件(续)
5,动态元组约束修改元组值,各个字段之间要满足的约束条件例,职工工资调整不得低于其原来工资 + 工龄 *1.5
完整性约束条件(续)
6,动态关系约束关系变化前后状态:限制条件例:事务一致性、原子性等约束条件完整性约束条件小结粒 度 状态 列 级 元 组 级 关 系 级静 态 列定义
·类型
·格式
·值域
·空值元组值应满足的条件实体完整性约束参照完整性约束函数依赖约束统计约束动 态 改变列定义或列值 元组新旧值之间应满足的约束条件关系新旧状态间应满足的约束条件第十章 数据库完整性
10.1 完整性约束条件
10.2 完整性控制
10.3 Oracle的完整性
10.4 小结
10.2 完整性控制一,DBMS的完整性控制机制二、关系系统三类完整性的实现三、参照完整性的实现一,DBMS的完整性控制机制
1,定义功能一个完善的完整性控制机制应该允许用户定义各类完整性约束条件。
DBMS的完整性控制机制(续)
2,检查功能
立即执行的约束 (Immediate constraints)
语句执行完后立即检查是否违背完整性约束
延迟执行的约束 (Deferred constrainsts)
完整性检查延迟到整个事务执行结束后进行
DBMS的完整性控制机制(续)
例:银行数据库中,借贷总金额应平衡,的约束就应该是延迟执行的约束
从账号 A转一笔钱到账号 B为一个事务,从账号 A转出去钱后账就不平了,必须等转入账号 B后账才能重新平衡,这时才能进行完整性检查。
DBMS的完整性控制机制(续)
3,违约反应
拒绝该操作
其他处理方法
DBMS的完整性控制机制(续)
完整性规则五元组表示,
(D,O,A,C,P)
D( Data) 约束作用的 数据对象 ;
O( Operation) 触发完整性检查的 数据库操作当用户发出什么操作请求时需要检查该完整性规则是立即检查还是延迟检查;
A( Assertion) 数据对象必须满足的 断言 或 语义约束这是规则的主体;
C( Condition) 选择 A作用的数据对象值的 谓词 ;
P( Procedure) 违反完整性规则时触发的 过程 。
DBMS的完整性控制机制(续)
例 1:在,学号不能为空,的约束中
D 约束作用的对象为 Sno属性
O 插入或修改 Student 元组时
A Sno不能为空
C 无( A可作用于所有记录的 Sno属性)
P 拒绝执行该操作
DBMS的完整性控制机制(续)
例 2:在,教授工资不得低于 1000元,的约束中
D 约束作用的对象为工资 Sal属性
O 插入或修改职工元组时
A Sal不能小于 1000
C 职称 =′教授 ′
(A仅作用于职称 =?教授 ’ 的记录 )
P 拒绝执行该操作二、关系系统三类完整性的实现
关系数据库系统都提供了定义和检查实体完整性、参照完整性和用户定义的完整性的功能
违反实体完整性规则和用户定义的完整性规则的操作:
一般是拒绝执行
违反参照完整性的操作:
拒绝执行
接受这个操作,同时执行一些附加的操作,以保证数据库的状态正确三、参照完整性的实现例,职工-部门数据库包含职工表 EMP和部门表 DEPT
1 DEPT关系的主码为部门号 Deptno
2 EMP关系的主码为职工号 Empno,外码为部门号 Deptno
称 DEPT为被参照关系或目标关系,EMP为参照关系
RDBMS实现参照完整性时需要考虑以下 4方面:
1,外码是否可以接受空值的问题
外码是否能够取空值:依赖于应用环境的语义
实现参照完整性:
系统提供定义外码的机制定义外码列是否允许空值的机制
1,外码是否可以接受空值的问题例 1:在职工-部门数据库中,
EMP关系包含有外码 Deptno
某元组的这一列若为空值,表示这个职工尚未分配到任何具体的部门工作和应用环境的语义是相符
1,外码是否可以接受空值的问题例 2:学生-选课数据库
Student关系为被参照关系,其主码为 Sno。
SC为参照关系,外码为 Sno。
若 SC的 Sno为空值:表明尚不存在的某个学生,或者某个不知学号的学生,选修了某门课程,其成绩记录在 Grade中与学校的应用环境是不相符的,因此 SC的 Sno列不能取空值。
2.在被参照关系中删除元组时的问题出现违约操作的情形:
删除被参照关系的某个元组( student)
而参照关系有若干元组 (SC)的外码值与被删除的被参照关系的主码值相同
2.在被参照关系中删除元组时的问题
违约反应:可有三种策略
级联删除( CASCADES)
受限删除( RESTRICTED)
置空值删除( NULLIFIES)
这三种处理方法,哪一种是正确的,要依应用环境的语义来定
2.在被参照关系中删除元组时的问题
级联删除将参照关系中外码值与被参照关系中要删除元组主码值相对应的元组一起删除
受限删除当参照关系中没有任何元组的外码值与要删除的被参照关系的元组的主码值相对应时,系统才执行删除操作,否则拒绝此删除操作
2.在被参照关系中删除元组时的问题
置空值删除删除被参照关系的元组,并将参照关系中与被参照关系中被删除元组主码值相等的外码值置为空值。
2.在被参照关系中删除元组时的问题例:要删除 Student关系中 Sno=950001的元组,
而 SC关系中有 4个元组的 Sno都等于 950001。
级联删除:将 SC关系中所有 4个
Sno=950001的元组一起删除。如果参照关系同时又是另一个关系的被参照关系,则这种删除操作会继续级联下去
受限删除:系统将拒绝执行此删除操作。
2.在被参照关系中删除元组时的问题
置空值删除:将 SC关系中所有 Sno=950001
的元组的 Sno值置为空值。
在学生选课数据库中,显然第一种方法和第二种方法都是对的。第三种方法不符合应用环境语义。
3.在参照关系中插入元组时的问题
出现违约操作的情形
需要在参照关系中插入元组,而被参照关系不存在相应的元组
违约反应
受限插入
递归插入
3.在参照关系中插入元组时的问题
受限插入
仅当被参照关系中存在相应的元组,其主码值与参照关系插入元组的外码值相同时,系统才执行插入操作,否则拒绝此操作。
递归插入
首先向被参照关系中插入相应的元组,其主码值等于参照关系插入元组的外码值,然后向参照关系插入元组。
3.在参照关系中插入元组时的问题例:向 SC关系插入( 99001,1,90)元组,
而 Student关系中尚没有 Sno=99001的学生
受限插入:系统将拒绝向 SC关系插入
( 99001,1,90)元组
递归插入:系统将首先向 Student关系插入
Sno=99001的元组,然后向 SC关系插入
( 99001,1,90)元组。
4,修改被参照关系中主码的问题
两种策略
(1)不允许修改主码
(2)允许修改主码允许修改主码策略
违约操作
要 修改被参照关系 中某些元组的主码值,而参照关系中有些元组的外码值正好等于被参照关系要修改的主码值
要 修改参照关系 中某些元组的主码值,
而被参照关系中没有任何元组的外码值等于被参照关系修改后的主码值允许修改主码策略
违约反应 (1)
修改的关系是被参照关系:与删除类似
级联修改
受限修改
置空值修改允许修改主码策略
级联修改
修改被参照关系中主码值同时,用相同的方法修改参照关系中相应的外码值。
受限修改
拒绝此修改操作。只当参照关系中没有任何元组的外码值等于被参照关系中某个元组的主码值时,这个元组的主码值才能被修改。
置空值修改
修改被参照关系中主码值,同时将参照关系中相应的外码值置为空值。
允许修改主码策略例:将 Student关系中 Sno=950001的元组中
Sno值改为 960123。而 SC关系中有 4个元组的 Sno=950001
级联修改:将 SC关系中 4个 Sno=950001元组中的 Sno值也改为 960123。如果参照关系同时又是另一个关系的被参照关系,则这种修改操作会继续级联下去。
允许修改主码策略
受限修改:只有 SC中没有任何元组的
Sno=950001时,才能修改 Student表中
Sno=950001的元组的 Sno值改为 960123。
置空值修改:将 Student表中 Sno=950001的元组的 Sno值改为 960123。而将 S表中所有
Sno=950001的元组的 Sno值置为空值。
在学生选课数据库中只有第一种方法是正确的。
允许修改主码策略
违约反应 (2)
修改的关系是参照关系:与插入类似
受限插入
递归插入参照完整性的实现
RDBMS在实现参照完整性时,
需要向用户提供定义主码、外码的机制
向用户提供按照自己的应用要求选择处理依赖关系中对应的元组的方法第十章 数据库完整性
10.1 完整性约束条件
10.2 完整性控制
10.3 Oracle的完整性
10.4 小结
10.3 Oracle的完整性一,Oracle中的实体完整性二,Oracle中的参照完整性三,Oracle中用户定义的完整性一,ORACLE中的实体完整性
ORACLE在 CREATE TABLE语句中提供了
PRIMARY KEY子句,供用户在建表时指定关系的主码列。
在列级使用 PRIMARY KEY子句
在表级使用 PRIMARY KEY子句
ORACLE中的实体完整性(续)
例 1:在学生选课数据库中,要定义 Student表的 Sno属性为主码
CREATE TABLE Student
(Sno NUMBER(8),
Sname VARCHAR(20),
Sage NUMBER(20),
CONSTRAINT PK_SNO PRIMARY KEY (Sno));
或,
CREATE TABLE Student
(Sno NUMBER(8) PRIMARY KEY,
Sname VARCHAR(20),
Sage NUMBER(20));
ORACLE中的实体完整性(续)
例 2:要在 SC表中定义 (Sno,Cno)为主码
CREATE TABLE SC
(Sno NUMBER(8),
Cno NUMBER(2),
Grade NUMBER(2),
CONSTRAINT PK_SC PRIMARY KEY (Sno,Cno));
ORACLE中的实体完整性(续)
用户程序对主码列进行更新操作时,系统自动进行完整性检查
违约操作
使主属性值为空值的操作
使主码值在表中不唯一的操作
违约反应
系统拒绝此操作,从而保证了实体完整性二,ORACLE中的参照完整性定义参照完整性
FOREIGN KEY子句:定义外码列
REFERENCES子句:外码相应于哪个表的主码
ON DELETE CASCADE子语:
在删除被参照关系的元组时,同时删除参照关系中 外码值等于被参照关系的元组中主码值的元组
ORACLE中的参照完整性(续)
例 1:建立表 EMP表
CREATE TABLE EMP
(Empno NUMBER(4),
Ename VARCHAR(10),
Job VERCHAR2(9),
Mgr NUMBER(4),
Sal NUMBER(7,2),
Deptno NUMBER(2),
CONSTRAINT FK_DEPTNO
FOREIGN KEY (Deptno)
REFERENCES DEPT(Deptno));
ORACLE中的参照完整性(续)
或:
CREATE TABLE EMP
(Empno NUMBER(4),
Ename VARCHAR(10),
Job VERCHAR2(9),
Mgr NUMBER(4),
Sal NUMBER(7,2),
Deptno NUMBER(2) CONSTRAINT FK_DEPTNO
FOREIGN KEY REFERENCES DEPT(Deptno));
ORACLE中的参照完整性(续)
这时 EMP表中外码为 Deptno,它相应于 DEPT
表中的主码 Deptno。
当要修改 DEPT表中的 DEPTNO值时,先要检查
EMP表中有无元组的 Deptno值与之对应
若没有,系统接受这个修改操作
否则,系统拒绝此操作
ORACLE中的参照完整性(续)
当要删除 DEPT表中某个元组时,系统要检查
EMP表,若找到相应元组即将其随之删除。
当要插入 EMP表中某个元组时,系统要检查
DEPT表,先要检查 DEPT表中有无元组的
Deptno值与之对应
若没有,系统拒绝此插入操作
否则,系统接受此操作三,ORACLE中用户定义的完整性
ORACLE中定义用户完整性的两类方法
用 CREATE TABLE语句在建表时定义用户完整性约束
通过触发器来定义用户的完整性规则
ORACLE中用户定义的完整性(续)
1,用 CREATE TABLE语句在建表时定义用户完整性约束可定义三类完整性约束
列值非空( NOT NULL短语)
列值唯一( UNIQUE短语)
检查列值是否满足一个布尔表达式( CHECK
短语)
ORACLE中用户定义的完整性(续)
例 1:建立部门表 DEPT,要求部门名称 Dname列取值唯一,部门编号 Deptno列为主码
CREATE TABLE DEPT
(Deptno NUMBER,
Dname VARCHAR(9) CONSTRAINT U1 UNIQUE,
Loc VARCHAR(10),
CONSTRAINT PK_DEPT PRIMARY KEY (Deptno));
其中 CONSTRAINT U1 UNIQUE 表示约束名为 U1,
该约束要求 Dname列值唯一。
ORACLE中用户定义的完整性(续)
例 2,建立学生登记表 Student,要求学号在
900000至 999999之间,年龄 <29,性别只能是 ‘ 男 ’ 或 ‘ 女 ’,姓名非空
CREATE TABLE Student
(Sno NUMBER(5)
CONSTRAINT C1 CHECK
(Sno BETWEEN 10000 AND 99999),
Sname VARCHAR(20) CONSTRAINT C2 NOT NULL,
Sage NUMBER(3) CONSTRAINT C3 CHECK (Sage < 29),
Ssex VARCHAR(2)
CONSTRAINT C4 CHECK (Ssex IN ('男 ','女 '));
ORACLE中用户定义的完整性(续)
例 3,建立职工表 EMP,要求每个职工的应发工资不得超过 3000元。 应发工资实际上就是实发工资列 Sal与扣除项 Deduct之和。
CREATE TABLE EMP
(Eno NUMBER(4)
Ename VARCHAR(10),
Job VARCHAR(8),
Sal NUMBER(7,2),
Deduct NUMBER(7,2)
Deptno NUMBER(2),
CONSTRAINTS C1 CHECK (Sal + Deduct <=3000));
ORACLE中用户定义的完整性(续)
2,通过触发器来定义用户的完整性规则
定义其它的完整性约束时,需要用数据库触发器( Trigger)来实现。
数据库触发器:一类靠事务驱动的特殊过程
一旦由某个用户定义,任何用户对该数据的增、
删、改操作均由服务器自动激活相应的触发子,
在核心层进行集中的完整性控制
定义数据库触发器的语句
CREATE [OR REPLACE] TRIGGER
ORACLE中用户定义的完整性(续)
例 4,为教师表 Teacher定义完整性规则
,教授的工资不得低于 800元,如果低于 800元,
自动改为 800元,
ORACLE中用户定义的完整性(续)
CREATE TRIGGER UPDATE_SAL
BEFORE INSERT OR UPDATE OF Sal,Pos ON Teacher
FOR EACH ROW
WHEN (:new.Pos='教授 ')
BEGIN
IF,new.sal<800
THEN
:new.Sal:=800;
END IF;
END;
Oracle完整性小结
ORACLE提供定义完整性约束条件
CREATE TABLE语句
CREATE TRIGGER语句可以定义很复杂的完整性约束条件
ORACLE自动执行相应的完整性检查对于违反完整性约束条件的操作:
拒绝执行或者执行事先定义的操作第十章 数据库完整性
10.1 完整性约束条件
10.2 完整性控制
10.3 Oracle的完整性
10.4 小结
10.4 小结
数据库的完整性是为了保证数据库中存储的数据是正确的,所谓正确的是指符合现实世界语义的。
DBMS完整性实现的机制
完整性约束定义机制
完整性检查机制
违背完整性约束条件时 DBMS应采取的动作小结
完整性机制的实施会极大地影响系统性能
不同的数据库产品对完整性的支持策略和支持程度是不同的
许多数据库管理系统对完整性机制的支持比对安全性的支持要晚得多也弱得多
数据库厂商对完整性的支持越来越好,不仅在能保证实体完整性和参照完整性而且能在 DBMS核心定义、检查和保证用户定义的完整性约束条件下课了。。。
休息一会儿。。。