返回 1
数据库原理与应用
返回 2
参考书目
1,萨师煊, 王珊, 数据库系统概论 ( 第三版 ), 北京:高等教育出
版社, 2001
2,李昭原, 数据库原理与应用, 北京:科学出版社, 2000
3,张健沛, 数据库原理及应用系统开发, 北京:中国水利水电出版
社, 1999
4,王珊, 陈红, 数据库系统原理教程, 北京:清华大学出版社,
1999
5,( 美 ) Philip J,Pratt, Jose J,Adamski,陆洪毅, 杨文波, 程
华等译, 数据库管理系统基础, 北京:机械工业出版社, 1999
6,Abraham Silberschatz,Henry F,Korth,S,Sudarshan,杨冬
青, 唐世渭等译, 数据库系统概念, 北京:机械工业出版社,
2000
7,Hector Garcia-Molina,Jeffrey D,Ullman,Jennifer Widom,
杨冬青, 唐世渭, 徐其钧等译, 数据库系统实现, 北京:机械
工业出版社, 2001
8,章立民, SQL Server 2000中文版完全实战, 北京:中国铁道出
版社, 2001
返回 3
第 1章 数据库系统概述
返回 4
本章概要
?在本章中,首先介绍数据库中有关的主要概念,
然后回顾数据管理技术的三个发展阶段。
?要求了解数据库的三个发展阶段及各阶段的主
要特点,掌握数据库中的有关的基本概念、数
据库系统的组成及各部分的主要功能。
?重点掌握实体、属性定义和实体型之间的联系
类型及特点。
?了解三种数据模型的特点及区别,为后面各章
的学习打下基础。
?了解面向对象数据模型的基本特征。
返回 5
1.1 信息、数据与数据处理
1.1.1 数据与信息
? 在数据处理中, 我们最常用到的基本概念就是 数据 和
信息, 信息与数据有着不同的含义 。
1.1.1.1 信息 ( Information)
1,信息的定义
? 信息是关于现实世界事物的存在方式或运动状态的反
映的综合, 具体说是一种被加工为 特定形式的数据,
但这种数据形式对接收者来说是有意义的, 而且对当
前和将来的决策具有明显的或实际的价值 。
如, 2000年硕士研究生将扩招 30%”,对接受者有意义,
使接受者据此作出决策 。
返回 6
2,信息的特征
? 信息源于 物质 和 能量, 它不可能脱离物质而存在, 信息
的传递需要物质载体, 信息的获取和传递要消耗能量 。
?如信息可以通过报纸, 电台, 电视, 计算机网络进行传递 。
? 信息是 可以感知的, 人类对客观事物的感知, 可以通过
感觉器官, 也可以通过各种仪器仪表和传感器等, 不同
的信息源有不同的感知形式 。
?如报纸上刊登的信息通过视觉器官感知, 电台中广播的信息通
过听觉器官感知 。
? 信息是可 存储, 加工, 传递 和 再生 的。动物用大脑存储
信息,叫做记忆。计算机存储器、录音、录像等技术的
发展,进一步扩大了信息存储的范围。借助计算机,还
可对收集到的信息进行取舍整理。
返回 7
1.1.1.2 数据 (Data)
1,数据的定义
数据是用来记录信息的可识别的符号, 是信息
的具体表现形式 。
2,数据的表现形式
?可用 多种 不同的数据形式表示同一信息,而信
息不随数据形式的不同而改变。
?如,2000年硕士研究生将扩招 30%”,其中的数据可
改为汉字形式“两千年”、“百分之三十”。
?数据的概念在数据处理领域中已大大地拓宽了,
其表现形式不仅包括 数字 和 文字,还包括 图形,
图象, 声音 等。这些数据可以记录在纸上,也
可记录在各种存储器中。
返回 8
1.1.1.3 数据与信息的联系
? 数据是信息的符号表示或载体, 信息则是数据的内涵,
是对数据的语义解释 。
?如上例中的数据 2000,30%被赋予了特定的语义, 它们就具有了
传递信息的功能 。
1.1.2 数据处理
? 数据处理是将 数据 转换成 信息 的过程, 包括对数据的收
集, 存储, 加工, 检索, 传输等一系列活动 。 其目的是
从大量的原始数据中抽取和推导出有价值的信息, 作为
决策的依据 。
? 可用下式简单的表示信息, 数据与数据处理的关系,
信息 =数据 +数据处理
? 数据是原料, 是输入, 而信息是产出, 是输出结果 。
,信息处理, 的真正含义应该是为了产生信息而处理数
据 。
返回 9
1.2 数据库技术的产生、发展与研究领域
1.2.1 数据库技术的产生与发展
? 数据处理的中心问题是 数据管理 。
? 数据管理是指对数据的 组织, 分类, 编码, 存储, 检
索 和 维护 。
? 随着计算机硬件和软件的发展, 数据管理经历了 人工
管理, 文件系统 和 数据库系统 三个发展阶段 。
1.2.1.1 人工管理阶段 ( 50年代中期以前 )
? 这一阶段计算机主要用于 科学计算 。
? 硬件中的外存只有卡片, 纸带, 磁带, 没有磁盘等直
接存取设备 。
? 软件只有汇编语言, 没有操作系统和管理数据的软件 。
? 数据处理的方式基本上是 批处理 。
返回 10
人工管理阶段的特点如下,
1,数据不保存
? 因为当时计算机主要用于科学计算, 对于数据保存的
需求尚不迫切 。
2,系统没有专用的软件对数据进行管理
? 每个应用程序都要包括数据的存储结构, 存取方法,
输入方式等, 程序员编写应用程序时, 还要安排数据
的物理存储, 因此程序员负担很重 。
3,数据不共享
? 数据是面向程序的, 一组数据只能对应一个程序 。
? 多个应用程序涉及某些相同的数据时, 也必须各自定
义, 因此程序之间有大量的冗余数据 。
返回 11
4,数据不具有独立性
? 程序依赖于数据, 如果数据的类型, 格式, 或输入输
出方式等逻辑结构或物理结构发生变化, 必须对应用
程序做出相应的修改 。
在人工管理阶段,程序与数据之间的关系可用图 1.1
表示。
应用程序 1 数据集 1
应用程序 2 数据集 2
数据集 3 应用程序 3

图 1.1 人工管理阶段
返回 12
1.2.1.2 文件系统阶段 ( 50年代后期至 60年代中期 )
?这一阶段, 计算机不仅用于科学计算, 还大量
用于信息管理 。
?大量的数据存储, 检索和维护成为紧迫的需求 。
?硬件有了磁盘, 磁鼓等直接存储设备 。
?在软件方面, 出现了高级语言和操作系统 。
?操作系统中有了专门管理数据的软件, 一般称
为文件系统 。
?处理方式有批处理, 也有联机处理 。
返回 13
文件管理数据的特点如下,
1,数据以文件形式可长期保存下来
? 用户可随时对文件进行查询, 修改和增删等处理 。
2,文件系统可对数据的存取进行管理
? 程序员只与文件名打交道, 不必明确数据的物理存储,
大大减轻了程序员的负担 。
3,文件形式多样化
? 有顺序文件, 倒排文件, 索引文件等, 因而对文件的
记录可顺序访问, 也可随机访问, 更便于存储和查找
数据 。
4,程序与数据间有一定独立性
? 由专门的软件即文件系统进行数据管理, 程序和数据
间由软件提供的存取方法进行转换, 数据存储发生变
化不一定影响程序的运行 。
返回 14
在文件系统阶段, 程序与数据之间的关系可用图
1.2表示 。
文件 n
应用程序 1
应用程序 2
应用程序 n
文件 1
文件 2 文件




图 1.2 文件系统阶段
返回 15
与人工管理阶段相比, 文件系统阶段对数据的管理有了
很大的进步, 但一些 根本性问题 仍没有彻底解决, 主要
表现在以下三方面,
1,数据冗余度大
?各数据文件之间没有有机的联系, 一个文件基本上对
应于一个应用程序, 数据不能共享 。
2,数据独立性低
?数据和程序相互依赖, 一旦改变数据的逻辑结构, 必
须修改相应的应用程序 。
?而应用程序发生变化, 如改用另一种程序设计语言来
编写程序, 也需修改数据结构 。
3.数据一致性差
?由于相同数据的重复存储、各自管理,在进行更新操
作时,容易造成数据的不一致性。
返回 16
1.2.1.3数据库系统阶段 ( 60年代末开始 )
?60年代后期, 计算机应用于管理的规模更加庞
大, 数据量急剧增加;
?硬件方面出现了大容量磁盘, 使计算机联机存
取大量数据成为可能;
?硬件价格下降, 而软件价格上升, 使开发和维
护系统软件的成本增加 。
?文件系统的数据管理方法已无法适应开发应用
系统的的需要 。
?为解决多用户, 多个应用程序共享数据的需求,
出现了统一管理数据的专门软件系统, 即 数据
库管理系统 。
返回 17
数据库系统管理数据的特点如下,
1,数据共享性高, 冗余少
? 这是数据库系统阶段的最大改进, 数据不再面向某个
应用程序而是面向整个系统, 当前所有用户可同时存
取库中的数据 。
? 这样便减少了不必要的数据冗余, 节约存储空间, 同
时也避免了数据之间的不相容性与不一致性 。
2,数据结构化
? 按照某种数据模型, 将全组织的各种数据组织到一个
结构化的数据库中, 整个组织的数据不是一盘散沙,
可表示出数据之间的有机关联 。
返回 18
?例:要建立 学生成绩管理系统,系统包含 学生
(学号、姓名、性别、系别、年龄),课程
(课程号、课程名),成绩 (学号、课程号、
成绩)等数据,分别对应三个文件。
?若采用文件处理方式,因为文件系统只表示记
录内部的联系,而不涉及不同文件记录之间的
联系,要想查找某个学生的学号、姓名、所选
课程的名称和成绩,必须编写一段不很简单的
程序来实现。
?而采用数据库方式,数据库系统不仅描述数据
本身,还描述数据之间的联系,上述查询可以
非常容易地联机查到。
返回 19
3,数据独立性高
? 数据的独立性是指逻辑独立性和物理独立性 。
? 数据的 逻辑独立性 是指当数据的总体逻辑结构改变时,
数据的局部逻辑结构不变, 由于应用程序是依据数据
的局部逻辑结构编写的, 所以应用程序不必须修改,
从而保证了数据与程序间的逻辑独立性 。
?例如, 在原有的记录类型之间增加新的联系, 或在某些记录
类型中增加新的数据项, 均可确保数据的逻辑独立性 。
? 数据的 物理独立性 是指当数据的存储结构改变时, 数
据的逻辑结构不变, 从而应用程序也不必改变 。
?例如, 改变存储设备和增加新的存储设备, 或改变数据的存
储组织方式, 均可确保数据的物理独立性 。
返回 20
4,有统一的数据控制功能
? 数据库为多个用户和应用程序所共享, 对数据的存取
往往是并发的, 即多个用户可以同时存取数据库中的
数据, 甚至可以同时存取数据库中的同一个数据, 为
确保数据库数据的正确有效和数据库系统的有效运行,
数据库管理系统提供下述四方面的 数据控制功能 。
( 1) 数据的安全性 ( security) 控制,防止不合法使用
数据造成数据的泄露和破坏, 保证数据的安全和机密;
?例如, 系统提供口令检查或其他手段来验证用户身份, 防止
非法用户使用系统;也可以对数据的存取权限进行限制, 只
有通过检查后才能执行相应的操作 。
( 2) 数据的完整性 (integrity)控制,系统通过设置一些
完整性规则以确保数据的正确性, 有效性和相容性 。
返回 21
?正确性 是指数据的合法性, 如年龄属于数值型数据,
只能含 0,1,… 9,不能含字母或特殊符号;
?有效性 是指数据是否在其定义的有效范围, 如月份
只能用 1~12之间的正整数表示;
?相容性 是指表示同一事实的两个数据应相同, 否则
就不相容, 如一个人不能有两个性别 。
( 3) 并发 ( concurrency) 控制,多用户同时存
取或修改数据库时, 防止相互干扰而提供给用
户不正确的数据, 并使数据库受到破坏 。
返回 22
( 4) 数据恢复 ( recovery),当数据库被破坏或数据不
可靠时, 系统有能力将数据库从错误状态恢复到最近
某一时刻的正确状态 。
? 数据库系统阶段, 程序与数据之间的关系可用图 1.3表
示 。
图 1.3 数据库系统阶段
应用程序 1
应用程序 2
应用程序 n



数 据 库
管理系统
返回 23
?从文件系统管理发展到数据库系统管理是信息
处理领域的一个重大变化。
?在文件系统阶段,人们关注的是 系统功能的设
计,因此程序设计处于主导地位,数据服从于
程序设计;
?而在数据库系统阶段,数据的结构设计 成为信
息系统首先关心的问题。
?数据库技术经历了以上三个阶段的发展,已有
了比较成熟的数据库技术,但随着计算机软硬
件的发展,数据库技术仍需不断向前发展。
返回 24
1.2.2 数据库技术的研究领域
数据库学科的研究范围主要包括以下三个领域,
1,数据库管理系统软件的研制
? DBMS是数据库系统的基础 。
?DBMS 的研制包括研制 DBMS 本身及以 DBMS 为核心的一组相
互联系的软件系统, 包括工具软件和中间件 。
?研制的目标是提高系统的性能和提高用户的生产率 。
2,数据库设计
? 数据库设计的研究范围包括,
?数据库的设计方法, 设计工具和设计理论的研究,
?数据模型和数据建模的研究,
?计算机辅助数据库设计及其软件系统的研究,
?数据库设计规范和标准的研究等 。
返回 25
3,数据库理论
?数据库理论的研究主要集中于 关系规范化理论,
关系数据理论 等 。
?近年来, 随着人工智能与数据库理论的结合以
及并行计算技术的发展, 数据库逻辑演绎和知
识推理, 并行算法等都成为新的研究方向 。
?随着数据库应用领域的不断扩展,计算机技术
的迅猛发展,数据库技术与人工智能技术、网
络通信技术、并行计算技术等到相互渗透、相
互结合,使数据库技术不断涌现新的研究方向。
返回 26
1.3 数据库系统的组成和结构
1.3.1 数据库系统的组成
? 数据库系统通常是指数据库和相应的软硬件系统 。 主
要由 数据 ( 库 ), 用户, 软件 和 硬件 四部分组成 。
1.3.1.1 数据 ( 库 )
? 数据库是长期存储在计算机内有组织的共享的数据的
集合 。
? 它可以供用户共享, 具有尽可能小的冗余度和较高的
数据独立性, 使得数据存储最优, 数据最容易操作,
并且具有完善的自我保护能力和数据恢复能力 。
返回 27
数据库特点如下,
1,集成性,把某特定应用环境中的各种应用相关的数据
及其数据之间的联系全部地集中地并按照一定的结构
形式进行存储, 或者说, 把数据库看成为若干个单个
性质不同的数据文件的联合和统一的数据整体 。
2,共享性,数据库中的一块块数据可为多个不同的用户
所共享, 即多个不同的用户, 使用多种不同的语言,
为了不同的应用目的, 而同时存取数据库, 甚至同时
存取同一块数据, 即 多用户系统 。
返回 28
1.3.1.2 用户
? 用户是指使用数据库的人, 即对数据库的 存储, 维护
和 检索 等操作 。
用户分为三类,
1,第一类用户, 终端用户 ( End User)
?主要是使用数据库的各级管理人员, 工程技术人员, 科研人
员, 一般为非计算机专业人员;
2,第二类用户, 应用程序员 ( Application Programmer)
?负责为终端用户设计和编制应用程序, 以便终端用户对数据
库进行存取操作 。
3,第三类用户, 数据库管理员 ( Dadabase Administrator,
简称 DBA)
?DBA是指全面负责数据库系统的, 管理, 维护和正常使用的,
人员, 其职责如下,
返回 29
( 1) 参与数据库设计的全过程, 决定数据库的结构和内
容;
( 2) 定义数据的 安全性 和 完整性, 负责分配用户对数据
库的 使用权限 和 口令管理 ;
( 3) 监督控制数据库的使用和运行, 改进和重新构造数
据库系统 。 当数据库受到破坏时, 应负责 恢复数据库 ;
当数据库的结构需要改变时, 完成 对数据结构的修改 。
? DBA不仅要有较高的技术专长和较深的资历, 并应具
有了解和阐明管理要求的能力 。
? 特别对于大型数据库系统, DBA极为重要 。 对于常见
的微机数据库系统, 通常只有一个用户, 常常不设
DBA,DBA的职责由应用程序员或终端用户代替 。
返回 30
1.3.1.3 软件 (Software)
? 负责数据库存取, 维护和管理的软件系统, 即数据库
管理系统 ( Data Base Management System,简称
DBMS),
? 数据库系统的各类人员对数据库的各种操作请求, 都
由 DBMS完成,
? DBMS是数据库系统的核心软件 。
1.3.1.4硬件 ( Hardware)
? 存储和运行数据库系统的硬件设备 。
? 包括 CPU,内存, 大容量的存储设备, 外部设备等 。
返回 31
?数据库系统层次结构图如下图
由上图看出,
? DBMS在操作系统( OS)的支持下工作,
? 应用程序在 DBMS支持下才能使用数据库。
返回 32
1.3.2 数据库系统的结构
? 可以从多种不同的角度考查数据库系统的结构 。
?从数据库管理系统的角度看, 数据库系统通常采用三级 模式
结构, 这是数据库系统 内部的体系结构 ;
?从数据库最终用户的角度看, 数据库系统的结构分为集中式
结构, 分布式结构和客户 /服务器结构, 这是数据库系统 外部
的体系结构 。
1.3.2.1 数据库系统的三级模式结构
? 模式 ( Schema) 是数据库中全体数据的逻辑结构和特
征的描述 。
?例如:学生记录定义为 ( 学号, 姓名, 性别, 系别, 年龄 ),
称为 记录型,
?而 ( 001101,张立, 男, 计算机, 20) 则是该记录型的一个
记录值 。
?模式只是对记录型的描述, 而与具体的值无关 。
返回 33
? 在数据库系统中, 对于同一意义下的数据, 如:学生
数据, 从计算机中处理的二进制表示到用户处理的诸
如学生姓名, 年龄等概念的数据之间, 存在着许多抽
象和转换 。
? 通常 DBMS把数据库从逻辑上分为三级, 即 外模式,
模式 和 内模式, 它们分别反映了看待数据库的三个角
度 。 三级模式结构如图 1.5 所示 。
返回 34
应用 1 应用 2 应用 n ……
子模式 1 …… 子模式 m
子模式 /模式映象
模 式
模式 /内模式映象
内 模 式
数据库
图 1.5 数据库系统的三级模式结构
返回 35
1,模式
? 模式 ( Schema) 是数据库中全体数据的逻辑结构和特
征的描述, 又称 概念模式 或 概念视图 。 视图 可理解为
一组记录的值, 用户或程序员看到和使用的数据库的
内容 。
? 模式处于三级结构的中间层, 它是整个数据库实际存
储的抽象表示, 也是对现实世界的一个抽象, 是现实
世界某应用环境 ( 企业或单位 ) 的所有信息内容集合
的表示, 也是所有个别用户视图综合起来的结果, 所
以又称 用户共同视图 。
? 它表示了数据库的整体数据 。
? 由多个, 概念记录, 组成, 包含数据库的所有信息,
也称, 概念数据库,,, DBA视图, 。
? DBMS 提供模式描述语言 ( 模式 DDL) 来定义模式 。
返回 36
2,外模式
? 又称 子模式 或 用户模式 或 外视图, 是三级结构的最外
层, 个别用户只对整个数据库的一部分感兴趣, 所以
外视图是个别用户看到和使用的数据库内容, 因此也
常把外视图称为用户数据库 。
? 它由多种外记录值构成, 这些记录值是概念视图的某
一部分的抽象表示 。 即个别用户看到和使用的数据库
内容, 也称, 用户 DB”。
? 由多个, 外记录值, 组成, 是概念视图的某一部分的
抽象表示 。
? 从逻辑关系上看, 外模式包含于概念模式 。
? DBMS 提供子模式描述语言 ( 子模式 DDL) 来定义子
模式 。
返回 37
3,内模式
? 又称 存储模式 或 内视图, 是三级结构中的最内层, 也
是靠近物理存储的一层, 即与实际存储数据方式有关
的一层, 由多个存储记录组成, 但并非物理层, 不必
关心具体的存储位置 。
? DBMS 提供内模式描述语言 ( 内模式 DDL) 来定义内
模式 。
? 在数据库系统中, 外模式可有多个, 而概念模式, 内
模式只能各有一个 。
? 内模式是整个数据库实际存储的表示, 而概念模式是
整个数据库实际存储的抽象表示, 外模式是概念模式
的某一部分的抽象表示 。
返回 38
4,三级结构的优点
( 1) 保证数据的独立性 。
? 将模式和内模式分开, 保证了数据的物理独立性;
? 将外模式和模式分开, 保证了数据的逻辑独立性 。
( 2) 简化了用户接口 。
? 按照外模式编写应用程序或敲入命令, 而不需了
解数据库内部的存储结构, 方便用户使用系统 。
( 3) 有利于数据共享 。
? 在不同的外模式下可有多个用户共享系统中数据,
减少了数据冗余 。
( 4)利于数据的安全保密。
? 在外模式下根据要求进行操作,不能对限定的数
据操作,保证了其他数据的安全。
返回 39
1.3.2.2 数据库系统的二级映象
?数据库系统的三级模式是对数据的三个抽象级
别, 它使用户能逻辑地抽象地处理数据, 而不
必关心数据在计算机内部的存储方式, 把数据
的具体组织交给 DBMS 管理 。
?为了能够在内部实现这三个抽象层次的联系和
转换, DBMS 在三级模式之间提供了 二级映象
功能 。
返回 40
1,模式 /内模式映象
?数据库中的模式和内模式都只有一个, 所以模
式 /内模式映象是唯一的 。
?它确定了数据的全局逻辑结构与存储结构之间
的对应关系 。
?例如, 存储结构变化时, 模式 /内模式映象也应有相
应的变化, 使其概念模式仍保持不变, 即把存储结
构的变化的影响限制在概念模式之下, 这使数据的
存储结构和存储方法较高的独立于应用程序, 通过
映象功能保证数据存储结构的变化不影响数据的全
局逻辑结构的改变, 从而不必修改应用程序, 即确
保了数据的物理独立性 。
返回 41
2.外模式 /模式映象
?数据库中的同一模式可以有任意多个外模式,
对于每一个外模式, 都存在一个外模式 /模式映
象 。
?它确定了数据的局部逻辑结构与全局逻辑结构
之间的对应关系 。
?例如, 在原有的记录类型之间增加新的联系, 或在
某些记录类型中增加新的数据项时, 使数据的总体
逻辑结构改变, 外模式 /模式映象也发生相应的变化,
?这一映象功能保证了数据的局部逻辑结构不变, 由
于应用程序是依据数据的局部逻辑结构编写的, 所
以应用程序不必须修改, 从而保证了数据与程序间
的逻辑独立性 。
返回 42
1.4 数据库管理系统( DBMS)
?数据库管理系统是对数据进行管理的大型系统
软件, 它是数据库系统的 核心 组成部分,
?用户在数据库系统中的一切操作, 包括数据定
义, 查询, 更新及各种控制, 都是通过 DBMS
进行的 。
?DBMS就是实现把用户意义下的抽象的逻辑数
据处理转换成计算机中的具体的物理数据的处
理软件, 这给用户带来很大的方便 。
返回 43
1.4.1 DBMS的主要功能
1,数据定义
? DBMS 提供数据定义语言 DDL ( Data Define
Language), 定义数据的模式, 外模式和内模式三级
模式结构, 定义模式 /内模式和外模式 /模式二级映象,
定义有关的约束条件,
?例如, 为保证数据库安全而定义的用户口令和存取权限, 为
保证正确语义而定义完整性规则 。
2,数据操纵
? DBMS提供数据操纵语言 DML( Data Manipulation
Language) 实现对数据库的基本操作, 包括检索, 插
入, 修改, 删除等 。
? SQL语言就是 DML的一种 。
返回 44
3,数据库运行管理
? DBMS 对数据库的控制主要通过四个方面实现,
?数据的安全性控制
?数据的完整性控制
?多用户环境下的并发控制
?数据库的恢复
?以确保数据正确有效和数据库系统的正常运行 。
4,数据库的建立和维护功能
?包括数据库的初始数据的装入,
?数据库的转储, 恢复, 重组织,
?系统性能监视, 分析等功能 。
5,数据通信
? DBMS提供与其他软件系统进行通信的功能 。
? 实现用户程序与 DBMS之间的通信, 通常与操作系统
协调完成 。
返回 45
1.4.2 DBMS的组成
? DBMS是许多, 系统程序, 所组成的一个集合 。
? 每个程序都有自己的功能, 共同完成 DBMS的一件或
几件工作 。
1,语言编译处理程序
( 1) 数据定义语言 DDL及其编译程序
?它把用 DDL编写的各级源模式编译成各级目标模式, 这些目
标模式是对数据库结构信息的描述, 而不是数据本身, 它们
被保存在数据字典中, 供以后数据操纵或数据控制时使用 。
( 2) 数据操纵语言 DML及其编译程序, 实现对数据库
的基本操作 。 DML有两类,
?一类是 宿主型, 嵌入在高级语言中, 不能单独使用;
?另一类是 自主型 或 自含型, 可独立地交互使用 。
返回 46
2,系统运行控制程序, 主要包括以下几部分,
?系统总控程序,是 DBMS运行程序的核心, 用于控
制和协调各程序的活动;
?安全性控制程序,防止未被授权的用户存取数据库
中的数据;
?完整性控制程序,检查完整性约束条件, 确保进入
数据库中的数据的正确性, 有效性和相容性;
?并发控制程序,协调多用户, 多任务环境下各应用
程序对数据库的并以操作, 保证数据的一致性;
?数据存取和更新程序,实施对数据库数据的检索,
插入, 修改, 删除等操作;
?通信控制程序,实现用户程序与 DBMS间的通信。
返回 47
3,系统建立, 维护程序, 主要包括以下几部分,
?装配程序,完成初始数据库的数据装入;
?重组程序,当数据库系统性能变坏时 ( 如查询速度
变慢 ), 需要重新组织数据库, 重新装入数据;
?系统恢复程序,当数据库系统受到破坏时, 将数据
库系统恢复到以前某个正确的状态 。
4,数据字典 ( Data Dictionary,简称 DD)
?用来描述数据库中有关信息的数据目录,
?包括数据库的三级模式, 数据类型, 用户名, 用户
权限等有关数据库系统的信息,
?起着系统状态的目录表的作用,
?帮助用户, DBA, DBMS本身使用和管理数据库 。
返回 48
1.4.3 DBMS的数据存取的过程
? 在数据库系统中, DBMS与操作系统, 应用程序, 硬
件等协同工作, 共同完成数据各种存取操作, 其中
DBMS起着关键的作用 。
? DBMS对数据的存取通常需要以下四步,
? 1,用户使用某种特定的数据操作语言向 DBMS发出存取请求;
? 2,DBMS接受请求并解释;
? 3,DBMS依次检查外模式, 外模式 /模式映象, 模式, 模式 /
内模式映象及存储结构定义;
? 4,DBMS对存储数据库执行必要的存取操作;
? 上述存取过程中还包括安全性控制, 完整性控制, 以
确保数据的正确性, 有效性和一致性 。
返回 49
1.5 数据模型
1.5.1 数据模型的组成要素
? 数据模型 是模型的一种, 是现实世界数据特征的抽象 。
? 数据模型通常由 数据结构, 数据操作 和 数据的约束条
件 三个要素组成 。
1,数据结构
? 数据结构用于描述系统的静态特性 。
? 数据结构是所研究的对象类型的集合, 它是刻画一个
数据模型性质最重要的方面 。
? 在数据库系统中, 人们通常按照其数据结构的类型来
命名数据模型 。
? 数据结构有 层次结构, 网状结构 和 关系结构 三种类型,
按照这三种结构命名的数据模型分别称为层次模型,
网状模型和关系模型 。
返回 50
2,数据操作
? 数据操作用于描述系统的动态特性 。
? 数据操作是对数据库中各种数据操作的集合, 包括操
作及相应的操作规则 。
?如数据的检索, 插入, 删除和修改等 。
? 数据模型必须定义这些操作的确切含义, 操作规则以
及实现操作的语言 。
3,数据的约束条件
? 数据的约束条件是一组完整性规则的集合 。
? 完整性规则是给定的数据模型中数据及其联系所具有的制
约和依存规则, 用以限定符合数据模型的数据库状态以及
状态的变化, 以保证数据的正确, 有效, 相容 。
? 数据模型还应该提供定义完整性约束条件的机制, 以反映
具体应用所涉及的数据必须遵守的特定的语义约束条件 。
?例如, 在学生数据库中, 学生的年龄不得超过 40岁 。
返回 51
1.5.2 数据之间的联系
1.5.2.1 三个世界的划分
? 由于计算机不能直接处理现实世界中的具体事物, 所
以人们必须将具体事物转换成计算机能够处理的数据 。
? 在数据库中用数据模型来抽象, 表示和处理现实世界
中的数据 。
? 数据库即是模拟现实世界中某应用环境 ( 一个企业,
单位或部门 ) 所涉及的数据的集合, 它不仅要反映数
据本身的内容, 而且要反映数据之间的联系 。
? 这个集合或者包含了信息的一部分 ( 用用户视图模
拟 ), 或者包含了信息的全部 ( 用概念视图模拟 ),
而这种模拟是通过数据模型来进行的 。
返回 52
? 为了把现实世界中的具体事物抽象、组织为某一
DBMS支持的数据模型,在实际的数据处理过程中,
?首先将现实世界的事物及联系抽象成信息世界的信息模型,
?然后再抽象成计算机世界的数据模型。
? 信息模型并不依赖于具体的计算机系统,不是某一个
DBMS所支持的数据模型,它是计算机内部数据的抽
象表示,是概念模型;
? 概念模型经过抽象,转换成计算机上某一 DBMS支持
的数据模型。所以说,数据模型是现实世界的两级抽
象的结果。
? 在数据处理中,数据加工经历了现实世界、信息世界
和计算机世界三个不同的世界,经历了两级抽象和转
换。这一过程如图 1.6所示。
返回 53
图 1.6 数据处理的抽象和转换过程
现实世界
信息世界
认识抽象
计算机世界
返回 54
1.5.1.2 信息世界中的基本概念
在信息世界中, 常用的主要概念如下,
1,实体 ( Entity)
? 客观存在并且可以相互区别的, 事物, 称为实体 。
? 实体可以是可触及的对象, 如一个学生, 一本书, 一辆
汽车;也可以是抽象的事件, 如一堂课, 一次比赛等 。
2,属性 (Attributes)
? 实体的某一特性称为属性 。
?如学生实体有学号, 姓名, 年龄, 性别, 系等方面的属性 。
?属性有 "型 "和, 值, 之分, "型 "即为属性名, 如姓名, 年龄, 性
别是属性的型;, 值, 即为属性的具体内容, 如 ( 990001,张立,
20,男, 计算机 ) 这些属性值的集合表示了一个学生实体 。
返回 55
3,实体型 ( Entity Type)
? 若干个属性型组成的集合可以表示一个实体的类型,
简称实体型 。
?如学生 ( 学号, 姓名, 年龄, 性别, 系 ) 就是一个实体型 。
4,实体集 (Entity Set)
? 同型实体的集合称为实体集 。
?如所有的学生, 所有的课程等 。
5,键 ( Key)
? 能唯一标识一个实体的属性或属性集称为实体的键 。
?如学生的学号, 学生的姓名可能有重名, 不能作为学生实体
的键 。
返回 56
6,域 ( Domain)
? 属性值的取值范围称为该属性的域 。
?如学号的域为 6位整数, 姓名的域为字符串集合, 年龄的域为小
于 40的整数, 性别的域为 ( 男, 女 ) 。
7,联系 ( Relationship)
? 在现实世界中, 事物内部以及事物之间是有联系的, 这
些联系同样也要抽象和反映到信息世界中来,
? 在信息世界中将被抽象为实体型内部的联系和实体型之
间的联系 。
? 实体内部的联系通常是指组成实体的各属性之间的联系;
? 实体之间的联系通常是指不同实体集之间的联系 。
? 反映实体型及其联系的结构形式称为 实体模型, 也称作
信息模型, 它是现实世界及其联系的抽象表示 。
返回 57
两个实体型之间的联系有如下三种类型,
( 1) 一对一联系 ( 1:1)
? 实体集 A中的一个实体至多与实体集 B中的一个实体相
对应, 反之亦然, 则称实体集 A与实体集 B为一对一的
联系 。 记作 1:1。
?如:班级与班长, 观众与座位, 病人与床位 。
( 2) 一对多联系 ( 1:n)
? 实体集 A中的一个实体与实体集 B中的多个实体相对应,
反之, 实体集 B中的一个实体至多与实体集 A中的一个
实体相对应 。 记作 1:n。
?如:班级与学生, 公司与职员, 省与市 。
( 3) 多对多 ( m:n)
? 实体集 A中的一个实体与实体集 B中的多个实体相对应,
反之, 实体集 B中的一个实体与实体集 A中的多个实体
相对应 。 记作 ( m:n) 。
?如:教师与学生,学生与课程, 工厂与产品 。
返回 58
? 实际上, 一对一联系是一对多联系的特例, 而一对多
联系又是多对多联系的特例 。
? 可以用图形来表示两个实体型之间的这三类联系, 如
图书 1.7所示 。
A B A B A B
(a) (b) (c)
图 1.7 不同实体集实体之间的联系
返回 59
1.5.1.3 计算机世界中的基本概念
? 信息世界中的实体抽象为计算机世界中的数据, 存储
在计算机中 。 在计算机世界中, 常用的主要概念如下,
1,字段 ( Field)
? 对应于属性的数据称为字段, 也称为数据项 。 字段的
命名往往和属性名相同 。
?如学生有学号, 姓名, 年龄, 性别, 系等字段 。
2,记录 ( Record)
? 对应于每个实体的数据称为记录 。
?如一个学生 ( 990001,张立, 20,男, 计算机 ) 为一个记录 。
3,文件 ( File)
? 对应于实体集的数据称为文件 。
?如所有学生的记录组成了一个学生文件 。
返回 60
? 在计算机世界中, 信息模型被抽象为数据模型, 实体
型内部的联系抽象为同一记录内部各字段间的联系,
实体型之间的联系抽象为记录与记录之间的联系 。
? 现实世界是设计数据库的出发点, 也是使用数据库的
最终归宿 。
? 实体模型和数据模型是现实世界事物及其联系的两级
抽象 。 而数据模型是实现数据库系统的根据 。
? 通过以上的介绍, 我们可总结出三个世界中各术语的
对应关系如图 1.8所示 。
现实世界 信息世界 计算机世界
事物总体 实体集 文件
事物个体 实体 记录
特征 属性 字段
事物间联系 实体模型 数据模型
图 1.8 三个世界各术语的对应关系
返回 61
1.5.3 数据模型的分类
?数据模型的好坏, 直接影响数据库的性能 。
?数据模型的选择, 是设计数据库的一项首要任
务 。
?目 前 最 常 用 的 数 据 模 型 有 层 次 模 型
( Hierarchical Model), 网状模型 ( Network
Model) 和关系模型 ( Relational Model) 。
?这三种数据模型的根区别在于数据结构不同,
即数据之间联系的表示方式不同 。
?层次模型用, 树结构, 来表示数据之间的联系;
?网状模型是用, 图结构, 来表示数据之间的联系;
?关系模型是用, 二维表, 来表示数据之间的联系 。
返回 62
? 其中层次模型和网状模型是早期的数据模型, 统称为
非关系模型 。
? 20世纪 70年代至 80年代初, 非关系模型的数据库系统
非常流行, 在数据库系统产品中占据了主导地位,
? 现在已逐渐被关系模型的数据库系统取代,
? 但在美国等国, 由于早期开发的应用系都是基于层次
数据库或网状数据库系统, 因此目前层次数据库或网
状数据库的系统仍很多 。
? 20世纪 80年代以来,面向对象的方法和技术在计算机
各个领域,包括程序设计语言、软件工程、计算机硬
件等各方面都产生了深远的影响,出现了一种新的数
据模型 ——面向对象的数据模型
返回 63
1.5.3.1 层次模型
? 层次模型是数据库系统中最早出现的数据模型, 采用
层次模型的数据库的典型代表是 IBM公司的 IMS
( Information Management System) 数据库管理系统,
? 现实世界中, 许多实体之间的联系都表现出一种很自
然的层次关系, 如家族关系, 行政机构等 。
? 层次模型用一棵, 有向树, 的数据结构来表示各类实
体以及实体间的联系 。
?在树中, 每个结点表示一个记录类型, 结点间的连线 ( 或边 )
表示记录类型间的关系, 每个记录类型可包含若干个字段,
记录类型描述的是实体, 字段描述实体的属性, 各个记录类
型及其字段都必须命名 。
?如果要存取某一记录型的记录, 可以从根结点起, 按照有向
树层次向下查找 。
返回 64
?图 1.9是层次模型有向树的示意图。结点
A为根结点,D,F,G为叶结点,B,D为兄
结点 ……
图 1.9 层次模型有向树的示意图
A
B C
D E F
返回 65
1,层次模型的特征
( 1) 有且仅有一个结点没有双亲, 该结点就是根结点;
( 2) 根以外的其他结点有且仅有一个双亲结点, 这就使
得层次数据库系统只能直接处理一对多的实体关系;
( 3)任何一个给定的记录值只有按其路径查看时,才能
显出它的全部意义,没有一个子女记录值能够脱离双
亲记录值而独立存在。
? 例如:以下是一个层次模型的例子,如图 1.10所示。
D# DN DL
R# RN S# SN SS
T# TN TD
TS
教研室 R 学生 S
图 1.10 TS数据库模型
返回 66
? 层次数据库为 TS,它具有四个记录型, 分别是,
? 记录型 D( 系 ) 是根结点, 由字段 D#( 系编号 ), DN
( 系名 ), DL( 系地点 ) 组成, 它有两个孩子结点,,
R和 S,
? 记录型 R( 教研室 ) 是 D的孩子结点, 同时又是 T的双亲
结点, 它由 R#( 教研室编号 ), RN( 教研室名 ) 两个
字段组成,
? 记录型 S( 学生 ) 由 S#( 学号 ), SN( 姓名 ), SS( 成
绩 ) 三个字段组成,
? 记录型 T( 教师 ) 由 T#( 职工号 ), TN( 姓名 ), TD
( 研究方向 ) 三个字段组成,
? S与 T是叶结点, 它们没有子女结点, 由 D到 R,R到 T,
由 D到 S均是一对多的关系 。
返回 67
?对应上述数据模型的 一个值,
?该值是 D02系 ( 计算机系 ) 记录值及其所有后代记
录值组成的一棵树,
?D02系有 3个教研室子记录值,R01,R02,R03和 3
个学生记录值,S63871,S63874,S63876,
?教研室 R01有 3个教师记录值,T2101,T17090、
T3501,
返回 68
2,层次模型的数据操纵与数据完整性约束
? 层次模型的 数据操纵 主要有查询, 插入, 删除和修改,
? 进行插入, 删除和修改操作时要满足层次模型的 完整
性约束 条件 。
?进行插入操作时, 如果没有相应的双亲结点值就不能插入子
女结点值;
?进行删除操作时, 如果删除双亲结点值, 则相应的子女结点
值也被同时删除;
?修改操作时, 应修改所有相应的记录, 以保证数据的一致性 。
返回 69
3,层次模型的优缺点
?层次模型的 优点 主要有,
( 1) 比较简单, 只需很少几条命令就能操纵数
据库, 比较容易使用 。
( 2) 结构清晰, 结点间联系简单, 只要知道每
个结点的双亲结点, 就可知道整个模型结构 。
现实世界中许多实体间的联系本来就呈现出一
种很自然的层次关系,
?如表示行政层次, 家族关系很方便 。
( 3) 它提供了良好的数据完整性支持 。
返回 70
?层次模型的 缺点 主要有,
( 1) 不能直接表示两个以上的实体型间的复杂
的联系和实体型间的多对多联系, 只能通过引
入冗余数据或创建虚拟结点的方法来解决, 易
产生不一致性 。
( 2) 对数据的插入和删除的操作限制太多 。
( 3) 查询子女结点必须通过双亲结点 。
返回 71
1.5.3.2 网状模型
? 现实世界中事物之间的联系更多的是非层次关系的,
用层次模型表示这种关系很不直观,
? 网状模型 克服了这一弊病, 可以清晰的表示这种非层
次关系 。
? 20世纪 70年代, 数据系统语言研究会 CODASYL
( Conference On Data System Language) 下属的数据
库任务组 DBTG( Data Base Task Group) 提出了一个
系统方案, DBTG系统, 也称 CODASYL系统, 成为
了网状模型的代表 。
? 网状模型取消了层次模型的两个限制, 两个或两个以
上的结点都可以有多个双亲结点, 则此时有向树变成
了有向图, 该有向图描述了网状模型 。
返回 72
网状模型的特征
( 1) 有一个以上的结点没有双亲;
( 2) 至少有一个结点可以有多于一个双亲 。
?即允许两个或两个以上的结点没有双亲结点,
允许某个结点有多个双亲结点, 则此时有向树
变成了有向图, 该有向图描述了网状模型 。
?网状模型中每个结点表示一个记录型 ( 实体 ),
每个记录型可包含若干个字段 ( 实体的属性 ),
结点间的连线表示记录类型 ( 实体 ) 间的父子
关系 。
返回 73
?如:学生和课程间的关系 。 一个学生可以选修
多门课程, 一门课程可以由多个学生选修 。 如
图 1.11所示
图 1.11 学生与课程的网状模型
学生
课程
返回 74
2,网状模型的数据操纵与完整性约束
?网状模型的 数据操纵 主要包括查询, 插入, 删
除和修改数据 。
?插入数据时, 允许插入尚未确定双亲结点值的子女
结点值, 如可增加一名尚未分配到某个教研室的新
教师, 也可增加一些刚来报到, 还未分配宿舍的学
生 。
?删除数据时, 允许只删除双亲结点值, 如可删除一
个教研室, 而该教研室所有教师的信息仍保留在数
据库中 。
?修改数据时, 可直接表示非树形结构, 而无需像层
次模型那样增加冗余结点, 因此, 修改操作时只需
更新指定记录即可 。
?它没有像层次数据库那样有严格的完整性约束
条件, 只提供一定的完整性约束 。
返回 75
3,网状模型的优缺点
?网状模型的 优点 主要有,
( 1) 能更为直接地描述客观世界, 可表示实体
间的多种复杂联系 。
( 2) 具有良好的性能和存储效率
?网状模型的 缺点 主要有
( 1) 结构复杂, 其 DDL语言极其复杂 。
( 2) 数据独立性差, 由于实体间的联系本质上
是通过存取路径表示的, 因此应用程序在访问
数据时要指定存取路径 。
返回 76
1.5.3.3 关系模型
? 关系模型是发展较晚的一种模型,
? 1970年美国 IBM公司的研究员 E.F.Codd首次提出了数
据库系统的关系模型。
?他发表了题为“大型共享数据银行数据的关系模型”( A
Relation Model of Data for Large Shared Data Banks),在文中解
释了关系模型,定义了某些关系代数运算,研究了数据的函
数相关性,定义了关系的第三范式,从而开创了数据库的关
系方法和数据规范化理论的研究,
?他为此获得了 1981年的图灵奖。
?此后许多人把研究方向转到关系方法上,陆续出现了关系数
据库系统。
?1977年 IBM公司研制的关系数据库的代表 System R开始运行,
其后又进行了不断的改进和扩充,出现了基于 System R的数据
库系统 SQL/DB。
返回 77
?20世纪 80年代以来, 计算机厂商新推出的数据库管
理系统几乎都支持关系模型, 非关系系统的产品也
都加上了关系接口 。
?数据库领域当前的研究工作也都是以关系方法为基
础 。
?关系数据库 已成为目前 应用最广泛 的数据库系
统, 如现在广泛使用的小型数据库系统 Foxpro、
Acess,大型数据库系统 Oracle,Informix、
Sybase,SQL Server等都是关系数据库系统 。
返回 78
1,关系模型的基本概念
?关系模型的数据结构是一个, 二维表框架, 组
成的集合, 每个二维表又可称为 关系, 所以关
系模型是, 关系框架, 的集合 。
?关系模型与层次模型, 网状模型不同, 它是建
立在 严格的数学概念 之上的 。
?图 1.12给出了教学数据库的关系模型及其实例,
包含五个关系:教师关系 T,学生关系 S,课程
关系 C,选课关系 SC和授课关系 TC,分别对
应五张表 。
?下面以图 1.12为例, 介绍关系模型中所涉及的
一些基概念 。
返回 79
?T( 教师表 )
TNO
教师号
TN
姓名
SEX
性别
AGE
年龄
PROF
职称
SAL
工资
COMM
岗位津

DEPT
系别
T1
李力

47
教授
1500
3000
计算机
T2
王平

28
讲师
800
1200
信息
T3
刘伟

30
讲师
900
1200
计算机
T4
张雪

51
教授
1600
3000
自动化
T5
张兰

39
副教授
1300
2000
信息
返回 80
?S( 学生表 )
SNO
学号
SN
姓名
SEX
性别
AGE
年龄
DEPT
系别
S1
赵亦

17
计算机
S2
钱尔

18
信息
S3
孙珊

20
信息
S4
李思

21
自动化
S5
周武

19
计算机
S6
吴丽

20
自动化
返回 81
? C( 课程表 )
CNO 课程号
CN
课程名
CT
课时
C1
程序设计
60
C2
微机原理
80
C3
数字逻辑
60
C4
数据结构
80
C5
数据库
60
C6
编译原理
60
C7
操作系统
60
返回 82
? SC(选课表) TC(授课表)
SNO
学号
CNO
课程号
SCORE
成绩
TNO
教师号
CNO
课程号
S1
C1
90
T1
C1
S1
C2
85
T1
C4
S2
C5
57
T2
C5
S2
C6
80
T3
C1
S2
C7
T3
C5
S2
C5
70
T4
C2
S3
C1
0
T4
C3
S3
C2
70
T5
C5
S3
C4
85
T5
C7
S4
C1
93
S4
C2
85
S4
C3
83
S5
C2
89
返回 83
( 1) 关系 ( Relation)
? 一个关系对应一张二维表, 如图 1.12的五张表对应五
个关系 。
( 2) 元组 ( Tuple)
? 表格中的一行, 如 S表中的一个学生记录即为一个元组 。
( 3) 属性 ( Attribute)
? 表格中的一列, 相当于记录中的一个 字段, 如 S表中有
五个属性 ( 学号, 姓名, 性别, 年龄, 系别 ) 。
( 4) 关键字 ( Key)
? 可唯一标识元组的属性或属性集, 也称为 关系键 或 主
码, 如 S表中学号可以唯一确定一个学生, 为学生关系
的主码 。
返回 84
( 5) 域 ( Domain)
?属性的取值范围, 如年龄的域是 ( 14~40),性别
的域是 ( 男, 女 ) 。
( 6) 分量
?每一行对应的列的属性值, 即元组中的一个属性
值, 如学号, 姓名, 年龄等均是一个分量 。
( 7) 关系模式
?对关系的描述, 一般表示为:关系名 ( 属性 1,
属性 2,…… 属性 n), 如:学生 ( 学号, 姓名,
性别, 年龄, 系别 ) 。
返回 85
?在关系模型中, 实体是用关系来表示的, 如,
?学生 ( 学号, 姓名, 性别, 年龄, 系别 )
?课程 ( 课程号, 课程名, 课时 )
?实体间的关系也是用关系来表示的, 如,
?学生和课程之间的关系
?选课关系 ( 学号, 课程号, 成绩 )
返回 86
2,关系模型的数据操纵与完整性约束
?数据操纵 主要包括查询, 插入, 删除和修改数
据, 这些操作必须满足关系的完整性约束条件,
即实体完整性, 参照完整性和用户定义的完整
性 。 有关完整性的具体含义将在下一章介绍 。
?在非关系模型中, 操作对象是单个记录, 而关
系模型中的数据操作是集合操作, 操作对象和
操作结果都是关系, 即若干元组的集合;
?用户只要指出, 干什么,, 而不必详细说明
,怎么干,, 从而大大地提高了数据的独立性,
提高了用户的生产率 。
返回 87
3,关系模型的优缺点
? 关系模型的 优点 主要有,
( 1) 与非关系模型不同, 它有较强的数学理论根据 。
( 2) 数据结构简单, 清晰, 用户易懂易用, 不仅用关系描述
实体, 而且用关系描述实体间的联系 。
( 3) 关系模型的存取路径对用户透明, 从而具有更高的数据
独立性, 更好的安全保密性, 也简化了程序员的工作和数
据库建立和开发的工作 。
? 关系模型的 缺点 主要有,
?由于存取路径对用户透明, 查询效率往往不如非关系模型, 因此,
为了提高性能, 必须对用户的查询表示进行优化, 增加了开发数据
库管理系统的负担 。
返回 88
1.6 数据模型与数据库系统的发展
?数据模型 是数据库系统的核心和基础,
数据模型的发展经历了格式化数据模型
(层次数据模型和网状数据模型的统
称)、关系数据模型和面向对象的数据
模型三个阶段,按照这种划分,数据库
技术的发展也经历了三个发展阶段。
返回 89
1.6.1 第一代数据库系统
? 层次数据库系统和网状数据库系统的数据模型分别为
层次模型和网状模型, 但从本质上讲层次模型是网状
模型的特例, 二者从体系结构, 数据库语言到数据存
储管理上均具有共同的特征, 都是格式化模型, 属于
第一代数据库系统 。
? 第一代数据库系统的特点是,
1,支持三级模式的体系结构
?层次数据库和网状数据库均支持三级模式结构, 即外模式,
模式和内模式, 并通过外模式与模式, 模式与内模式二级映
象, 保证了数据的物理独立性和逻辑独立性 。
2,用存取路径来表示数据之间的联系
?数据库不仅存储数据而且存储数据之间的联系 。 数据之间的
联系在层次和网状数据库系统中是用存取路径来表示和实现
的 。
返回 90
3,独立的数据定义语言
?第一代数据库系统使用独立的数据定义语言来描述
数据库的三级模式以及二级映象 。 格式一经定义就
很难修改, 这就要求数据库设计时, 不仅要充分考
虑用户的当前需求, 还要了解需求可能的变化和发
展 。
4,导航的数据操纵语言
?导航的含义就是用户使用某种高级语言编写程序,
一步一步的引导程序按照数据库中预先定义的存取
路径来访问数据库, 最终达到要访问的数据目标 。
在访问数据库时, 每次只能存取一条记录值 。 若该
记录值不满足要求就沿着存取路径查找下一条记录
值 。
返回 91
1.6.2 第二代数据库系统
?第二代数据库系统是指支持关系数据模型的关
系数据库系统 。
?关系模型不仅简单, 清晰, 而且有关系代数作
为语言模型, 有关系数据理论作为理论基础 。
所以在关系模型提出后, 很快便从实验室走向
了社会, 20世纪 80年代几乎所有新开发的数据
库系统都是关系型数据库系统 。 这些商用数据
库系统的运行, 特别是微机 RDBMS的使用, 使
数据库技术日益广泛地应用到企业管理, 情报
检索, 辅助决策等各个方面, 成为实现和优化
信息系统的基本技术 。
返回 92
?关系模型之所以能成为深受广大用户欢迎的数
据模型, 与第一代数据库系统所支持的格式化
模型相比, 主要具有以下特点,
?关系模型的概念单一, 实体以及实体之间的联系都
用关系来表示;
?关系模型以关系代数为基础, 形式化基础好;
?数据独立性强, 数据的物理存取路径对用户隐蔽;
?关系数据库语言是非过程化的, 将用户从编程数据
库记录的导航式检索中解脱出来, 大大降低了用户
编程的难度 。
返回 93
1.6.3 传统数据库的局限性
? 一般说来, 将第一代数据库和第二代数据库称为传统
数据库 。
? 由于传统数据库尤其是关系数据库系统具有许多优点,
人们纷纷采用数据库技术来进行数据管理, 数据库技
术被应用到了许多新的领域, 如计算机辅助设计 /计算
机辅助制造 ( CAD/CAM), 计算机辅助工程 ( CASE),
图像处理等, 这些新领域的应用不仅需要传统数据库
所具有的快速检索和修改数据的特点, 而且在应用中
提出了一些新的数据管理的需求, 如要求数据库能够
处理声音, 图像, 视频等多媒体数据 。
? 在这些新领域中, 传统数据库暴露了其应用的局限性,
主要表现在以下几个方面,
返回 94
1,面向机器的语法数据模型
? 传统数据库中采用的数据模型是面向机器的语法数据
模型, 只强调数据的高度结构化, 只能存储离散的数
据和有限的数据与数据之间的关系, 语义表示能力较
差, 无法表示客观世界中的复杂对象, 如声音, 图像,
视频等多媒体数据, 工程, 测绘等领域中的非格式化
数据 。 此外, 传统数据模型缺乏数据抽象, 无法揭示
数据之间的深层含义和内在联系 。
2.数据类型简单, 固定
? 传统的 DBMS主要面向事务处理, 只能处理简单的数据
类型, 如整数, 实数, 字符串, 日期等, 而不能根据
特定的需要定义新的数据类型 。 例如, 不能定义包含
三个实数分量 ( x,y,z) 的数据类型 circle来表示圆,
而只能分别定义三个实型的字段 。 这样对于复杂的数
据类型只能由用户编写程序来处理, 加重了用户的负
担, 也不能保证数据的一致性 。
返回 95
3,结构与行为完全分离
? 从应用程序员的角度来看, 在某一应用领域内标识的
对象可以包含两方面的内容, 即对象的结构和对象的
行为 。
? 传统的数据库可以采用一定的数据库模式来表示前者,
而对于后者, 却不能直接存储和处理, 必须通过另外
的应用程序加以实现 。 例如, 对于多媒体数据, 虽然
可以在带有前面所提到的缺陷的情况下以简单的二进
制代码形式存储其结构, 但却无法存储其行为 ( 如播
放声音, 显示图像等 ) 。 这样, 这些多媒体数据必须
由相应的应用程序来识别, 而对于其他不了解其格式
的用户来说, 数据库中存储的是没有任何意义的二进
制数据 。
? 由此可见, 在传统数据库中, 对象的结构可以存储在
数据库中, 而对象的行为必须由应用程序来表示, 对
象的结构与行为完全相分离 。
返回 96
4,被动响应
? 传统数据库只能根据用户的命令执行特定的服务, 属于被动响应,
用户要求做什么, 系统就做什么 。 而在实际应用中, 往往要求一
个系统能够管理它本身的状态, 在发现异常情况时及时通知用户;
能够主动响应某些操作或外部事件, 自动采取规定的行动等等 。
例如, 一个仓库管理系统除了希望数据库系统能够正确, 高效地
存储有关物品的数据, 还希望数据库系统能够对仓库库存进行监
控, 当库存太少或太多时主动向用户发出警告 。 要完成这样的工
作, 数据库系统必须更加主动, 更加智能化, 而传统的数据库显
然不能适应这一要求 。
5,事务处理能力较差
? 传统数据库只能支持非嵌套事务, 对于较长事务的运行较慢, 且
中事务发生故障时恢复比较困难 。
? 由于存在上述种种缺陷, 使得传统数据库无法满足新
领域的应用需求, 数据库技术遇到了挑战, 在这种情
况下, 新一代数据库技术应运而生 。
返回 97
1.6.4 第三代数据库系统
1.6.4.1 第三代数据库系统的特点
? 第三代数据库系统是指支持面向对象 ( Object
Oriented,简称 OO) 数据模型的数据库系统 。
? 在数据库面临许多新的应用领域时, 1989年 9月, 一批
专门研究面向对象技术的著名学者著文, 面向对象的
数据库系统宣言,, 提出继第一代 ( 层次, 网状 ) 和
第二代 ( 关系 ) 数据库系统后, 新一代 DBS将是 OODBS。
1990年 9月, 一些长期从事关系数据库理论研究的学者
组建了高级 DBMS功能委员会, 发表了, 第三代数据库
系统宣言, 的文章, 提出了第三代 DBMS应具有的三个
基本特点 。
返回 98
1.第三代数据库系统应支持面向对象的数据模型
? 除提供传统的数据管理服务外, 第三代数据库系统应
支持数据管理, 对象管理和知识管理, 支持更加丰富
的对象结构和规则, 以提供更加强大的管理功能, 支
持更加复杂的数据类型, 以便能够处理非传统的数据
元素 ( 如超文本, 图片, 声音等 ) 。 90年代成功的
DBMS都会提供上述服务 。
? 有关 OO模型的基本内容, 将在下一节, 面向对象的数
据库技术, 中详细介绍 。
2.第三代数据库系统必须保持或继承第二代数据
库系统的优点
? 第三代数据库系统不仅能很好的支持对象管理和规则
管理, 还要更好地支持原有的数据管理, 保持第二代
数据库系统的非过程化的数据存取方式和数据独立性 。
返回 99
3,第三代数据库系统必须具有开放性
?数据库系统的开放性 ( open) 是指必须支持当
前普遍承认的计算机技术标准, 如支持 SQL语
言, 支持多种网络标准协议, 使得任何其他系
统或程序只要支持同样的计算机技术标准即可
使用第三代数据库系统;开放性还包括系统的
可移植性, 可连接性, 可扩展性和可互操作性
等 。
返回 100
1.6.4.2 研究第三代数据库系统的途径
? 数据库工作者为了给应用建立合适的数据库系统, 进
行了艰苦的探索, 从多方面发展了现行的数据库系统
技术, 主要的研究途径和方向有,
?对传统数据库 ( 主要是关系数据库 ) 进行不同层次上的扩充 。
?与计算机领域中其他学科的新技术紧密结合, 丰富和发展数
据库系统的概念, 功能和技术 。
?面向应用领域的数据库技术的研究 。
? 其中, 前两个途径是立足于数据库已有的成果和技术,
加以发展进化, 有人称之为, 进化论, 的观点和方法 。
后者是立足于新的应用需求和计算机未来的发展, 研
究全新的数据库系统, 有人称之为, 革新论, 的观点
和方法 。
返回 101
1.7.1 面向对象模型的核心概念
? 面向对象的程序设计方法是目前程序设计中主要的方法之
一, 它简单, 直观, 自然, 十分接近人类分析和处理问题
的自然思维方式, 同时又能有效地用来组织和管理不同类
型的数据 。
? 把面向对象程序设计方法和数据库技术相结合能够有效地
支持新一代数据库应用 。 于是, 面向对象数据库系统研究
领域应运而生, 吸引了相当面多的数据库工作者, 获得了
大量的研究成果, 开发了很多面向对象数据库管理系统,
包括实验系统和产品 。
? 比 较典型 的有 POSTGRES 系统和 Gemstone系统, 其中
POSTGRES系统是以 INGRES关系数据库系统为基础, 扩充其
功能, 使之具有面向对象的特性; Gemstone系统是在面向
对象程序语言基础上扩充得到的 。
? 目前, 各个关系数据库厂商都在不同程度上扩展了关系模
型, 推出了符合面向对象数据模型的数据库系统 。
1.7 面向对象的数据库技术
返回 102
?面向对象的数据模型吸收了面向对象程序设计
方法的核心概念和基本思想, 用面向对象的观
点来描述现实世界的实体 。
?一系列面向对象的核心概念构成了面向对象数
据模型的基础, 其中主要包括对象和对象标识,
属性和方法, 封装和消息, 类和继承 。 下面简
要介绍这些概念,
1, 对象 ( Object ) 和对象标识 ( Object
Identifier,简称 OID)
?对象是面向对象编程中最重要的概念, 用对象
来表示现实世界中的实体 。 一个学生, 一门课
程, 一次考试记录等等都可以看作对象 。
?每个对象都包含一组属性和一组方法。
返回 103
?属性 用来描述对象的状态、组成和特性,是对象的
静态特征。
? 一个简单对象如整数,其值本身就是其状态的完全描述,
不再需要其它属性,这样的对象称为原子对象。
? 属性的值也可以是复杂对象。一个复杂对象包含若干个属
性,而这些属性作为一种对象,又可能包含多个属性,这
样就形成了对象的递归引用,从而组成各种复杂对象。
?方法 用以描述对象的行为特性 。
? 一个方法实际是一段可对对象操作的程序 。
? 方法可以改变对象的状态, 所以称为对象的动态特征 。 如
一台计算机, 它不仅具有描述其静态特征的属性,CPU型
号, 硬盘大小, 内存大小等, 还具有开机, 关机, 睡眠等
动态特征 。
? 由此可见, 每个对象都是属性和方法的统一体 。
? 与关系模型的实体概念相比, 对象模型中的对象概念更为
全面, 因为关系模型主要描述对象的属性, 而忽视了对象
的方法, 因此会产生前面提到过的, 结构与行为相分离,
的缺陷 。
返回 104
?每一对象都由唯一的 对象标识 来识别, 用于确
定和检索这个对象 。
?对象标识独立于对象的内容和存储位置, 是一种逻辑
标识符, 通常由系统产生, 在整个系统范围内是唯一
的 。
?两个对象即使内部状态值和方法都相同, 如标识符不
同, 仍认为是两个相等而不同的对象 。
?如同一型号的两个零件, 在设计图上被用在不同的地
方, 这两个零件是, 相等, 的, 但被视为不同的对象
具有不同的标识符 。
?在这一点上, 面向对象的模型与关系模型不同, 在关
系模型中, 如果两个元组的属性值完全相同, 则被认
为是同一元组 。
返回 105
2,封装 ( Encapsulation) 和消息 ( Message)
? 每一个对象都是其属性和方法的 封装 。
?用户只能见到对象封装界面上的信息, 对象内部对用户是隐蔽
的 。
?封装的目的是为了使对象的使用和实现分开, 使用者不必知道
行为实现的细节, 只需用消息来访问对象, 这种数据与操作统
一的建模方法有利于程序的模块化, 增强了系统的可维护性和
易修改性 。
?例如, 在一个面向对象的系统中, 把计算机定义为一个对象,
用户只要掌握如何开机, 关机等操作就可以使用计算机了, 而
不用去管计算机内部是如何完成这些操作的细节问题 。
? 消息 是用来请求对象执行某一处理或回答某些信息的要
求 。
?一个对象所能接受的消息与其所带参数构成对象的外部界面 。
?某一对象在执行相应处理时, 如果需要, 它可以通过传递消息
请求其它对象完成某些操作, 消息传递是对象之间联系的唯一
方式 。
?一个对象可以向许多对象同时发出消息, 也可以接受多个对象
发来的消息 。
返回 106
?消息中只包含发送者的要求,它告诉接收者需要完成哪些处理。
如何处理由接收者解释。接收者独立决定采用什么方式完成所
需的处理。
? 在面向对象系统中对对象的操作在于选择一个对象并通
知它要作什么, 该对象决定如何完成这一工作, 即在它
的一组方法中选择合适的方法作用于其自身 。 因此, 在
面向对象的系统中, 对象是操作的基本单位 。
3.类 ( Class) 和继承 ( Inheritance)
? 具有同样属性和方法集的所有对象构成了一个对象类
( 简称 类 ), 一个对象是某一类的 实例 ( Instance) 。
? 例如, 把学生定义一个类, 则某个学生张三, 李四等则
是学生类中的对象 。 在 OODB中, 类是, 型,, 对象是某
一类的, 值, 。
返回 107
? 此外, 类的表示具有层次性 。 在 OO模型中, 可以通过
对已有的类定义进行扩充和细化来定义一个新类, 从
而形成了一种层次结构, 有了超类和子类的概念 。
? 所谓 超类 就是可以通过扩充和细化导出其他类, 而 子
类 是指由通过扩展类定义而得到的类 。
? 这种层次结构的一重要特点是 继承性 。
? 因为一个类可以有多个子类, 也可以有多个超类, 因
此, 一个类可以直接继承多个类, 这种继承方式称为
多重继承 。
? 如在职研究生, 既属于职工类, 又属于学生类, 他继
承了职工和学生的所有性质 。
? 如果一个类至多只有一个超类, 则一个类只能从单个
超类继承属性和方法, 这种继承方式称为 单重继承 。
? 在多重继承情况下, 类的层次结构不再是一棵树, 而
是一个网络结构 。
返回 108
1.7.2 面向对象数据库系统的特点
? OODBS是面向对象技术与数据库技术相结合的产物, 所
以称一个数据库系统为面向对象的数据库系统至少应
满足两个条件, 一个是支持面向对象数据模型的内核;
另一个是支持传统数据库的所有数据成份, 所以 OODBS
除了具有原来关系数据库的各种特点外, 还具有以下
特点,
1,扩充数据类型
? RDBMS只支持某些固定的类型, 不能依据某一特定的应
用所需来扩展其数据类型, 而 OODBS允许用户在关系数
据库系统中扩充数据类型 。
? 新数据类型可定义为原有类型的子类或超类, 新的数
据类型定义之后, 存放在数据库管理系统核心中, 如
同基本数据类型一样, 可供所有用户共享 。
返回 109
2,支持复杂对象
? OODBS中的基本结构是对象而不是记录, 一个对象不仅
包括描述它的数据, 还包括对它操作的方法 。
? OODBS不仅支持简单的对象, 还支持由多种基本数据类
型或用户自定义的数据类型构成的复杂对象, 支持子
类, 超类和继承的概念, 因而能对现实世界的实体进
行自然而直接的模拟, 可表示诸如某个对象由, 哪些
对象组成,, 有, 什么性质,, 处在, 什么状态,,
具有丰富的语义信息, 这是传统数据库所不能比拟的 。
3,提供通用的规则系统
? 规则 在 DBMS及其应用中是十分重要的, 在传统的 RDBMS
中用触发器来保证数据库的完整性 。 触发器 可以看成
规则的一种形式 。 OODBS支持的规则系统将更加通用,
更加灵活 。
? 例如规则中的事件和动作可以是任何的 SQL语句, 可以
使用用户自定义的函数, 规则还能够被继承 。 这就大
大增强了 OODBS功能, 使之具有主动数据库的特性 。
返回 110
1.7.3 面向对象数据库语言
? OODB语言融程序语言和数据库语言于一体, 用于描述
面向对象数据库模式, 说明并操纵类定义与对象实例 。
? Gemstone数据库系统中所采用的 OPAL语言被认为是
OODB语言的典型代表, 主要包括对象定义语言 ( ODL)
和对象操纵语言 ( OML) 。
1,对象定义语言
? ODL可以对类进行定义与操纵, 其中包括定义类的属性,
操纵特征, 继承性与约束, 可以修改和撤销类 。
? ODL还可以用于对象方法的定义与实现 。
? 在操作实现中, 语言的命令可用于操作对象的局部数
据结构 。
? 对象模型中的封装性允许方法由不同程序设计语言来
实现, 并且隐藏不同程序设计语言实现的事实 。
2,对象操纵语言
? 对象操纵包括对实例对象进行插入, 修改, 删除和查
询等操作 。
返回 111
1.7.4 面向对象数据库的研究内容
? 把面向对象的技术与数据库技术相结合形成面向对象
的数据库系统, 有许多新的课题要研究 。
1,数据模型研究
? 目前, 面向对象的数据库还没有一个确定的数据模型,
支持面向对象数据库的数据模型大多源于支持面向对
象程序设计语言的数据模型, 并进行了一些数据库功
能的扩充 。 它们都包含了面向对象的基本思想, 但缺
乏一个公共的形式框架, 以至在这个框架中可以定义
面向对象的数据模型, 给出这个数据模型中对象及其
方法的形式语义以建立面向对象数据库系统的理论基
础 。
2,与程序设计语言集成的研究
? 面向对象程序设计语言着重于数据库的行为特征和结
构特征, 而数据库着重于对永久性数据的管理, 两者
的集成将会对更广泛的应用领域有更好的支持 。
返回 112
3,体系结构的研究
? 将面向对象的概念引入数据库中, 对传统数据库系统
中的一些结构概念需要重新考虑, 包括查询, 索引,
并发控制以及存储结构, 这些都要涉及到对类的处理,
要比传统数据模型中的结构得多 。
? 人们认为 OODBS将成为下一代数据库系统的典型代表,
但是, OODBS在奠基其新一代数据库地位之前要清除
两个障碍,标准化 和 性能 。
? 关系数据库的成功不仅在于其简单的数据模型和高度
的数据独立性, 还在于其标准化 。 标准化对 OODBMS实
际上更为重要, 因为 OODBMS涉及范围远远超出 RDBMS,
应用更加复杂, 为了使应用实际可行, 为了使应用实
际可以在不同环境间移植和操作, 以及为了使用户容
易学习新的 OODBS,标准尤其重要 。 即将颁布的 SQL99
( 俗称 SQL3) 增加了 OODB的许多特征, 会对 OODB的标
准化有所贡献 。
返回 113
? 数据库技术与其他相关技术的结合是当前数据库技术发
展的重要特征 。
? 计算机领域中其他新兴技术的发展对数据库技术产生了
重大影响 。 面对传统数据库技术的不足和缺陷, 人们自
然而然地想到借鉴其他新兴的计算机技术, 从中吸取新
的思想, 原理和方法, 将其与传统的数据库技术相结合,
以推出新的数据库模型, 从而解决传统数据库存在的问
题 。 通过这种方法, 人们研制出了各种各样的新型数据
库, 例如,
?数据库技术与分布处理技术相结合, 出现了分布式数据库;
?数据库技术与人工智能技术相结合, 出现了演绎数据库, 主动
数据库和知识库等;
?数据库技术与多媒体技术相结合, 出现了多媒体数据库 。
? 下面我们将对其中的几个新型数据库中以介绍 。
1.8 数据库技术与其他相关技术的结合
返回 114
1.8.1 分布式数据库 ( Distributed Database)
1.8.1.1 集中式系统和分布式系统
? 到目前为止, 我们所介绍的数据库系统都是 集中式数
据库系统 。 所谓集中式数据库就是集中在一个中心场
地的电子计算机上, 以统一处理方式所支持的数据库 。
这类数据库无论是逻辑上还是物理上都是集中存储在
一个容量足够大的外存储器上, 其基本特点是,
?集中控制处理效率高, 可靠性好;
?数据冗余少, 数据独立性高;
?易于支持复杂的物理结构, 去获得对数据的有效访问 。
? 但是随着数据库应用的不断发展, 人们逐渐地感觉到
过份集中化的系统在处理数据时有许多局限性 。 例如,
不在同一地点的数据无法共享;系统过于庞大, 复杂,
显得不灵活且安全性较差;存储容量有限不能完全适
应信息资源存储要求等等 。
返回 115
? 正是为了克服这种系统的缺点, 人们采用数据分散的办
法, 即把数据库分成多个, 建立在多台计算机上, 这种
系统称为分散式数据库系统 。
? 由于计算机网络技术的发展, 才有可能并排分散在各处
的数据库系统通过网络通信技术连结起来, 这样形成的
系统称为分布式数据库系统发展起来了 。
? 近年来, 分布式数据库已经成为信息处理中的一个重要
领域, 它的重要性还将迅速增加 。
1.8.1.2 分布式数据库的定义
? 分布式数据库是一组结构化的数据集合, 它们在逻辑上
属于同一系统而在物理上分布在计算机网络的不同结点
上 。 网络中的各个 结点 ( 也称为, 场地, ) 一般都是集
中式数据库系统, 由计算机, 数据库和若干终端组成 。
返回 116
?数据库中的数据不是存储在同一场地, 这就是
分布式数据库的, 分布性, 特点, 也是与集中
式数据库的最大区别 。
?表面上看, 分布式数据库的数据分散在各个场
地, 但这些数据在逻辑上却是一个整体, 如同
一个集中式数据库 。 因而, 在分布式数据库中
就有全局数据库和局部数据库这样两个概念 。
?所谓 全局数据库 就是从系统的角度出发, 指逻辑上
一组结构化的数据集合或逻辑项集;
?而 局部数据库 是从各个场地的角度出发, 指物理结
点上各个数据库, 即子集或物理项集 。
?这是分布式数据库的, 逻辑整体性, 特点, 也
是与分散式数据库的区别 。
返回 117
? 例如, 假设一个银行有三个支行, 图 8.1中的三个场地
分别代表一个支行所在地 。
? 在一般情况下, 一个支行的用户所提出的各种应用,
只需要通过访问该支行的帐目数据库即可实现 。 也就
是说, 这些应用完全由该支行的计算机进行处理 。 我
们把这些应用称之为 局部应用 。 局部应用的典型例子
就是银行的借贷业务, 它只需要存取某一支行的数据
库就可完成 。 如果分布式数据库只限于局部应用, 那
么还只是起了分散式数据库的作用 。
? 而银行中的很多业务, 并非只限于某一支行的数据库 。
如银行中的通兑业务, 即场地 1存款的用户可能到场地
2或场地 3去取款;银行中的转帐业务, 要求从一个支
行的帐户中转出若干金额到另一个支行的帐户中去 。
这些应用要求就要同时更新两个支行 ( 场地 ) 上的数
据库 。 我们把这些应用称为 全局应用 ( 或分布应用 ) 。
返回 118
场地 1
T1
T2
T3
DB1
DB1
计算机 1
场地 2
T1
T2
T3
DB2
DB1
计算机 2
场地 3
T1
T2
T3
DB3
DB1 计算机 3
网络
图 8.1 分布式数据库系统的例子
返回 119
1.8.1.3 分布式数据库的特点
? 分布式数据库可以建立在以局域网连接的一组工作站
上, 也可以建立在广域网 ( 或称远程网 ) 的环境中 。
但分布式数据库系统并不是简单地把集中式数据库安
装在不同的场地, 而是具有自己的性质和特点 。
1,自治与共享
? 分布式数据库有集中式数据库的共享性与集成性, 但
它更强调自治及可控制的共享 。
? 这里的 自治 是指局部数据库可以是专用资源也可以是
共享资源 。
? 这种共享资源体现了物理上的分散性, 这是由按一定
的约束条件被划分而形成的 。
? 因此, 要由一定的协调机制来控制以实现共享 。 同时
可以构成很灵活的分布式数据库 。
? 它的两个极端分别是完全集中式或者完全分散式 。
返回 120
2,冗余的控制
? 在研究集中式数据库技术时强调减少冗余, 但在研究
分布式数据库时允许冗余 ―― 物理上的重复 。
? 这种冗余 ( 多副本 ) 增加了自治性, 即数据可以重复
地驻留在常用的结点上以减少通信代价, 提供自治基
础上的共享 。 冗余不仅改善系统性能, 同时也增加了
系统的可用性 。 即不会由于某个结点的故障而引起全
系统的瘫痪 。 但这无疑增加了存储代价;也增加了副
本更新时的一致性代价, 特别当有故障时, 结点重新
恢复后保持多个副本一致性的代价 。
3,分布事务执行的复杂性
? 逻辑数据项集实际上是由分布在各个结点上的多个关
系片段(子集)所合成的。
? 一个项可以物理上被划分为不相交(或相交)的片段;
一个项(或片段)可以有多个相同的副本且存储在不
同的结点上。
返回 121
?所以,对分布式数据库存取的事务是一种全局
性事务,它是由许多在不同结点上执行对各局
部数据库存取的局部子事务所合成的。如果仍
应保持事务执行的原子性,则必须保证全局事
务的原子性;当多个全局事务并发时,则必须
保持全局可串行性。也就是说,这种全局事务
具有分布执行的特性。
?分布式数据库的状态一致性和可恢复性是面向
全局的。所有子事务提交后全局事务才能提交;
不仅要保证子事务的可串行化,而且应该保证
全局事务的可串行化。
返回 122
4,数据的独立性
? 数据库技术的一个目标是使数据与应用程序间尽量独
立, 相互之间影响最小 。 也就是数据的逻辑和物理存
储对用户是透明的 。 在分布式数据库中数据的独立性
有更丰富的内容 。
? 使用分布式数据库时, 应该像使用集中式数据库时一
样, 即系统要提供一种完全透明的性能, 具体包括以
下内容,
( 1) 逻辑数据透明性 。 某些用户的逻辑数据文件改变时, 或者
增加新的应用使全局逻辑结构改变时, 对其它用户的应用程
序没有或尽量少的影响 。
( 2) 物理数据透明性 。 数据在结点上的存储格式或组织方式改
变时, 数据的全局结构与应用程序无需改变 。
( 3) 数据分布透明性 。 用户不必知道全局数据如何划分的细节 。
( 4) 数据冗余的透明性 。 用户无需知道数据重复, 即数据子集
在不同结点上冗余存储的情况 。
返回 123
1.8.1.4 分布式数据库的应用及展望
?一个完全分布式数据库系统在站点分散实现共
享时, 其利用率高, 有站点自治性, 能随意扩
充逐步增生, 可靠性和可用性好, 有效且灵活,
用户完全像使用本地的集中式数据库一样 。
?分布式数据库已广泛应用于企业人事, 财务,
库存等管理系统, 百货公司, 销售店的经营信
息系统, 电子银行, 民航定票, 铁路定票等在
线处理系统, 国家政府部门的经济信息系统,
大规模数据资源如人口普查, 气象预报, 环境
污染, 水文资源, 地震监测等信息系统 。
返回 124
? 此外, 随着数据库技术深入各应用领域, 除了商业性,
事务性应用以外, 在以计算机作为辅助工具的各个信
息领域, 如 CAD,CAM,CASE,OA,AI,军事科学等,
同样适用分布式数据库技术, 而且对数据库的集成共
享, 安全可靠等特性有更多的要求 。
? 为了适应新的应用, 一方面要研究克服关系数据模型
的局限性, 增加更多面向对象的语义模型, 研究基于
分布式数据库的知识处理技术;另一方面可以研究如
何弱化完全分布, 完全透明的概念, 组成松散的联邦
型分布式数据库系统 。 这种系统不一定保持全局逻辑
一致, 而仅提供一种协商谈判机制, 使各个数据库维
持其独立性, 但能支持部分有控制的数据共享, 这对
OA等信息处理领域很有吸引力 。
? 总之, 分布式数据库技术有广阔的应用前景 。 随着计
算机软, 硬件技术的不断发展和计算机网络技术的发
展, 分布式数据库技术也将不断地向前发展 。
返回 125
1.8.2 主动数据库 ( Active Database)
1.8.2.1 主动数据库的定义
? 主动数据库 是相对传统数据库的被动性而言的 。 在传
统数据库中, 当用户要对数据库中的数据进行存取时,
只能通过执行相应的数据库命令或应用程序来实现 。
数据库本身不会根据数据库的状态主动做些什么, 因
而是被动的 。
? 然而在许多实际应用领域中, 例如计算机集成制造系
统, 管理信息系统, 办公自动化中常常希望数据库系
统在紧急情况下能够根据数据库的当前状态, 主动,
适时地作出反应, 执行某些操作, 向用户提供某些信
息 。 例如, 前面提到的仓库管理系统就是这样 。 这类
应用的特点是事件驱动数据库操作以及要求数据库系
统支持涉及时间方面的约束条件 。
返回 126
? 为此, 人们在传统数据库的基础上, 结合人工智能技
术研制和开发了主动数据库 。
? 所谓主动数据库就是批除了完成一切传统数据库的服
务外, 还具有各种主动服务功能的数据库系统 。
1.8.2.2 主动数据库的实现
? 主动数据库的目标旨在提供对紧急情形及时反应的功
能, 同时又提高数据库管理系统的模块化程度 。
? 一般的方法是在传统数据库系统中嵌入 ECA规则, 即事
件-条件-动作 ( Event- Conditon- Action) 。
? ECA规则可以表示为以下形式,
WHEN <事件 >
IF <条件 > THEN <动作 >( 或后跟一组 IF-THEN规则 )
返回 127
? 系统提供一个, 自动监视, 机构 ( 一般可以是一个直
接由操作系统控制的独立进程或某种硬件设施等 ),
它主动地不时地检查着这些规则中包含的各种事件是
否已经发生, 一旦某事件被发现, 系统就主动触发执
行相应的 IF-THEN规则 ( 或规则组 ) 。
? 显然, 此时 DBMS本身就可主动履行一些预先由用户设
定的动作, 可把诸如完整性约束, 存取控制, 例外处
理, 触发警告, 主动服务, 状态开关切换乃至复杂的
演绎推理功能等以一种统一的机制得以实现 。
? 为了有效地支持 ECA规则, 在主动数据库中需要有以下
实现技术的支持,
1,知识模型
? 所谓知识模型是指在主动数据库管理系统中描述, 存
储, 管理 ECA规则的方法 。
? 为此, 必须扩充传统的数据模型, 使之能支持对 ECA规
则的定义, 操作及规则本身的一致性保证 。
? 此外, 知识模型还应支持有关时间的约束条件 。
返回 128
? 传统数据库系统中, 数据模型的描述能力有限, 尽管
为了实现完整性制而引入了触发器机制, 但触发器和
主动数据库中规则相比表达能力低 。 只能描述, 更新
单个关系, 这类事件 。 也不区分事件和条件 。 条件的
检查, 动作的执行总是在触发之后立即执行或事物提
交前执行, 执行方式简单 。 因此主动数据库必须扩充
传统的数据模型, 增加规则部分, 即知识模型 。
2,执行模型
? 执行模型指 ECA规则的处理, 执行方式, 包括 ECA规则
中事件 —条件, 条件 —动作之间各种耦合方式及其语
义描述, 规则的动作和用户事务的关系 。 执行模型是
对传统事务模型的发展和扩充 。
? 在主动数据库中研究并提出了立即执行, 延时执行,
紧耦合 /松耦合等等多种多样的执行 ECA规则的方式 。
? 丰富多样的执行模型使用户可以灵活地定义主动数据
库的行为, 克服了传统数据库管理系统中触发器事务
只能顺序执行其规则的不足 。
返回 129
3,条件检测
? 主动数据库中条件检测是系统的关键技术之一 。 主动
数据库中条件复杂, 可以是动态的条件, 多重条件,
交叉条件 。
? 所谓交叉是指条件可以互相覆盖, 即其中某些子条件
可以属于其他主条件 。 因此高效地对条件求值是系统
的目标之一 。
4,事物调度
? 一般地, 事物调动是指如何控制事务的执行次序, 使
的事务满足一定的约束条件 。
? 在传统 DBMS中并发事务的调度执行应满足可串行化要
求以保证数据库的一致性 。
? 在主动数据库中, 对事务的调度不仅要满足并发环境
下的可串化要求而且要满足对事务时间方面的要求 。
例如事务中操作的开始时间, 终止时间, 所须的执行
时间等 。
返回 130
? 要同时满足两方面要求的调度是一个困难的技术问题 。
它要综合传统数据库的并发控制技术和实时操作系统
中与时间要求有关的调度技术 。
? 由于主动数据库中执行模型的复杂性更增加事务调度
的技术难度 。 为此要研究一种新的框架或新的调度模
型, 以此为基础来建立调度策略, 调度算法 。
? 由于事务调度要满足时间方面的要求, 因而调度机制
常常是执行时间的谓词, 而对执行时间估计的代价模
型同样是尚未解决的难题 。
5,体系结构
? 主动数据库系统的体系结构应该是具有高度的模块性
和灵活性 。 由于目前大部分主动数据库是在传统 DBMS
或面向对象数据库管理系统上研制的, 其体系结构大
多是扩充 DBMS的事务管理部件, 对象管理部件以支持
执行模型和知识模型 。
返回 131
6,系统效率
? 对主动数据库的研究必须包括对不同体系结构, 算法
运行效率的比较和评价 。
? 为了提高系统效率, 正在研究的课题有如:把条件计
算和动作执行从触发事务中分离出来, 启发式事务调
度算法, 条件检测方法, 以及在分布环境和多处理机
环境下的系统资源分布策略, 负载平衡的研究等等 。
? 系统效率是主动数据库研究中一个重要问题 。 由于上
面讨论中可以发现, 在设计各种算法和在体系结构的
选择方面, 系统效率是主要的设计目标 。
? 主动数据库是一个正在研究探索的新领域,许多概念
尚不成熟,不少技术难题尚未解决。
返回 132
1.8.3 多媒体数据库 ( Multimedia Database)
?, 多媒体, 译自 20世纪 80年代初产生的英文词
,multimedia”。 多媒体是在计算机控制下把文字,
声音, 图形, 图象, 视频等多种类型数据的有机组集
成 。 其中数字, 字符等称为非格式化数据, 文本, 声
音, 图形, 图象, 视频等称为非格式化数据 。
? 数据库从传统的企业管理扩展到 CAD,CAM等多种非传
统的应用领域 。 这些领域中要求处理的数据不仅包括
一般的格式化数据, 还包括大量不同媒体上的非格式
化数据 。 在字符型媒体中, 信息是由数字与字母组成
的, 要按照数学字母的特征来处理 。
? 在图形媒体中, 信息用有关图形描绘, 其中包括几何
信息与非几何信息, 以及描述各几何体之间相互的拓
朴信息 。 这些不同媒体上的信息具有不同的性质与特
性, 因此, 如何组织存在于不同媒体上的信息, 就要
建立多媒体数据库系统 。
返回 133
? 多媒体数据库 是指能够存储和管理相互关联的多媒体
数据的集合 。
? 这些数据集合语义丰富, 信息量特别大, 管理过程复
杂, 因而要求多媒体数据库能够支持多种数据模型,
能够存储多种类型的多媒体数据, 并针对多媒体数据
的特点采用数据压缩与解压缩等特殊存储技术;同时,
要提供对多媒体数据进行处理的功能, 包括查询, 播
放, 编辑等功能, 可以将物理存储的信息以多媒体方
式向用户表现和支付 。
? 多媒体数据库目前有三种结构,
?第一种结构,由单独一个多媒体数据库管理系统来管理不同
媒体的数据库以及对象空间 。
?第二种结构,主辅 DBMS体系结构 。 每一个媒体数据库由一个
辅 DBMS管理 。 另外有一个主 DBMS来一体化所有的辅 DBMS。 用
户在 DBMS上使用多媒体数据库 。 对象空间由主 DBMS来管理 。
返回 134
?第三种结构,协作 DBMS体系结构 。 每个媒体数据库对应一个
DBMS,称为成员 DBMS,每个成员放到外部软件模型中, 外部
软件模型提供通信, 查询和修改的界面 。 用户可以在任一点
上使用数据库 。
? 多媒体数据库的研究历史不长, 但却是计算机科学技
术中方兴未艾的一个重要分支 。
? 从理论上说, 它涉及的内容大到可以把一切对象装进
一个数据库系统, 因而所遇到的问题极其, 需要有深
刻的思想, 不但不技术问题, 也有对现实世界的认识
和理解问题 。
? 人们期待着, 随着多媒体数据库系统本身的进一步研
究, 随着不同介质集成的进一步实现, 商用多媒体数
据库管理系统必将蓬勃发展, 多媒体数据库领域必将
在高科技方面上有越来越重要的地位 。
返回 135
?通过上述对数据库系统的介绍, 我们可以得出
这样的结论, 传统的数据库技术和其他计算机
技术相互结合, 相互渗透, 使数据库中新的技
术内容层出不穷 。
?数据库的许多概念, 技术内容, 应用领域, 甚
至某些原理都有了重大的发展和变化 。
?新的数据库技术不断涌现, 这些新的数据库技
术, 有力地提高了数据库的功能, 性能, 并使
数据库的应用领域得到极大的发展 。 这些新型
的数据库系统共同构成了数据库系统的大家族 。
返回 136
? 本章概述了 信息, 数据 与 数据处理 的基本概念,介绍
了数据管理技术发展的三个阶段,说明了数据库系统
的优点。
? 通过介绍数据库系统的组成,DBMS的功能与组成,
使读者了解数据库系统实质是一个人机系统,人的作
用特别是 DBA的作用非常重要。
? 数据库系统的三级抽象和二级映象保证了数据库系统
的 逻辑独立性 和 物理独立性 。
? 另外介绍了 三种数据模型 的区别,其中 关系模型 为广
泛应用。
? 最后 本章主要介绍了数据库新技术的主要内容和发展
方向。
小 结
返回 137
第 2章 关系模型
返回 138
? 上一章介绍了 三种 主要的数据模型,
?层次模型
?网状模型
?关系模型
?其中 关系模型 简单灵活,并有着坚实的理论基础,已成为当
前 最流行 的数据模型。
? 本章主要讲述,
?关系模型的数据结构
?关系的定义和性质
?关系数据库的基本概念
?关系运算
返回 139
2.1 关系模型
?关系模型就是用 二维表格 结构来表示实体及实
体之间联系的模型 。
?关系模型是各个关系的框架的集合, 即关系模
型是一些 表格的格式, 其中包括关系名, 属性
名, 关键字等 。
?例如, 教学数据库中教师与课程的关系模型如
图 2.1所示 。
?教师关系T
?课程关系 C 授课关系 SC
TNO
教师号
TN
姓名
SEX
性别
AGE
年龄
PROF
职称
SAL
工资
COMM
岗位津贴
DEPT
系别
CNO
课程号
CN
课程名
CT
课时
TNO
教师号
CNO
课程号
返回 140
?从各个关系的框架中, 我们可以很容易看出哪
两个关系之间有 联系 。 例如,
?教师关系和授课关系有公共的属性, 教师号,, 则
表明这两个关系有联系 。
?而课程关系和授课关系有公共的属性, 课程号,,
则表明这两个关系也有联系 。
?至于元组之间的联系, 则与具体的数据有关 。 只有
在公共属性上具有相同属性值的元组之间才有联系 。
返回 141
?由上例可以看出, 在一个关系中可以存放两类
信息,
?一类是描述实体本身的信息
?一类是描述实体 ( 关系 ) 之间的联系的信息
?在层次模型和网状模型中, 把有联系的实体
( 元组 ) 用指针链接起来, 实体之间的联系是
通过 指针 来实现的 。
?而关系模型则采用不同的思想, 即用 二维表 来
表示实体与实体之间的联系, 这就是关系模型
的本质所在 。
?所以, 在建立 关系模型 时, 只要把的所有的实
体及其属性用关系框架来表示, 同时把实体之
间的关系也用关系框架来表示, 就可以得到一
个关系模型 。
返回 142
2.2 关系的定义
?在关系模型中, 数据是以二维表的形式存在的,
这个 二维表 就叫做 关系 。
?关系理论 是以 集合代数 理论为基础的, 因此,
我们可以用集合代数给出二维表的, 关系, 定
义 。
?为了从集合论的角度给出关系的定义, 我们先
引入 域 和 笛卡尔积 的概念 。
返回 143
2.2.1 域 ( Domain)
?域是一组具有相同数据类型的值的集合, 又称
为 值域 。 ( 用 D表示 )
?例如整数, 实数, 字符串的集合 。
?域中所包含的值的个数称为域的 基数 ( 用 m表
示 ) 。
?关系中用域表示属性的取值范围 。 例如,
?D1={李力, 王平, 刘伟 } m1=3
?D2={男, 女 } m2=2
?D3={47,28,30} m3=3
?其中, D1,D2,D3为域名, 分别表示教师关系中姓
名, 性别, 年龄的集合 。
?域名无排列次序, 如 D2={男, 女 }={女, 男 }
返回 144
2.2.2 笛卡尔积 (Cartesian Product)
?给定一组域 D1,D2,…, Dn( 它们可以包含相
同的元素, 即可以完全不同, 也可以部分或全部
相同 ) 。 D1, D2, …, Dn 的笛卡尔积 为
D1× D2× …… × Dn={ ( d1, d2, …, dn )
|di∈ Di,i=1,2,…, n}。
?由定义可以看出, 笛卡尔积也是一个 集合 。
其中,
?1,元素中的每一个 di叫做一个分量 (Component),来自
相应的域 ( di∈ Di)
?2,每一个元素 ( d1,d2,d3,…, dn) 叫做一个 n元组
( n-tuple), 简称 元组 ( Tuple) 。 但元组不是 di的集
合, 元组的每个分量 ( di) 是按序排列的 。 如,
?( 1,2,3) ≠( 2,3,1) ≠( 1,3,2) ;
?而集合中的元素是没有排序次序的, 如 ( 1,2,3) =
返回 145
?3,若 Di( i=1,2,…… n) 为有限集, Di中的集合元
素个数称为 Di的 基数, 用 mi( i=1,2,…… n) 表示,
则笛卡尔积 D1× D2× …… × Dn的基数 M( 即元素
( d1,d2,…… dn) 的个数 ) 为所有域的基数的累乘
之积, 即
?
? M=
?例如:上述表示教师关系中姓名, 性别两个域的笛
卡尔积为,
?D1× D2={( 李力, 男 ), ( 李力, 女 ), ( 王平,
男 ), ( 王平, 女 ), ( 刘伟, 男 ), ( 刘伟,
女 ) }
?其中,
?李力, 王平, 刘伟, 男, 女都是分量
?( 李力, 男 ), ( 李力, 女 ) 等是元组
其基数 ×
?
?
n
i
im
1
返回 146
?4,笛卡尔积可用二维表的形式表示 。
?例如, 上述的 6个元组可表示成表 2.1。
表 2.1 D1和 D2的笛卡尔积
?由上例可以看出, 笛卡尔积实际是一个二维表, 表
的框架由域构成, 表的任意一行就是一个元组, 表
中的每一列来自同一域, 如第一个分量来自 D1,第
二个分量来自 D2。
姓名
性别
李力

李力

王平

王平

刘伟

刘伟

返回 147
2.2.3 关系 ( Relation)
?笛卡尔积 D1× D2× … × Dn的任一子集称为定
义在域 D1, D2, … Dn 上的 n 元 关系
( Relation), 可用 R( D1,D2…… Dn) 表示
?如上例 D1× D2笛卡尔积的子集可以构成教师关系
T1,如下表,
姓名
性别
李力

王平

刘伟

返回 148
几点说明,
1,R为关系名, n称为关系的目或度 ( Degree) 。
?当 n=1时, 称为 单元 关系 。
?当 n=2时, 称为 二元 关系 。
?…
?当 n=n时, 称为 n元 关系 。
?如上例为二元关系, 关系名为 T。
返回 149
2,该子集中的元素是关系中的元组, 用 r表示, 关系中元组
个数是关系的基数 。 如 ( 李力, 男 ), ( 王平, 女 ),
( 刘伟, 男 ) 为三个元组, 关系T的基数为 3。
?如果一个关系的元组个数是无限的, 则称为无限关系;
?如果一个关系的元组个数是有限的, 则称为有限关系 。
?由于计算机存储系统的限制, 我们一般不去处理无限关系, 而只
考虑有限关系 。
3,同样可以把关系看成一个二维表 。 其中,
?( 1) 表的框架由域 Di( i=1,2,…… n) 构成;
?( 2) 表的任意一行对应一个元组;
?( 3) 表的每一列来自同一域;
?( 4) 域可以相同, 为了加以区别, 每列起一个名字, 称为 属性,
n目关系有 n个属性, 属性的名字唯一, 属性的取值范围 Di( i=1,
2,…, n) 称为 值域
?( 5) 具有相同关系框架的关系成为同类关系, 例如, 有另一
个关系 T2,如表 2.3所示,
? T1和 T2是同类关系 。
姓名
性别
张雪

张兰

返回 150
4,数学上关系是笛卡尔积的任意子集, 但在实际
应用中关系是笛卡尔积中所取的有意义的子集 。
例如在表 2.1中选取一个子集构成如下关系, 显
然不符合实际情况
在关系模型中, 关系 可进一步定义为,
?定义在域 D1,D2,…… Dn( 不要求完全相异 ) 上
的关系由关系头 ( Heading) 和关系体 ( Body) 组
成 。
?关系头,由属性名 A1,A2,…, An的集合组成,
每个属性 Ai正好对应一个域 Di( i=1,2,…, n),
关系头, 也称关系框架, 相对固定, 是关系的数据
结构的描述 。
姓名
性别
李力

李力

返回 151
?尽管 关系 与 二维表格, 传统的 数据文件 是非常
类似的, 但它们之间又有重要的区别 。
?严格地说, 关系 是种规范化了的 二维表中行的
集合, 为了使相应的数据操作简化, 在关系模
型中, 对关系作了种种 限制, 关系具有如下特
性,
?1,关系中不允许出现相同的元组 。 因为数学上集合
中没有相同的元素, 而关系是元组的集合, 所以作
为集合元素的元组应该是唯一的 。
?2,关系中元组的顺序 ( 即行序 ) 是无关紧要的, 在
一个关系中可以任意交换两行的次序 。 因为集合中
的元素是无序的, 所以作为集合元素的元组也是无
序的 。 根据关系的这个性质, 可以改变元组的顺序
使其具有某种排序, 然后按照顺序查询数据, 可以
2.3 关系的性质
返回 152
?3,关系中属性的顺序是无关紧要的, 即列的顺序可
以任意交换 。 交换时, 应连同属性名一起交换, 否
则将得到不同的关系 。
?例如:关系 T1作如下交换时, 无任何影响, 如
下表所示,性别
姓名

李力

王平

刘伟
返回 153
?而作如下交换时,不交换属性名,只交换属性
列中的值,则得到不同的关系,如下表,
姓名
性别

李力

王平

刘伟
返回 154
?4,同一属性名下的各个属性值必须来自同一个域,
是同一类型的数据 。
?5,关系中各个属性必须有不同的名字, 不同的属性
可来自同一个域, 即它们的分量可以取自同一个域 。
?例如, 有如下表中关系, 职业与兼职是两个不
同的属性, 但它们取自同一个域职业= { 教师,
工人, 辅导员 } 。
姓名
职业
兼职
张强
教师
辅导员
王丽
工人
教师
刘宁
教师
辅导员
返回 155
?6,关系中每一分量必须是不可分的数据项, 或者说
所有属性值都是原子的, 即是一个确定的值, 而不
是值的集合 。 属性值可以为空值, 表示, 未知, 或
,不可使用,, 即不可, 表中有表, 。 满足此条件
的关系称为 规范化关系, 否则称为 非规范化关系 。
? 例如, 在表 2.8中, 籍贯含有省, 市/县两项, 出现了
,表中有表, 的现象, 则为非规范化关系, 而把籍贯
分成省, 市/县两列, 将其规范化, 如表 2.9所示 。
表 2.8 表 2.9
姓名
籍贯
姓名

市/县

市/县
张强
吉林
长春
张强
吉林
长春
王丽
山西
大同
王丽
山西
大同
返回 156
2.4.1 候选键与关系键
?能唯一标识关系中元组的属性或属性集, 则称
该属性或属性集为 候选键 (Candidate Key),也
称 候选关键字 或 候选码 。 如,
?,学生关系, 中的学号能唯一标识每一个学生,
则属性 学号 是学生关系的候选键 。
?在, 选课关系, 中, 只有属性的组合, 学号 +课
程号, 才能唯一地区分每一条选课记录, 则属
性集, 学号 +课程号, 是选课关系的候选键 。
2.4 关系的键
返回 157
下面给出候选键的形式化定义,
?设关系 R有属性 A1,A2,…… An,其属性集
K=( Ai,Aj,…… Ak), 当且仅当满足下列
条件时, K被称为候选键,
? 1,唯一性 ( Uniqueness),关系 R的任意两个不同
元组, 其属性集 K的值是不同的 。
?2.最小性 ( Minimally),组成关系键的属性集 ( Ai,
Aj,…… Ak) 中, 任一属性都不能从属性集 K中删
掉, 否则将破坏唯一性的性质
?例如:, 学生关系, 中的每个学生的学号是唯一的,
,选课关系, 中, 学号 +课程号, 的组合也是唯一
的 。 对于属性集, 学号 +课程号, 去掉任一属性,
都无法唯一标识选课记录 。
返回 158
?如果一个关系中有多个候选键, 可以从中选择
一个作为查询, 插入或删除元组的操作变量,
被选用的候选键称为 主关系键 (Primary Key),
或简称为 主键, 主码, 关系键, 关键字 。
?例如, 假设在学生关系中没有重名的学生, 则, 学
号, 和, 姓名, 都可作为学生关系的候选键 。 如果
选定, 学号, 作为数据操作的依据, 则, 学号, 为
主关系键 。
?主关系键是关系模型中的一个重要概念 。 每个
关系必需选择一个主关系键, 选定以后, 不能
随意改变 。 每个关系必定有且仅有一个主关系
键, 因为关系的元组无重复, 至少关系的所有
属性的组合可作为主关系键, 通常用较小的属
性组合作为主关系键 。
返回 159
2.4.2 主属性与非码属性
?主属性 ( Prime Attribute),包含在主码中的
的各属性称为主属性 。
?非码属性 ( Non-Prime Attribute),不包含在
任何候选码中的属性称为非码属性 。
?在最简单的情况下, 一个候选码只包含一个属
性, 如学生关系中的, 学号,, 教师关系中的
,教师号, 。
?在最极终端的情况下, 所有属性的组合是关系
的候选码, 这时称为 全码 ( all-key) 。
返回 160
?下面是一个全码的例子,
?假设有教师授课关系 TCS,分别有三个属性教师
( T), 课程 ( C) 和学生 ( S) 。 一个教师可以讲
授多门课程, 一门课程可以为多个教师讲授, 同样
一个学生可以选听多门课程, 一门课程可以为多个
学生选听 。
?在这种情况下, T,C,S三者之间是多对多关系,
(T,C,S)三个属性的组合是关系 TCS的候选码, 称为
全码, T,C,S都是主属性 。
返回 161
2.4.3 外部关系键
?如果关系 R2的一个或一组属性 X不是 R2的主码,
而是另一关系 R1的主码, 则该属性或属性组 X
称为关系 R2的 外部关系键 或 外码 ( Foreign
key) 。 并称关系 R2为 参照关系 (referencing
relation),关系 R1为 被参照关系 (referenced
relation)。
?例 2.1 假设在 图 1.12所示的教学数据库中增加一
个系别关系 D,包含两个属性 系别 ( DEPT)
和 地址 ( ADDR),, 系别, 是此关系的主码,
而, 系别, 并不是学生关系和教师关系的主码,
所以, 系别, 是学生关系和教师关系的外部关
系键 。
返回 162
?例 2.2 如图 1.12所示的选课关系中的, 学号, 属
性与学生关系的主码, 学号, 相对应,, 课程
号, 属性与课程关系的主码, 课程号, 相对应,
因此,, 学号, 和, 课程号, 属性是选课关系
的 外部关系键 。 学生关系和课程关系为 被参照
关系, 选课关系为 参照关系 。
?由外部关系键的定义可知, 被参照关系的主码
和参照关系的外码必须定义在同一个域上 。
?如选课关系中的, 学号, 与学生关系的主码, 学号,
定义在同一个域上,, 课程号, 属性与课程关系的
主码, 课程号, 定义在同一个域上 。
返回 163
2.4.4 关系模型的完整性
?为了维护数据库中数据与现实世界的一致性,
对关系数据库的插入, 删除和修改操作必须有
一定的约束条件, 这就是关系模型的三类完整
性,
?实体完整性
?参照完整性
?用户定义的完整性
1,实体完整性 (Entity Integrity)
?实体完整性 是指主关系键的值不能为空或部分
为空。
?关系模型中的一个元组对应一个实体,一个关
系则对应一个实体集。
返回 164
?现实世界中的实体是可区分的, 即它们具有某
种唯一性标识 。 与此相对应, 关系模型中以主
关系键来唯一标识元组 。
?例如, 学生关系中的属性, 学号, 可以唯一标识一个
元组, 也可以唯一标识学生实体 。
?如果主关系键中的值为空或部分为空, 即主属
性为空, 则不符合关系键的定义条件, 不能唯
一标识元组及与其相对应的实体 。 这就说明存
在不可区分的实体, 从而与现实世界中的实体
是可以区分的事实相矛盾 。 因此 主关系键的值
不能为空或部分为空 。
?例如, 学生关系中的主关系键, 学号, 不能为空;选
课关系中的主关系键, 学号 +课程号, 不能部分为空,
即, 学号, 和, 课程号, 两个属性都不能为空 。
返回 165
2,参照完整性 (Referential integrity)
?如果关系 R2的外部关系键 X与关系 R1的主关系
键相符,则 X的每个值或者等于 R1中主关系键的
某一个值, 或者取空值 。
?在例 2.1系别关系中的属性, 系别, 是学生关系
外部关系键 。
?如图 2.2所示, 学生关系中某个学生 ( 如 s1或 s2)
,系别, 的取值, 必须在参照的系别关系中主关系
键, 系别, 的值中能够找到, 否则表示把该学生分
配到一个不存在的部门中, 显然不符合语义 。
?如果某个学生 ( 如 s11), 系别, 取空值, 则表示该
学生尚未分配到任何一个系 。 否则, 它只能取专业
关系中某个元组的专业号值 。
返回 166
S(学生关系) D(系别关
系)
图 2.2 学生表和系别表
SNO
学号
SN
姓名
SEX
性别
AGE
年龄
DEPT
所在系
DEPT
所在系
ADDR
地址
S1
赵亦

17
计算机
计算机
1号楼
S2
钱尔

18
信息
信息
1号楼

自动化
2号楼
S11
王威

19
返回 167
?在例 2.2中, 如果按照参照完整性规则, 选课关
系中的外部关系键, 学号, 和, 课程号, 可以
取空值或者取被参照关系中已经存在的值 。 但
由于, 学号, 和, 课程号, 是选课关系中主属
性, 根据实体完整性规则, 两个属性都不能为
空 。 所以 选课关系中的外部关系键, 学号, 和
,课程号, 中能取被参照关系中已经存在的值 。
?实体完整性 和 参照完整性 是关系模型必须满足
的完整性约束条件, 被称作 关系的两个不变性 。
任何关系数据库系统都应该支持这两类完整性 。
?除此之外, 不同的关系数据库系统由于应用环
境的不同, 往往还需要一些特殊的约束条件,
这就是 用户定义完整性 。
返回 168
3,用户定义完整性 ( User-defined Integrity)
?用户定义完整性 是针对某一具体关系数据库的
约束条件 。
?它反映某一具体应用所涉及的数据必须满足的
语义要求 。
?例如, 属性值根据实际需要, 要具备一些约束
条件, 如选课关系中成绩不能为负数;某些数
据的输入格式要有一些限制等关系模型应该提
供定义和检验这类完整性的机制, 以便用统一
的, 系统的方法处理它们, 而不要由应用程序
承担这一功能 。
返回 169
2.5.1 关系模式和关系数据库模式
?一个关系的属性名的集合 R(A1,A2,…… An)叫
做 关系模式 。 其中,
?R 为关系名, A1, A2, …, An 为属性名
(i=1,2,…… n)。
?由定义可以看出, 关系模式是关系的框架, 或
者称为表 框架, 指出了关系由哪些属性构成,
是对关系结构的描述 。
?一组关系模式的集合叫做 关系数据库模式 。
2.5 关系数据库模式与关系数据库
返回 170
?关系数据库模式 是对关系数据库结构的描述,
或者说是对关系数据库框架的描述, 也就是前
面所讲过的关系头, 可以看作是关系的型 。 与
关系数据库模式对应的数据库中的当前值就是
关系数据库的内容, 称为 关系数据库的实例,
即前面所讲过的关系体, 可以看作是关系的值 。
?例如, 在图 1.12所示的教学数据库中, 共有五
个关系, 其关系模式分别为,
?学生 ( 学号, 姓名, 性别, 年龄, 系别 )
?教师 ( 教师号, 姓名, 性别, 年龄, 系别 )
?课程 ( 课程号, 课程名, 课时 )
?选课 ( 学号, 课程号, 成绩 )
?授课 ( 教师号, 课程号 )
返回 171
?在每个关系中,又有其相应的数据库的实例
?例如:与学生关系模式对应的数据库中的实例有如
下 6个元组,
S1
赵亦

17
计算机
S2
钱尔

18
信息
S3
孙珊

20
信息
S4
李思

21
自动化
S5
周武

19
计算机
S6
吴丽

20
自动化
返回 172
2.5.2 关系数据库
?关系数据库 是, 一组随时间变化, 具有各种度
的规范化关系的集合, 。
?因为关系是由 关系头 和 关系体 组成的, 所以关
系数据库也可以看作是一组关系头和关系体的
集合 。
?由此可见, 关系数据库也有 型 和 值 的概念, 其
型就是关系数据库模式, 相对固定;其值就是
关系数据库内容, 代表现实世界中的实体, 而
实体是随着时间不断变化的, 所以其值在不同
的时刻会有所变化 。
返回 173
?例如,图 1.12所示的教学数据库是五个关系的
集合, 或者说是五个关系头和五个关系体的集
合 。
?其中, 各个关系头相对固定, 而关系体的内容, 会
随时间而变化 。
?比如, 学生和教师的年龄随时间而增长, 教师的工
资和岗位津贴也会发生变化 。
返回 174
?关系模型与其他模型相比,最有特色的是它的
数据库语言 。
?这种语言灵活方便、表达能力和功能都很强。
?目前关系数据库所使用的语言一般都具有 定义,
查询, 更新 和 控制 一体化的特点,而 查询 是最
主要的部分。
?所以说,关系数据库的核心部分是 查询,故又
称为 查询语言,而查询的条件要使用 关系运算
表达式 来表示。
?因此,关系运算是设计关系数据语言的基础。
?按表达查询的方法不同,关系运算可分为 关系
代数 和 关系演算 两大类。
2.6 关系代数
返回 175
2.6.1 关系代数的分类及其运算符
?关系代数是对关系进行集合代数运算, 是基于
关系代数的操作语言, 称为 关系代数语言, 简
称关系代数 。
?它是由 IBM在一个实验性的系统上实现的, 称为
ISBL(Information System Base Language)语言 。
?ISBL的每个语句都类似于一个关系代数表达式 。
?关系代数的 运算对象 是 关系, 运算结果 也是 关
系, 关系代数用到的运算符主要包括四类,
?集合运算符, ∪ ( 并 ), -( 差 ), ∩( 交 ), X
( 广义笛卡尔积 ) ;
?专门的关系运算符, σ(选择 ),∏( 投影 ), ∞( 连
接 ), *( 自然连接 ), ÷ ( 除 ) ;
?算术比较运算符, >( 大于 ), ≥( 大于等于 ), <
( 小于 ), ≤( 小于等于 ), =( 等于 ), ≠( 不等
返回 176
关系代数的运算按运算符的不同主要分为两类,
?传统的集合运算,把关系看成元组的集合, 以
元组作为集合中元素来进行运算, 其运算是从
关系的, 水平, 方向即行的角度进行的 。 包括
并, 差, 交和笛卡尔积等运算 。
?专门的关系运算,不仅涉及行运算, 也涉及列
运算, 这种运算是为数据库的应用而引进的特
殊运算 。 包括选取, 投影, 连接和除法等运算 。
返回 177
2.6.2 传统的集合运算
?对两个关系的集合运算传统的集合运算是二目
运算, 是在两个关系中进行的 。 但是并不是任
意的两个关系都能进行这种集合运算, 而是要
在两个满足一定条件的关系中进行运算 。 那么,
对关系有什么要求呢? 下面先看一个定义 。
?定义 2.9 设给定两个关系 R,S,若满足,
( 1 ) 具有相同的度 n;
( 2 ) R中第 i个属性和 S中第 i个属性必须来自同
一个域 。 则说关系 R,S是相容的 。
?除笛卡尔积外, 要求参加运算的关系必须满足
上述的相容性定义 。
返回 178
1,并 ( Union)
?关系 R和关系 S的并由属于 R或属于 S的元组
组成, 即 R和 S的所有元组合并, 删去重复元
组, 组成一个新关系, 其结果仍为 n目关系 。
记作,
? R∪ S={t|t∈ R∨ t∈ S}
?对于关系数据库, 记录的插入和添加可通过
并运算实现 。
2,差 ( Difference)
?关系 R与关系 S的差由属于 R而不属于 S的所
有元组组成, 即 R中删去与 S中相同的元组,
组成一个新关系, 其结果仍为 n目关系 。 记
作,
返回 179
3,交 ( Intersection)
?关系 R与关系 S的交由既属于 R又属于 S的元
组组成, 即 R与 S中相同的元组, 组成一个新
关系, 其结果仍为 n目关系 。 记作,
? R∩S={t|t∈ Rt∈ S}
?如果两个关系没有相同的元组, 那么它们的
交为空 。
?两个关系的并和差运算为基本运算 ( 即不能
用其他运算表达的运算 ), 而交运算为非基
本运算, 交运算可以用差运算来表示,
? R∩S=R-(R-S)
返回 180
4,广义笛卡尔积 ( Extended Cartesian
Product)
?两个分别为 n目和 m目关系 R和 S的广义笛卡
尔积是一个 ( n+m) 列的元组的集合, 元组
的前 n列是关系 R的一个元组, 后 m列是关系
S的一个元组 。 若 R有 k1个元组, S有 k2个元
组, 则关系 R和关系 S的广义笛卡尔积有
k1*k2个元组, 记作
? R× S={tr⌒ ts| tr∈ R,∧ ts∈ S}
?关系的广义笛卡尔积可用于两关系的连接操
作 ( 连接操作将在一节中介绍 ) 。
返回 181
?【 例 4】 如图 2.4(a),(b)所示的两个关系 R
与 S为相容关系, (c)为 R与 S 的并, (d)为 R与
S的交, (e)为 R与 S的差, (f)为 R与 S的广义笛
卡尔积 。
R S
(a) (b)
A
B
C
A
B
C
a1
b1
c1
a1
b1
c1
a1
b1
c2
a2
b2
c1
a2
b2
c1
a2
b3
c2
返回 182
R∪ S R-S
(c) (d)
R∩S
( e)
A
B
C
A
B
C
a1
B1
c1
a1
b1
c2
a1
B1
c2
a2
B2
c1
a2
B3
c2
A
B
C
a1
B1
c1
a2
B2
c1
返回 183
R× S
A
B
C
A
B
C
a1
b1
c1
a1
b1
c1
a1
b1
c1
a2
b2
c1
a1
b1
c1
a2
b3
c2
a1
b1
c2
a1
b1
c1
a1
b1
c2
a2
b2
c1
a1
b1
c2
a2
b3
c2
a2
b2
c1
a1
b1
c1
a2
b2
c1
a2
b2
c1
a2
b2
c1
a2
b3
c2
( f)
图 2.4 传统的集合运算
返回 184
2.6.3 专门的关系运算
? 由于传统的集合运算, 只是从行的角度进行,
而要灵活地实现关系数据库多样的查询操作,
必须引入专门的关系运算 。
? 在讲专门的关系运算之前, 为叙述上的方便
先引入几个概念 。
? ( 1) 设关系模式为 R(A1,A2,…… An),它的
一个关系为 R,t∈ R表示 t是 R的一个元组,
t[Ai]则表示元组 t中相应于属性 Ai的一个分
量 。
返回 185
?( 2 ) 若 A={Ai1,Ai2,……, Aik}, 其中
Ai1,Ai2,……,Aik是 A1,A2,……, An中的一部分,
则 A 称 为 属 性 列 或 域 列, ? 则 表 示
{A1,A2,……, An}中去掉 {Ai1,Ai2,……, Aik}
后 剩 余 的 属 性 组 。
t[A]={t[Ai1],t[Ai2],……,t[Aik]}表示元组 t在属
性列 A上诸分量的集合 。
?( 3) R为 n目关系, S为 m目关系, tr∈ R,
ts∈ S,trts称为元组的连接 (concatenation),它
是一个 n+m列的元组, 前 n个分量为 R的一个
n元组, 后 m个分量为 S中的一个 m元组 。
?( 4)给定一个关系 R( X,Z),X和 Z为属
性组,定义当 t[X]=x时,x在 R中的象集
(image set),为 Zx={t[Z]|t∈ R,t[X]=x},它表示
R中的属性组 X上值为 x的诸元组在 Z上分量
的集合。
返回 186
1,选取 ( Selection)
?选取运算是单目运算, 是根据一定的条件在给
定的关系 R中选取若干个元组, 组成一个新关
系, 记作,
?σF(R)={t|t∈ R∧ F(t)为真 }
?其中, σ为选取运算符, F为选取的条件, 它由
运算对象 ( 属性名, 常数, 简单函数 ), 算术
比较运算符 ( >, ≥,<,≤,=,≠) 和逻辑运
算符 ( ∨ ∧ ┐) 连接起来的逻辑表达式, 结果
为逻辑值, 真, 或, 假, 。
?选取运算实际上是从关系 R中选取使逻辑表达
式为真的元组, 是从行的角度进行的运算 。
返回 187
以下例题均是以图 1.12所示的五个关系为例进行
运算 。
例 2.4 查询计算机系的全体学生 。
?σDEPT=?计算机 ’ (S)或
?σ5=?计算机 ’ (S)( 其中 5为 DEPT的属性序号 )
?结果右图所示 。 SNO SN SEX AGE DEPT
S1
赵亦

17
计算机
S5
周武

19
计算机
返回 188
例 2.5 查询工资高于 1000元的男教师 。
?σ(SAL>1000) ∧ (SEX=?男 ’ ) (T)
?结果如图所示 。
?注意:字符型数据的值应该使用单引号括起来,
例如, ‘ 计算机 ’, ‘ 男 ’ 。
TNO
TN
SEX
AGE
PROF
SAL
COMM
DEPT
T1
李力

47
教授
1500
3000
计算机
返回 189
2,投影 ( Projection)
?投影运算也是单目运算, 关系 R上的投影是从
R中选择出若干属性列, 组成新的关系, 即对
关系在垂直方向进行的运算, 从左到右按照指
定的若干属性及顺序取出相应列, 删去重复元
组 。 记作,
?ΠA(R)={t[A]|t∈ R}
?其中 A为 R中的属性列, Π为投影运算符 。
?从其定义可看出,投影运算是从列的角度进行
的运算,这正是选取运算和投影运算的区别所
在。选取运算是从关系的水平方向上进行运算
的,而投影运算则是从关系的垂直方向上进行
的。
返回 190
例 2.6 查询教师的姓名及其职称 。
?ΠTN,TNO,PROF(T)或
?Π2,1,5(T)
?( 其中 2,1,5分别为 TN,TNO和 PROF的属性
序号 )
?结果右图所示
?上例表明,
投影运算可以改变
关系的属性次序
TN
TNO
PROF
李力
T1
教授
王平
T2
讲师
刘伟
T3
讲师
张雪
T4
教授
张兰
T5
副教授
返回 191
例 2.7 查询教师关系中有哪些系 。
?ΠDEPT(T)
?结果如右图所示
?由例 2.7可以看出, 投影后取消了某些属性列后,
就可能出现重复行, 应该取消这些完全相同的
行 。 所以投影之后, 不但减少了属性, 元组也
可能减少, 新关系与原关系不相容 。
DEPT
计算机
信息
自动化
返回 192
例 2.8 查询讲授 C5课程的教师号 。
?ΠTNO(σCNO=?C5?(TC))
?结果如右图所示 。
?本例中选取运算和投影运算相结合, 先在授课
表中选取满足条件的元组, 再于 TNO属性上进
行投影 。
TNO
T2
T3
T5
返回 193
3,连接 ( Join)
?连接运算是二目运算, 是从两个关系的笛卡尔
积中选取满足连接条件的元组, 组成新的关系 。
?设关系 R( A1,A2,……A n)及 S
( B1,B2,……B m),连接属性集 X包含于
{A1,A2,……A n},及 Y包含于 {B1,B2,……B m},X
与 Y中属性列数目相等,且相对应属性有共同
的域。 [若 Z={A1,A2……A n}/X (/X:去掉 X之外
的属性 ) 及 W={B1,B2……B m}/Y,则 R及 S可表示
为 R(Z,X),S(W,Y)] 关系 R和 S在连接属性 X
和 Y上的连接,就是以 R× S笛卡尔积中,选取
X属性列上的分量与 Y属性列上的分量满足给
定 θ比较条件的那些元组,也就是在 R× S上选
取在连接属性 X,Y上满足 θ条件的子集,组成新
的关系。新关系的度为 n+m。
返回 194
记作,R∞S={t r⌒ ts |tr∈ R∧ ts∈ S∧ tr[X]θts[Y]为
真 }
XθY
?其中, ∞是连接运算符, θ为算术比较运算符,
也称 θ连接;
?XθY为连接条件;
?θ为, =”时, 称为等值连接;
?θ为, <”时, 称为小于连接;
?θ为, >”时, 称为大于连接 。
?连接运算为非基本运算, 可以用选取运算和广
义笛卡尔积运算来表示,
?R∞S=σxθy(R× S)
返回 195
?在连接运算中, 一种最常用的连接是自然连接 。
?所谓自然连接就是在等值连接的情况下, 当连
接属性 X与 Y具有相同属性组时, 把在连接结
果中重复的属性列去掉 。 即如果 R与 S具有相同
的属性组 Y,则自然连接可记作,
?R*S={t r⌒ ts |tr∈ R∧ ts∈ S∧ tr[Y]=ts[Y]}
?自然连接是在广义笛卡尔积 R× S中选出同名属
性上符合相等条件元组, 再进行投影, 去掉重
复的同名属性, 组成新的关系 。
返回 196
例 2.9 如图 2.9(a),(b)所示的两个关系 R与 S,(c)
为 R和 S的大于连接 ( C>D), (d)为 R和 S的等
值连接 ( C=D ), (e)为 R和 S的等值连接
( R.B=S.B), (f)为 R和 S的自然连接 。
R S
(a) (b)
A
B
C
B
D
a1
b1
2
b1
5
a1
b2
4
b2
6
a2
b3
6
b3
7
a2
b4
8
b3
8
返回 197
大于连接( C>D) 等值连接( C=D)
(c) (d)
A
R.B
C
S.B
D
A
R.B
C
S.B
D
a2
b3
6
b1
5
a2
b3
6
b2
6
a2
b4
8
b1
5
a2
b4
8
b3
8
a2
b4
8
b2
6
a2
b4
8
b3
7
返回 198
等值连接 (R.B=S.B) 自然连接
(e) (f)
图 2.9 连接运算举例
A
R.B
C
S.B
D
A
B
C
D
a1
b1
2
b1
5
a1
b1
2
5
a1
b2
4
b2
6
a1
b2
4
6
a2
b3
6
b3
7
a2
b3
6
7
a2
b3
6
b3
8
a2
b3
6
8
返回 199
结合上例, 我们可以看出 等值连接与自然连接的
区别,
?1,等值连接中不要求相等属性值的属性名相同,
而自然连接要求相等属性值的属性名必须相同,
即两关系只有在同名属性才能进行自然连接 。
如上例 R中的 C列和 S中的 D列可进行等值连接,
但因为属性名不同, 不能进行自然连接 。
?2,等值连接不将重复属性去掉, 而自然连接去
掉重复属性, 也可以说, 自然连接是去掉重复
列的等值连接 。 如上例 R中的 B列和 S中的 B列进
行等值连接时, 结果有两个重复的属性列 B,而
进行自然连接时, 结果只有一个属性列 B。
返回 200
例 2.10 查询讲授数据库课程的教师姓名 。
?ΠTN(σCN=?数据库 ’ (C)*ΠTNO,CNO(TC)*ΠTNO,TN(T))

?ΠTN(ΠTNO(σCN=?数据库 ’ (C)*TC)*ΠTNO,TN(T))
?结果如右图所示 。
TN
王平
刘伟
张兰
返回 201
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]。
?除法运算为非基本运算, 可以表示为,
?R÷ S=Πx(R)- Πx(Πx(R)× S- R)
返回 202
例 2.11 已知关系 R和 S,如图 2.11(a),(b)所示,
则 R÷ S如图 (c)所示 。
?与 除 法 的 定 义 相 对 应, 本 题 中
X={A,B}={(a1,b2),(a2,b4),(a3,b5)},
Y={C,D}={(c3,d5),(c4,d6)},Z={F}={f3,f4}。 其
中, 元组在 X上各个分量值的象集分别为,
?(a1,b2)的象集为 {(c3,d5),(c4,d6)}
?(a2,b4)的象集为 {(c1,d3)}
?(a3,b5)的象集为 {(c2,d8)}
?S在 Y上的投影为 {(c3,d5),(c4,d6)}
?显然只有 (a1,b2)的象集包含 S在 Y上的投影,所
以 R÷ S={(a1,b2)}
返回 203
R S
R÷ S
(a) (b)
(c)
图 2.11
A
B
C
D
E
C
D
F
A
B
a
1
b
2
c
3
d
5
e
1
c
3
d
5
f
3
a
1
b
2
a
1
b
2
c
4
d
6
e
1
c
4
d
6
f
4
a
2
b
4
c
1
d
3
e
3
a
3
b
5
c
2
d
8
e
4
返回 204
?除法运算同时从行和列的角度进行运算, 适合
于包含, 全部, 之类的短语的查询 。
例 2.12 查询选修了全部课程的学生学号和姓名 。
?ΠSNO,CNO(SC)÷ ΠCNO(C)*ΠSNO,SN(S)
返回 205
? 关系演算是以数理逻辑中的谓词演算为基础
的, 通过谓词形式来表示查询表达式 。
? 根据谓词变元的不同, 可将关系演算分为元
组关系演算和域关系演算 。
2.7.1 元组关系演算语言
? 元组关系演算 是以元组变量作为谓词变元的
基本对象。
? 元组关系演算语言的典型代表是 E.F.Codd提
出的 ALPHA语言,这种语言虽然没有实际实
现,但较有名气,INGRES关系数据库上使用
的 QUEL语言,就是在 ALPHA语言的基础上
研制的。
? 这里主要介绍 ALPHA语言和 QUEL语言
2.7 关系演算
返回 206
2.7.1.1 ALPHA语言
?ALPHA语言是以 谓词公式 来定义查询要求的 。
在谓词公式中存在客体变元, 这里称为 元组变
量 。
?元组变量是一个变量, 其变化范围为某一个命
名的关系 。
?ALPHA语言的基本格式是,
?<操作符 > <工作空间名 > (<目标表 >)[:<操作条件 >]
?操作符 有 GET,PUT,HOLD,UPDATE,
DELETE,DROP等到种 。
?工作空间 是指内存空间, 可以用一个字母表示,
通常用 W表示, 也可以用别的字母表示 。 工作
空间是用户与系统的通信区 。
?目标表 用于指定操作 ( 如查询, 更新等 ) 出来
的结果, 它可以是关系名或属性名, 一答操作
语句可以同时对多个关系或多个属性进行操作 。
返回 207
?操作条件 是用谓词公式表示的逻辑表达式, 只
有满足此条件的元组才能进行操作, 这是一个
可选项, 缺省时表示无条件执行操作符规定的
操作 。 除此之外, 还可以在基本格式上加上排
序要求, 定额要求等 。
下面以教学数据库 ( 图 1.12) 为例, 说明 ALPHA语言
的使用 。
1,数据查询
( 1) 简单查询
例 查询所有学生的数据 。
?GET W (S)
?GET语句的作用是把数据库中的数据读入内存
空间 W,目标表为学生关系 S,代表查询出来
的结果, 即所有的学生 。
返回 208
例 2.13 查询所有被选修的课程号码 。
?GET W (SC.CNO)
?目标表为选课关系 SC中的属性 CNO,代表所
有被选修的课程号码,查询结果自动消去重复行 。
( 2) 条件查询
?由冒号后面的逻辑表达式给出查询条件, 在表
达式中可以使用如下三类运算符,
?① 比较运算符,>,≥,<,≤,=等于, ≠;
?② 逻辑运算符,∧ ( 与 ),∨ ( 或 ),┐( 非 )
?③ 表示执行次序的括号,( )
?其中, 比较运算符的优先级高于逻辑运算符,
可以使用 ( ) 改变它们的优先级 。
返回 209
例 2.14 查询计算机系工资高于 1000元的教师的姓
名和工资 。
?GET W (T.TN,T.SAL):T.DEPT=? 计算
机 ’ ∧ T.SAL>1000
?目标表为教师关系 T中的两个属性 SN和 SAL组
成的属性列表 。
( 3) 排序查询
例 2.15 查询 S3同学所选课程号及成绩, 并按成绩
降序排列 。
?GET W (SC.CNO,SC.SCORE):SC.SNO=?S3?DOWN
SC.SCORE
?DOWN表示降序, 后面紧跟排序的属性名 。
?升序排列时使用 UP。
返回 210
( 4) 定额查询
例 2.15 查询一名男教师的教师号和姓名 。
?GET W (1) (T.TNO,T.TN):T.SEX=?男 ’
?所谓的定额查询就是通过在 W后面的括号中加
上定额数量, 限定查询出元组的个数 。
?这里 (1)表示查询结果中男教师的个数, 取出教
师表中第一个男教师的教师号和姓名 。
?排序和定额查询可以一起使用 。
例 2.16 查询一名男教师的教师号和姓名, 并使他
的年龄最小 。
?GET W (1) (T.TNO,T.TN):T.SEX=?男 ’ UP T.AGE
?此语句的执行过程为:先查询所有男教师的教
师号和姓名,再按照年龄由小到大排序,然后
找出第一位,也就是年龄最小的男教师。
返回 211
( 5) 带元组变量的查询
?所谓的 元组关系演算 就是以元组变量作为谓词
变元的基本对象, 在关系演算的查询操作时,
可以在相应的关系上定义元组变量 。
?元组变量 代表关系中的元组, 其取值是在所定
义的关系范围内变化, 所以也称作范围变量
Range Variable,一个关系可以设多个元组变量 。
例 2.17 查询 S3同学所选课程号 。
?RANGE SC X
?GET W (X.CNO):X.SNO=?S3?
?使用 RANGE来说明元组变量, X为关系 SC上
的元组变量 。
?如果关系的名字很长, 使用起来不方便, 这时
可以设一个名字较短的元组变量来代替关系名,
简化关系名, 使操作更加方便 。
返回 212
( 6) 带存在量词的查询
例 2.18 查询 S3同学所选课程名 。
?RANGE SC X
?GET W (C.CN):?X(C.CNO=X.CNO∧ X.SNO=?S3?)
?注意:操作条件中使用量词时必须用元组变量 。
例 2.19 查询至少选修一门其课时数为 80的课程的
学生的姓名 。
?RANGE C CX
? SC SCX
?GET W
(S.SN):?SCX(SCX.SNO=S.SNO∧ ?CX(CX.CNO=SC
X.CNO∧ CX.CT=80))
返回 213
?此查询涉及三个关系, 需要对两个关系 ( C和
SC) 作用存在量词, 所以用了两个元组变量 。
?此语句的执行过程为:先查询课时数为 80的课
程号, 再根据找到的课程号在关系 SC中查询其
对应的学号, 然后根据为些学号在关系 S中找到
对应的学生姓名 。
例 2.20 查询选修全部课程的学生姓名 。
?RANGE C CX
? SC SCX
?GET W
(S.SN):?CX?SCX(XSC.SNO=S.SNO∧ CX.CNO=SCX
.CNO)
返回 214
( 7) 库函数查询
?库函数也称集函数 。 用户在使用查询语言时,
经常要作一些简单的运算 。
?例如要统计某个关系中符合某一条件的元组数,
或某些元组在某个属性上分量的和, 平均值等
等 。
?在关系数据库语言中提供了有关这类运算的标
准函数, 增强了基本检索能力 。
?常用的库函数下表所示
函数名称
功能
AVG
按列计算平均值
TOTAL
按列计算值的总和
MAX
求一列中的最大值
MIN
求一列中的最小值
COUNT
按列值计算元组个数
返回 215
例 2.21 求学号为 S1学生的平均分 。
?GET W (AVG(SC.SCORE):S.SNO=?S1?
例 2.22 求学校共有多少个系
?GET W (COUNT(S.DEPT))
?COUNT函数自动消去重复行, 可计算字段
,DEPT“不同值的数目 。
2,数据更新
?更新操作包括修改, 插入和删除 。
( 1) 修改
?修改操作使用 UPDATE语句实现, 具体操作分
为以下三步,
返回 216
① 读数据:使用 HOLD语句将要修改的元组从数
据库中读到工作空间中;
② 修改:利用宿主语言修改工作空间中元组的属
性;
③ 送回:使用 UPDATE语句将修改后的元组送回
数据库中 。
?这里 HOLD语句是带上并发控制的 GET语句。
例 2.23 把刘伟教师转到信息系 。
?HOLD W(T.DEPT):T.TN=?刘伟 ’
?MOVE ?信息 ’ TO W.DEPT
?UPDATE W
?在 ALPHA语言中, 不允许修改关系的主码,
例如不能使用 UPDATE语句修改教师表 T中的
教师号 。
?如果要修改主码, 应该先使用删除操作删除该
返回 217
( 2) 插入
?插入操作使用 PUT语句实现, 具体操作分为以
下两步,
① 建立新元组:利用宿主语言在工作空间中建立
新元组;
② 写数据:使用 PUT语句将元组写入到指定的关
系中 。
例 2.24 在 SC表中插入一条选课记录 ( S6,C1,
85) 。
?MOVE S6 TO W.SNO
?MOVE C1 TO W.CNO
?MOVE 85 TO W.SCORE
?PUT W(SC)
返回 218
?PUT语句的作用是把工作空间 W中的数据写到
数据库中, 此例即把已经在工作空间建立的一
条选课记录写入到选课关系 SC中 。
?注意,PUT语句只能对一个关系进行操作, 在
插入操作时, 拒绝接受主码相同的元组 。
( 3) 删除
?ALPHA语言中的删除操作不但可以删除关系
中的一些元组, 还可以删除一个关系 。
?删除操作使用 DELETE语句实现, 具体操作分
为以下两步,
?① 读数据:使用 HOLD语句将要删除的元组从数据
库中读到工作空间中;
?② 删除:使用 DELETE语句删除该元组 。
返回 219
例 2.25 删除学号为 S6的学生的信息 。
?HOLD W(S):S.SNO=?S6?
?DELETE W
例 2.26 删除全部学生的信息 。
?HOLD W(S)
?DELETE W
2.7.1.2 QUEL语言
?INGRES是加利福尼亚大学研制的关系数据库
管理系统, QUEL语言是 INGRES系统的查询
语言, 它以 ALHPA语言为基础, 具有较为完
善的数据定义, 数据查询, 数据更新, 数据控
制等功能 。
?QUEL语言既可以作为独立的语言进行交互式
返回 220
1,数据定义
?QUEL语言可以使用 CREATE语句定义一个新
关系, CREATE语句的一般格式为,
?CREATE <关系名 > (<属性名 =数据类型及长度 >[,<
属性名 =数据类型及长度 >… ])
例 2.27 定义学生关系 S
?CREATE S
? (SNO=C8, SN=C20, AGE=I3,
SEX=C2,DEPT=C20)
?关系定义后可以由定义者撤消, 撤消关系使用
语句 DESTROY
?例如, 撤消学生关系 S可以写成,DESTROY S。
返回 221
2,数据查询
?查询语句的一般格式为,
?RANGE OF t1 IS R1
?RANGE OF t2 IS R2
?……
?RANGE OF tk IS Rk
?RETRIEVE( 目标表 )
?WHERE <条件 >
返回 222
?其中 t1,t2,… tk分别是定义在关系 R1,R2、
Rk上的元组变量 。
?目标表为查询的目标属性 。
?查询条件是一个逻辑表达式, 在表达式中可以
使用如下三类运算符,
?① 比较运算符,>( 大于 ), ≥( 大于等于 ), <
( 小于 ), ≤( 小于等于 ), =( 等于 ), ≠( 不等
于 ) ;
?② 逻辑运算符,AND( 与 ),OR( 或 ),NOT( 非 )
?③ 表示执行次序的括号,( )
?其中,比较运算符的优先级高于逻辑运算符,
可以使用()改变它们的优先级。
返回 223
例 2.28 查询计算机系工资高于 1000元的教师的姓
名和工资 。
?RANGE OF TX IS T
?RETRIEVE (TX.TN,TX.SAL)
?WHERE TX.DEPT=?计算机 ’ ∧ TX.SAL>1000
例 2.29 查询讲授 C5课程的教师的姓名 。
?RANGE OF TX IS T
?RANGE OF TCX IS TC
?RETRIEVE (TX.TN)
?WHERE TX.TNO=TCX.TNO AND TCX.CNO=?C5?
返回 224
3,数据更新
( 1) 修改
?修改操作使用 REPLACE语句实现 。
例 2.30 把刘伟教师转到信息系 。
?RANGE OF TX IS T
?REPLACE( TX.DEPT= ?信息 ’ )
?WHERE TX.TN=?刘伟 ’
( 2) 插入
?插入操作使用 APPEND语句实现 。
例 2.31 在 SC表中插入一条选课记录 ( S6,C2,
80) 。
?APPEND TO SC(SNO=?S6?, CNO=?C2?,
SCORE=80)
返回 225
( 3) 删除
?删除操作使用 DELETE语句实现 。
例 2.32 删除学号为 S6的学生的信息 。
?RANGE OF SX IS S
?DELETE SX
?WHERE SX.SNO=?S6?
2.7.2 域关系演算语言 QBE
?域关系演算是关系演算的另一种形式 。
?域关系演算是以元组变量的分量即域变量作为
谓词变元的基本对象 。
?域关系演算语言的典型代表是 1975年由 IBM公
司约克城高级研究试验室的 M.M.Zloof提出的
QBE语言, 该语言于 1978年在 IBM370上实现 。
返回 226
?QBE是 Query By Example的缩写, 也称为示例
查询, 它是一种很有特色的屏幕编辑语言, 其
特点如下,
( 1) 以表格形式进行操作
?每一个操作都由一个或几个表格组成, 每一个表格
都显示在终端的屏幕上, 用户通过终端屏幕编辑程
序以填写表格的方式构造查询要求, 查询结果也以
表格的形式显示出来, 所以它具有直观和可对话的
特点 。
( 2) 通过例子进行查询
?通过使用一些实例, 使该语言更易于为用户接受和
掌握 。
( 3) 查询顺序自由
?当有多个查询条件时,不要求使用者按照固定的思
路和方式进行查询,使用更加方便。
返回 227
使用 QBE语言的步骤,
( 1) 用户根据要求向系统申请一张或几张表格,
显示在终端上;
( 2) 用户在空白表格的左上角的一栏内输入关
系名;
( 3) 系统根据用户输入的关系名, 将在第一行
从左至右自动填写各个属性名;
( 4)用户在关系名或属性名下方的一格内填写
相应的操作命令,操作命令包括,P.(打印或
显示),U.(修改),I.(插入),D.(删
除)。如果要打印或显示整个元组时,应将
,P”填在关系名的下方,如果只需打印或显示
某一属性,应将,P”填在相应属性名的下方。
返回 228
?表格形式如表 2.2所示
表 2.2 QBE操作框架表
关系名
属性 1
属性 2

属性 n
操作命令
属性值或
查询条件
属性值或
查询条件

属性值或
查询条件
返回 229
2.7.2.1 数据查询
1,简单查询
例 2.33 显示全部学生的信息 。
?方法一:将 P.填在关系名的下方
?方法二:将, P”填在各个属性名的下方
S
SNO
SN
SEX
AGE
DEPT
P,
S
SNO
SN
SEX
AGE
DEPT
P.赵亦
P.女
P.17
P.计算机
返回 230
?注意:只有目标属性包括所有的属性时, 将 P.
填在关系名的下方 。
?这种语言之所以称为示例查询, 就是在操作中
采取, 示例, 的方法, 凡用作示例的元素, 其
下方均加下划线 。 如上例中的, 赵亦,,, 女,
等均为示例元素, 即域变量 。 示例元素是所给
域中可能的一个值, 而不必是查询结果中的元
素 。 比如用作示例的学生姓名, 可以不是学生
表中的学生, 只要给出任意一个学生名即可 。
返回 231
2,条件查询
例 2.34 查询所有女学生的姓名。
?目标属性只有姓名, 所以将 P.填在关系名的下
方 。
?查询条件中可以使用比较运算符 >,≥,<,≤,
=和 ≠,其中 =可以省略 。 本例的查询条件是
SEX=?女 ’,, =”被省略 。
S
SNO
SN
SEX
AGE
DEPT
P.赵亦

返回 232
例 2.35 查询年龄大于 18岁的女学生的姓名 。
?本例的查询条件是 AGE>18和 SEX=?女 ’ 两个
条件的, 与, 。 在 QBE中, 表示两个条件的
,与, 有两种方法,
?方法一:把两个条件写在同一行上,
?方法二:把两个条件写在不同行上,但必须使
用相同的示例元素
S
SNO
SN
SEX
AGE
DEPT
P.赵亦

>18
S
SNO
SN
SEX
AGE
DEPT
P.赵亦

P.赵亦
>18
返回 233
例 2.36 查询既选修了 C1号课程又选修了 C2号课
程的学生的学号 。
?本例的查询条件是 CNO=?C1?和 CNO=?C2?两
个条件的, 与,, 但两个条件涉及同一属性
CNO,则必须把两个条件写在不同行上, 且使
用相同的示例元素 。
例 2.37 查询年龄大于 18岁或者女学生的姓名 。
?本例的查询条件是 AGE>18和 SEX=?女 ’ 两个
条件的, 或, 。 在 QBE中, 表示两个条件的
,或,, 要把两个条件写在不同行上, 且必须
使用不同的示例元素 。
S
SNO
SN
SEX
AGE
DEPT
P.赵亦

P.钱尔
>18
返回 234
例 2.38 查询选修 C1号课程学生的姓名 。
?本查询涉及两个关系,S和 SC,这两个关系具
有公共的属性 SNO,SNO作为连接属性, 把具
有相同的 SNO值的两个关系连接起来, SNO在
两个表中的值要相同 。
S
SNO
SN
SEX
AGE
DEPT
S1
P.赵亦
SC
SNO
CNO
SCORE
S1
C1
返回 235
例 2.39 查询未选修 C1号课程学生的姓名 。
?查询条件中的“未选修”需使用逻辑非来表示。
QBE中的逻辑非运算符为 ┐,填写在关系名下
方。
?如果 S1同学选修 C1号课程的情况为假,则符合
查询的条件,显示 S1同学的学号,然后再查询
其他同学。
S
SNO
SN
SEX
AGE
DEPT
S1
P.赵亦
SC
SNO
CNO
SCORE

S1
C1
返回 236
3,排序查询
例 2.39 查询全体女教师的教师号和姓名, 要求查
询结果按工资升序排列, 工资相同者按年龄降
序排列 。
?对查询结果按照某个属性值升序排列时, 则在
相应的属性下方填入, AO”,降序排列时, 填
入, DO”。
?如果按照多个属性值同时排序, 则用, AO(i)”
或, DO(i)”表示, 其中 I为排序的优先级, I值
越小, 优先级越高 。
T
TNO
TN
SEX
AGE
DEPT
PROF
SAL
COMM
DEPT
S1
P.赵亦

DO(2)
AO(1)
返回 237
4,库函数查询
?同 ALPHA语言类似, QBE语言也提供了一些
有关运算的标准函数, 以方便用户 。
?QBE常用的库函数如表 2.2所示
表 2.2 QBE常用的库函数及其功能
函数名称
功能
AVG
按列计算平均值
SUM
按列计算值的总和
MAX
求一列中的最大值
MIN
求一列中的最小值
CNT
按列值计算元组个数
返回 238
例 2.40 求学号为 S1学生的平均分。
SC
SNO
CNO
SCORE
S1
P.AVG.ALL
返回 239
2.7.2.2 数据更新
1,修改
?修改的命令为 U,
例 2.41 把刘伟教师转到信息系。
T
TNO
TN
SEX
AGE
DEPT
PROF
SAL
COMM
DEPT
U,
刘伟
信息
返回 240
2,插入
?插入的命令为 I,
例 2.42 在 SC表中插入一条选课记录 ( S6,C1) 。
?注意:新插入的元组必须具有主码值, 其他属
性值可以为空, 如本例中的 SCORE为空 。
SC
SNO
CNO
SCORE
I,
S6
C1
返回 241
3,删除
?删除的命令为 D,
例 2.43 删除 S1同学选修 C1课程的信息 。
SC
SNO
CNO
SCORE
D,
S1
C1
返回 242
小 结
?关系数据库系统 是目前使用最广泛的数据库系
统,本书的重点也是讨论关系数据库系统。
?本章系统地介绍了关系数据库的一些基本概念,
其中包括关系模型的数据结构、关系的完整性
及其关系操作。
?结合实例详细介绍了关系代数和关系演算两种
关系运算,讲解了关系代数、元组关系演算语
言( ALPHA,QUEL)和域关系演算语言( QBE)
的具体使用方法。
?这些概念及方法对理解本书的内容非常重要。
返回 243
第 3章 SQL语言
返回 244
本章概要
?SQL是结构化查询语言( Structured Query
Language)的缩写,其功能包括数据查询、数
据操纵、数据定义和数据控制四个部分。
?SQL 语言简洁、方便实用、功能齐全,已成为
目前应用最广的关系数据库语言。
?本章要求
?了解 SQL语言的特点,
?掌握 SQL语言的四大功能及使用方法,
?重点掌握其数据查询功能及其使用。
返回 245
3.1 SQL语言的基本概念与特点
3.1.1 SQL语言的发展及标准化
? 3.1.1.1 SQL语言发展史
SQL语言是当前最为成功, 应用最为广泛的关系
数据库语言, 其发展主要经历了以下几个阶段,
1,1974 年由 CHAMBERLIN 和 BOYEE 提出, 当时称为
SEQUEL(STUCTURED ENGLISH QUERY LANGUAGE);
2,IBM公司对其进行了修改, 并用于其 SYSTEM R关系数据库
系统中;
3,1981年 IBM推出其商用关系关系数据库 SQL/DS,并将其名
字改为 SQL,由于 SQL语言功能强大,简洁易用,因此得到
了广泛的使用;
4,今天广泛应用于各种大型数据库, 如 SYBASE,INFORMIX,
ORACLE,DB2,INGRES等, 也用于各种小型数据库, 如
FOXPRO,ACCESS。
返回 246
? 3.1.1.2 SQL语言标准化
随着关系数据库系统和 SQL语言应用的日
益广泛, SQL语言的标准化工作也在紧张革
进行着, 十多年来已制订了多个 SQL标准;
? 1,1982 年, 美国国家标准化局 ( AMERICAN
NATIONAL STANDARD INSTITUTE,简称 ANSI) 开
始制定 SQL标准;
? 2,1986年, 美国国家标准化协会公布了 SQL语言的第
一个标准 SQL86;
? 3,1987年, 国际标准化组织 ( ISO) 通过了 SQL86标准;
? 4,1989年, 国际标准化组织 ( ISO) 对 SQL86进行了补
充, 推出了 SQL89标准;
? 5,1992年, ISO又推出了 SQL92标准, 也称为 SQL2;
? 6,目前 SQL99( 也称为 SQL3) 在起草中, 增加了面向
对象的功能 。
返回 247
3.1.2 SQL语言的基本概念
?首先介绍两个基本概念:基本表和视图 。
?基本表 ( BASE TABLE),是独立存在的表,
不是由其它的表导出的表 。 一个关系对应一个
基本表, 一个或多个基本表对应一个存储文件 。
?视图 ( VIEW),是一个虚拟的表, 是从一个
或几个基本表导出的表 。 它本身不独立存在于
数据库中, 数据库中只存放视图的定义而不存
放视图对应的数据, 这些数据仍存放在导出视
图的基本表中 。 当基本表中的数据发生变化时,
从视图中查询出来的数据也随之改变 。
返回 248
?例如,学生数据库中有学生基本情况表
STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT
),此表为基本表,对应一个存储文件。可以
在其基础上定义一个男生基本情况表
STUDENT_MALE(SNO,SNAME,SAGE,SDEP
T),
?它是从 STUDENT中选择 SSEX=?男’的各个行,然
后在 SNO,SNAME,SAGE,SDEPT上投影得到的。
?在数据库中只存有 STUDENT_MALE的定义, 而
STUDENT_MALE的记录不重复存储 。
?在用户看来, 视图 是通过不同路径去看一个实际表,
就象一个窗口一样, 我们通过窗户去看外面的高楼,
可以看到高楼的不同部分, 而透过视图可以看到数
据库中自己感兴趣的内容 。
返回 249
SQL
视图 1 视图 2
基本表 1 基本表 2 基本表 3 基本表 4
存储文件 1 存储文件 2
外模式
模式
内模式
图 3.1 SQL语言支持的关系数据库的三级逻辑结构
?SQL语言支持数据库的三级模式结构,如图 3.1所示。
其中 外模式 对应于视图和部分基本表,模式 对应于基
本表,内模式 对应于存储文件。
返回 250
3.1.3 SQL语言的主要特点
1,SQL语言类似于英语的 自然语言, 简洁易用 。
2,SQL语言是一种 非过程语言, 即用户只要提出
,干什么, 即可, 不必管具体操作过程, 也不
必了解数据的存取路径, 只要指明所需的数据
即可 。
3,SQL语言是一种 面向集合 的语言, 每个命令的
操作对象是一个或多个关系, 结果也是一个关
系 。
4,SQL语言既是 自含式语言, 又是 嵌入式语言 。
可独立使用, 也可嵌入到宿主语言中 。
? 自含式语言可以独立使用交互命令, 适用于终端用
户, 应用程序员和 DBA;
? 嵌入式语言使其嵌入在高级语言中使用, 供应用程
返回 251
5,SQL语言具有,
? 数据查询( QUERY)
? 数据定义( DEFINITION)
? 数据操纵( MANIPULATION)
? 数据控制( CONTROL)
四种语言一体化的功能。
下面以 SQL SERVER 为例分别介绍其各个功能。各例
题中所用的基本表如 图 1.12所示。
返回 252
3.2 SQL数据定义
?SQL 语 言 使 用 数 据 定 义 语 言 ( DATA
DEFINITION LANGUAGE,简称 DDL) 实现
其数据定义功能, 可对数据库 用户, 基本表,
视图, 索引 进行定义和撤消 。
3.2.1 字段数据类型
?当用 SQL语句定义表时, 需要为表中的每一个
字段设置一个数据类型, 用来指定字段所存放
的数据是整数, 字符串, 货币或是其它类型的
数据 。
?SQL SERVER 的数据类型有很多种, 分为以
下 9类,
?1,整数数据类型,依整数数值的 范围大小, 有 BIT,
INT,SMALLINT,TINYINT四种 。
?2,精确数值类型,用来定义可带小数部分的数字,
有 NUMERIC和 DECIMAL两种 。 二者相同, 但建议
返回 253
?3,近似浮点数值数据类型,当数值的位数太多时, 可
用此数据类型来取其近似值, 用 FLOAT和 REAL两种 。
如,1.23E+10
?4,日期时间数据类型,用来表示日期与时间, 依时间
范 围 与 精 确 程 度 可 分 为 DATETIME 与
SMALLDATETIME两种 。 如,1998-06-08 15:30:00
?5,字符串数据类型,用来表示字符串的字段 。 包括:
CHAR,VARCHAR,TEXT三种, 如:, 数据库,
?6,UNICODE字符串数据类型,UNICODE是双字节文
字编码标准, 包括 NCHAR,NVARCHAR与 NTEXT三
种 。 与字符串数据类型相类似, 但 UNICODE的一个
字符用 2字节存储, 而一般字符数据用一个字节存储 。
?7,二进制数据类型,用来定义二进制码的数据 。 有:
BINARY,VARBINARY,IMAGE 三种, 通常用十六
进制表示:如,OX5F3C
返回 254
?8,货币数据类型,用来定义与货币有关的数据, 分
为 MONEY 与 SMALLMONEY两种, 如,123.0000
?9,标记数据类型,有 UNIQUEIDENTIFIER,
TIMESTAMP两种, 此数据类型通常系统自动产生,
而不是用户输入的, TIMESTAMP记录数据更新的
时间戳印, 而 UNIQUEIDENTIFIER用来识别每一笔
数据的唯一性 。
?各种数据类型的有关规定如下表,
数据
类型
数据内容与范围
占用的字节
BIT
0,1,NULL
实际使用 1BIT,但会
占用 1BYTE,若一个
数据中有数个 BIT字段,
则可共占 1个 BYTE
返回 255
INT
-2^31到 2^31-1
4BYTES
SMALLINT
-2^15至 2^15-1
2BYTES
TINYINT
0至 255
1BYTES
NUMERIC
-10^38-1至 10^38-1
1-9位数使用 5BYTES
10-19位数使用 9BYTES
20-28位数使用 13BYTES
29-38位数使用 17BYTES
DECIMAL
-10^38-1至 10^38-1
5-17BYTES因长度而异,
与 NUMERIC相同
FLOAT
-1.79E+306 至
1.79E+308,最多可表
示 53位数
8BYTES
REAL
-3.40E+38 到 3.40E+38,
最多可表示 24位数
4BYTES
返回 256
DATETIME
1753/1/1至 9999/12/31
8BYTES
SMALLDATETIME
1900/1/1至 2079/6/6
4BYTES
CHAR
1-8000个字符
1个字符占 1B,尾端空
白字符保留
VARCHAR
1-8000个字符
1个字符占 1B,尾端空
白字符删除 。
TEXT
2^31-1个字符
1个字符占 2B,最大可
存储 2GB
NCHAR
1-4000个字符
1个字符占 2B,尾端空
白字符保留
NVARCHAR
1-4000个字符
1个字符占 2B,尾端空
白字符删除
返回 257
NTEXT
2^30-1个字符
1个字符占 2B,最大可
存储 2GB
BINARY
1-8000个字符
在存储时, SQL
SERVER会另外增加 4B,
尾 端空白字符会保留
VARBINARY
1-8000个字符
在存储时, SQL
SERVER会另外增加 4B,
尾 端空白字符会删除
IMAGE
2^31-1个字符
最大可存储 2GB
MONEY
-2^63-2^63-1
8B
SMALLMONEY
-2^31-2^31-1
4B
TIMESTAMP
16进制
8B
UNIQUEIDENTIFIER
全局唯一标识符
( GUID)
可用 NEWID()函数生成
一个该种类型的字段值 。
返回 258
3.2.2 定义, 修改和撤消数据库的用户
3.2.2.1 建立数据库用户
?数据库用户 是指能够登录到数据库, 并能够对
数据库进行存取操作的用户 。
?当 SQL SERVER系统安装完毕后, 数据库管理
员就可以通过 CREATE USER语句建立其他数
据库用户了 。
?语法格式为,
CREATE USER <用户名 > IDENTIFIED BY
<口令 >
?<用户名 >指定数据库用户的帐号名字, 即用户标识符,
?<口令 >指用户登录到数据库系统时使用的口令,
?这里的用户名和口令可以与用户登录到操作系统时所
返回 259
?例 3.1 建立一个新用户, 其名称为 ZHANGSAN,
登录口令为 123。
CREATE USER ZHANGSAN IDENTIFIED
BY 123
3.2.2.2 更改数据库用户的口令
?数据库用户最初的口令是由数据库管理员指定
的, 数据库用户可以用 ALTER USER命令来更
改它,
?ALTER USER语句的基本语法格式为,
?ALTER USER <用户名 > IDENTIFIED BY <口令 >
?例 3.2 将用户 ZHANGSAN的口令改为 456。
ALTER USER ZHANGSAN IDENTIFIED
返回 260
3.2.2.3 删除用户
?随着数据库应用的发展和变化, 数据库的用户
也会发生变化 。
?如果某些数据库用户不再需要使用数据库, 数
据库管理员就可以使用 DROP USER把该用户
删掉,
?DROP USER 语句的基本语法格式为,
DROP USER <用户名 >
?例 3.3 删除用户 ZHANGSAN
DROP USER ZHANGSAN
?注意:删除数据库用户之前应首先删除该用户
建立的数据库对象, 包括基本表, 视图, 索引
返回 261
3.2.2 建立数据库
CREATE DATABASE <数据库名 >
3.2.3 创建, 修改和删除数据表
3.2.3.1 创建数据表
? 数据表是关系数据库的基本组成单位, 它物
理地存储于数据库的存储文件中 。
1,创建一个数据表时主要包括以下几个组成部分,
? ( 1) 字段名 ( 列名 ),字段名可长达 128个字符 。
字段名可包含 中文, 英文字母, 下划线, #号, 货
币符号 ( ¥ ) 及 AT符号 (@)。 同一表中不许有重
名列;
? ( 2) 字段数据类型,见表 3.2;
? ( 3) 字段的长度, 精度和小数位数 ;
返回 262
① 字段的长度,指字段所能容纳的最大数据量, 但
对不同的数据类型来说, 长度对字段的意义可能
有些不同 。
?对字符串与 UNICODE数据类型而言, 长度代表字段 所
能容纳的字符的数目, 因此它会限制用户所能输入的
文本长度 。
?对数值类的数据类型而言, 长度则代表字段 使用多少
个字节来存放数字 。
?对 BINARY,VARBINARY,IMAGE数据类型而言,
长度代表字段 所能容纳的字节数 。
② 精度和小数位数
?精度 是指数中数字的位数, 包括小数点左侧的整数部
分和小数点右侧的小数部分;
?小数位数 则是指数字小数点右侧的位数 。
?例如:数字 12345.678,其精度为 8,小数位数为 3;
?所以只有 数值类 的数据类型才有必要指定精度和小数
位数 。
返回 263
?经常以如下所示的格式来表示数据类型以及它
所采用的长度, 精度和小数位数, 其中的 N代
表长度, P代表精度, S表示小数位数 。
?BINARY(N) -------- BINARY(10)
?CHAR(N) -------- CHAR(20)
?NUMERIC(P,[S]) ------- NUMERIC(8,3)
?但有的数据类型的精度与小数位数是固定的,
对采用此类数据类型的字段而言, 不需设置精
度与小数位数,
?如:如果某字段采用 INT数据类型, 其长度固定是 4,
精度固定是 10,小数位数则固定是 0,这表示字段
将能存放 10位数没有小数点的整数 。 存储大小则是
4个字节 。
( 4) NULL值与 DEFAULT值
?DEFAULT值 表示某一字段的默认值, 当没有
输入数据时, 则使用此默认的值 。
返回 264
2,创建数据表的 SQL语法格式
?在 SQL语言中, 使用语句 CREATE TABLE创
建数据表, 其基本语法格式为,
CREATE TABLE <表名 >(<列定义 >[{,<列定义 >|<表
约束 >}])
?<表名 >是合法标识符, 最多可有 128个字符, 如
S,SC,C,不允许重名 。
?<列定义 >,<列名 ><数据类型 >[DEFAULT] [{<列
约束 >}]
? DEFAULT:若是某字段设置有默认值, 当该字段未被输入数据
时, 则以该默认值自动填入该字段 。
返回 265
?例 3.4 建立一学生表
?USE STUDENT
?CREATE TABLE S
?(SNO CHAR(8),
?SN VARCHAR(20),
?AGE INT,
?SEX CHAR(2) DEFAULT '男 ',
?DEPT VARCHAR(20));
?执行该语句后, 便产生了学生基本表的表框架,
此表为一个空表 。
?其中, SEX列的缺省值为, 男, 。
返回 266
3,定义完整性约束
?上列为创建基本表的最简单形式, 还可以对表进
一步定义, 如 主键, 空值 的设定, 使数据库用户
能够根据应用的需要对基本表的定义做出更为精
确和详尽的规定 。
?在 SQL SERVER中, 对于基本表的约束分为 列约
束 和 表约束 。
?列约束是对某一个特定列的约束, 包含在列定义中, 直
接跟在该列的其他定义之后, 用 空格 分隔, 不必指定列
名;
?表约束与列定义相互独立, 不包括在列定义中, 通常用
于对多个列一起进行约束, 与列定义用 ’,?分隔, 定义
表约束时必须指出要约束的那些列的名称 。 完整性约束
的基本语法格式为,
[ CONSTRAINT <约束名 > ] <约束类型 >
?约束名,约束不指定名称时, 系统会给定一个名
称 。
返回 267
?约束类型,在定义完整性约束时必须指定完整性约
束的类型 。
?在 SQL SERVER中可以定义五种类型的完整性约束,
下面分别加以介绍,
( 1) NULL/NOT NULL
?是否允许该字段的值为 NULL。
?NULL值不是 0也不是空白,更不是填入字符串,NULL”,
而是表示“不知道”、“不确定”或“没有数据”的意思。
?当某一字段的值一定要输入才有意义的时候,则可以设置
为 NOT NULL。
?如主键列就不允许出现空值,否则就失去了唯一标识一条
记录的作用
?只能用于定义列约束,
?其语法格式如下,
[CONSTRAINT <约束名 > ][NULL|NOT NULL]
返回 268
例 3.5 建立一个 S表,对 SNO字段进行 NOT
NULL约束。
?USE STUDENT
?CREATE TABLE S
?(SNO CHAR(10) CONSTRAINT S_CONS NOT
NULL,
?SN VARCHAR(20),
?AGE INT,
?SEX CHAR(2) DEFAULT ?男 ’,
?DEPT VARCHAR(20));
?当 SNO为空上时,系统给出错误信息,无 NOT
NULL约束时,系统缺省为 NULL。
?其中 S_CONS为指定的约束名称,当约束名称
省略时,系统自动产生一个名字。如下列功能
同上,只是省略约束名称。
返回 269
?USE STUDENT
?CREATE TABLE S
?(SNO CHAR(10) NOT NULL,
?SN VARCHAR(20),
?AGE INT,
?SEX CHAR(2) DEFAULT '男 ',
?DEPT VARCHAR(20));
返回 270
( 2) UNIQUE约束
?UNIQUE约束用于指明基本表在某一列或多个列
的组合上的取值必须唯一。
?定义了 UNIQUE约束的那些列称为 唯一键,系统
自动为唯一键建立唯一索引,从而保证了唯一键
的唯一性。
?唯一键允许为空,但系统为保证其唯一性,最多
只可以出现一个 NULL值。
?UNIQUE既可用于列约束,也可用于表约束。
?UNIQUE用于定义列约束 时,其语法格式如下,
[CONSTRAINT <约束名 >] UNIQUE
?例 3.6 建立一个 S表,定义 SN为唯一键。
?USE STUDENT
?CREATE TABLE S
?(SNO CHAR(6),
?SN CHAR(8) CONSTRAINT SN_UNIQ UNIQUE,
?SEX CHAR(2),
返回 271
?其中 SN_UNIQ为指定的约束名称,约束名称
可以省略,
?如下例,
?USE STUDENT
?CREATE TABLE S
?(SNO CHAR(6),
?SN CHAR(8) UNIQUE,
?SEX CHAR(2),
?AGE NUMERIC(2));
?UNIQUE用于定义 表约束 时,其语法格式如下,
[CONSTRAINT <约束名 >] UNIQUE( <列名 >[{,<
列名 >}])
返回 272
例 3.7 建立一个 S表,定义 SN+SEX为唯一键。
?USE STUDENT
?CREATE TABLE S
?( SNO CHAR(5),
?SN CHAR(8),
?SEX CHAR(2),
?CONSTRAINT S_UNIQ UNIQUE(SN,SEX));
?系统为 SN+SEX建立唯一索引,确保同一性别
的学生没有重名。
( 3) PRIMARY KEY约束
?PRIMARY KEY约束用于定义基本表的主键,
起唯一标识作用,其值不能为 NULL,也不能
重复,以此来保证实体的完整性。
返回 273
?PRIMARY KEY与 UNIQUE约束类似,通过建
立唯一索引来保证基本表在主键列取值的唯一
性,但它们之间存在着很大的 区别,
?①在一个基本表中只能定义一个 PRIMARY KEY约
束,但可定义多个 UNIQUE约束;
?②对于指定为 PRIMARY KEY的一个列或多个列的
组合,其中任何一个列都不能出现空值,而对于
UNIQUE所约束的唯一键,则允许为空。
?注意:不能为同一个列或一组列既定义
UNIQUE约束,又定义 PRIMARY KEY约束。
?PRIMARY KEY既可用于列约束,也可用于表
约束。
?PRIMARY KEY用于定义 列约束 时,其语法格
式如下,
返回 274
?例 3.8 建立一个 S表,定义 SNO为 S的主键
?USE STUDENT
?CREATE TABLE S
?(SNO CHAR(5) NOT NULL CONSTRAINT S_PRIM
PRIMARY KEY,
?SN CHAR(8),
?AGE NUMERIC(2));
?PRIMARY KEY用于定义 表约束 时,即将某些
列的组合定义为主键,其语法格式如下,
[CONSTRAINT <约束名 >]S PRIMARY KEY (<列名
>[{<列名 >}])
返回 275
?例 3.9 建立一个 SC表,定义 SNO+CNO为 SC的
主键
?USE STUDENT
?CREATE TABLE SC
?(SNO CHAR(5) NOT NULL,
?CNO CHAR(5) NOT NULL,
?SCORE NUMERIC(3),
?CONSTRAINT SC_PRIM PRIMARY
KEY(SNO,CNO));
返回 276
( 4) FOREIGN KEY约束
?FOREIGN KEY约束指定某一个列或一组列作
为外部键,其中,包含外部键的表称为 从表,
包含外部键所引用的主键或唯一键的表称 主表 。
?系统保证从表在外部键上的取值要么是主表中
某一个主键值或唯一键值,要么取空值。以此
保证两个表之间的连接,确保了实体的参照完
整性。
?FOREIGN KEY既可用于列约束,也可用于表
约束,
?其语法格式为,
[CONSTRAINT <约束名 >] FOREIGN KEY
REFERENCES <主表名 > (<列名 >[{<
列名 >}])
返回 277
?例 3.10 建立一个 SC表,定义 SNO,CNO为 SC的
外部键。
?USE STUDENT
?CREATE TABLE SC
?(SNO CHAR(5) NOT NULL CONSTRAINT S_FORE
FOREIGN KEY REFERENCES S(SNO),
?CNO CHAR(5) NOT NULL CONSTRAINT C_FORE
FOREIGN KEY REFERENCES C(CNO),
?SCORE NUMERIC(3),
?CONSTRAINT S_C_PRIM PRIMARY KEY
(SNO,CNO));
返回 278
( 5) CHECK约束
?CHECK约束用来检查字段值所允许的范围,
如, 一个字段只能输入整数, 而且限定在 0-
100的整数, 以此来保证域的完整性 。
?CHECK既可用于列约束,也可用于表约束,
?其语法格式为,
[CONSTRAINT <约束名 >] CHECK (<条件 >)
?例 3.10 建立一个 SC表,定义 SCORE 的取值范
围为 0到 100之间。
?USE STUDENT
?CREATE TABLE SC
?(SNO CHAR(5),
?CNO CHAR(5),
?SCORE NUMERIC(5,1) CONSTRAINT
SCORE_CHK CHECK(SCORE>=0 AND SCORE
<=100));
返回 279
例 3.11 建立包含完整性定义的学生表
?USE STUDENT
?CREATE TABLE S
?(SNO CHAR(6) CONSTRAINT S_PRIM PRIMARY
KEY,
?SN CHAR(8) CONSTRAINT SN_CONS NOT NULL,
?AGE NUMERIC(2) CONSTRAINT AGE_CONS
NOT NULL
?CONSTRAINT AGE_CHK CHECK (AGE
BETWEEN 15 AND 50),
?SEX CHAR(2) DEFAULT '男 ',
?DEPT CHAR(10) CONSTRAINT DEPT_CONS NOT
NULL);
返回 280
3.2.3.2 修改基本表
?由于应用环境和应用需求的变化,经常需要修改
基本表的结构,比如,增加新列和完整性约束、
修改原有的列定义和完整性约束等。
?SQL语言使用 ALTER TABLE命令来完成这一功
能,有如下三种修改方式,
1,ADD方式
?用于增加新列和完整性约束,定义方式同
CREATE TABLE语句中的定义方式相同,其语法
格式为,
ALTER TABLE <表名 > ADD <列定义 > | <完整性约束
定义 >
?例 3.12 在 S表中增加一个班号列和住址列。
?USE STUDENT
?ALTER TABLE S
?ADD
返回 281
?注意:使用此方式增加的新列 自动填充 NULL
值,所以不能为增加的新列指定 NOT NULL约
束 。
?例 3.13 在 SC表中增加完整性约束定义,使
SCORE在 0-100之间。
?USE STUDENT
?ALTER TABLE SC
?ADD
?CONSTRAINT SCORE_CHK CHECK(SCORE
BETWEEN 0 AND 100)
返回 282
2,ALTER 方式
?用于修改某些列,其语法格式为,
ALTER TABLE<表名 >
ALTER COLUMN <列名 ><数据类型
>[NULL|NOT NULL]
?例 3.14 把 S表中的 SNO列加宽到 8位字符宽度
?USE STUDENT
?ALTER TABLE S
?ALTER COLUMN
?SNO CHAR(8)
返回 283
注意:使用此方式有如下一些限制,
①不能改变列名;
②不能将含有空值的列的定义修改为 NOT NULL约
束;
③若列中已有数据,则不能减少该列的宽度,也不
能改变其数据类型;
④只能修改 NULL|NOT NULL约束,其它类型的约
束在修改之前必须先删除,然后再重新添加修改
过的约束定义。
3.DROP方式
?删除完整性约束定义,其语法格式为,
ALTER TABLE<表名 >
DROP CONSTRAINT <约束名 >
返回 284
例 3.15 删除 S表中的 AGE_CHK约束
?USE STUDENT
?ALTER TABLE S
?DROP
?CONSTRAINT AGE_CHK
3.2.3.3 改变基本表的名字
?使用 RENAME命令,可以改变基本表的名字,
其语法格式为,
RENAME <旧表名 > TO <新表名 >
?例 3.16 将 S表的名字更改为 STUDENT
?USE STUDENT
?RENAME S TO STUDENT
返回 285
3.2.3.4 删除基本表
? 当某个基本表无用时,可将其删除。
? 删除后,该表中的数据和在此表上所建的索引都
被删除,而建立在该表上的视图不会随之删除,
系统将继续保留其定义,但已无法使用。
? 如果重新恢复该表,这些视图可重新使用。
? 删除表的语法格式,
DROP TABLE <表名 >
? 例 3.17 删除表 STUDENT
? USE STUDENT
? DROP TABLE STUDENT
? 注意:只能删除自己建立的表,不能删除其他用
户所建的表。
返回 286
3.2.5 设计、创建和维护索引
3.2.5.1 索引的作用
?在日常生活中我们会经常遇到索引,例如 图书目录, 词典索
引 等。
?借助索引,人们会很快地找到需要的东西。
?索引是 数据库随机检索 的常用手段,它实际上就是记录的关
键字与其相应地址的对应表。
?例如, 当我们要在本书中查找有关, SQL查询, 的内容时,应
该先通过目录找到, SQL查询, 所对应的页码,然后从该页码
中找出所要的信息。这种方法比直接翻阅书的内容要快。
?如果把数据库表比作一本书,则表的索引就如书的目录一样,
通过索引可大大提高查询速度。
?此外,在 SQL SERVER中,行的唯一性 也是通过建立唯一索引
来维护的。
? 索引的作用可归纳为,
?1,加快查询速度;
?2,保证行的唯一性。
返回 287
3.2.5.2 索引的分类
1,按照索引记录的存放位置可分为聚集索引与非聚
集索引
?聚集索引,按照索引的字段排列记录,并且依照排好的
顺序将记录存储在表中。
?非聚集索引,按照索引的字段排列记录,但是排列的结
果并不会存储在表中,而是另外存储。
2,唯一索引的概念
?唯一索引 表示表中每一个索引值只对应唯一的数据记录,
?这与表的 PRIMARY KEY的特性类似,因此唯一性索引
常用于 PRIMARY KEY的字段上,以区别每一笔记录。
?当表中有被设置为 UNIQUE的字段时,SQL SERVER会
自动建立一个 非聚集的唯一性索引 。
?而当表中有 PRIMARY KEY的字段时,SQL SERVER会
在 PRIMARY KEY字段建立 一个聚集索引 。
3,复合索引的概念
?复合索引 是将两个字段或多个字段组合起来建立的索引,
而单独的字段允许有重复的值。
返回 288
3.2.5.3 建立索引
?建立索引的语句是 CREATE INDEX,其语法
格式为,
CREATE [UNIQUE] [CLUSTER] INDEX <索引
名 > ON <表名 > (<列名 > [次序 ] [{,<列名 >}] [次序 ]…)
?UNIQUE表明建立唯一索引。
?CLUSTER表示建立聚集索引。
?次序用来指定索引值的排列顺序,可为 ASC(升序)
或 DESC(降序),缺省值为 ASC。
?例 3.18 为表 SC在 SNO和 CNO上建立唯一索引。
?USE STUDENT
?CREATE UNIQUE INDEX SCI ON SC(SNO,CNO)
返回 289
?执行此命令后,为 SC表建立一个索引名为 SCI
的唯一索引,
?此索引为 SNO和 CNO两列的 复合索引,即对
SC表中的行先按 SNO的递增顺序索引,对于
相同的 SNO,又按 CNO的递增顺序索引。
?由于有 UNIQUE的限制,所以该索引在
(SNO,CNO)组合列的排序上具有唯一性,不存
在重复值。
?例 3.19 为教师表 T在 TN上建立聚集索引。
CREATE CLUSTER INDEX TI ON T(TN)
?执行此命令后,为 T表建立一个索引名为 TI的
聚集索引,T表中的记录将按照 TN值的升序存
放。
返回 290
?注意,
1,改变表中的数据(如增加或删除记录)时,索引
将自动更新。
索引建立后,在查询使用该列时,系统将自动使用
索引进行查询。
2,索引数目无限制,但索引越多,更新数据的速度
越慢。对于仅用
于查询的表可多建索引,对于数据更新频繁的表则
应少建索引。
3.2.5.4 删除索引
?建立索引是为了提高查询速度,但随着索引的增
多,数据更新时,系统会花费许多时间来维护索
引。这时,应删除不必要的索引。
?删除索引的语句是 DROP INDEX,其语法格式为,
DROP INDEX 数据表名,索引名
?例 3.20 删除表 SC的索引 SCI。
返回 291
3.3 SQL数据查询
3.3.1 SELECT命令的格式与基本使用
?数据查询是数据库中最常见的操作 。
?SQL语言提供 SELECT语句, 通过查询操作可
得到所需的信息 。
?SELECT语句的一般格式为,
?SELECT〈 列名 〉 [{,〈 列名 〉 }]
?FROM〈 表名或视图名 〉 [{,〈 表名或视图名 〉 }]
?[WHERE〈 检索条件 〉 ]
?[GROUP BY <列名 1>[HAVING <条件表达式 >]]
?[ORDER BY <列名 2>[ASC|DESC]];
返回 292
?SELECT语句的格式,
?SELECT [ALL|DISTINCT][TOP N
[PERCENT][WITH TIES]]
?列名 1 [AS 别名 1]
?[,列名 2 [ AS 别名 2]… ]
?[INTO 新表名 ]
?FROM 表名 1[[AS] 表 1别名 ]
?[INNER|RIGHT|FULL|OUTER][OUTER]JOIN
? 表名 2 [[AS] 表 2别名 ]
?ON 条件
返回 293
?查询的结果是仍是一个表 。
?SELECT语句的执行过程是,
?根据 WHERE子句的检索条件, 从 FROM子句指定的
基本表或视图中选取满足条件的元组, 再按照
SELECT子句中指定的列, 投影得到结果表 。
?如果有 GROUP子句, 则将查询结果按照 <列名 1>相
同的值进行分组 。
?如果 GROUP子句后有 HAVING短语, 则只输出满足
HAVING条件的元组 。
?如果有 ORDER子句, 查询结果还要按照 <列名 2>的
值进行排序 。
返回 294
例 3.21 查询全体学生的学号, 姓名和年龄 。
SELECT SNO,SN,AGE FROM S
例 3.22 查询学生的全部信息 。
SELECT * FROM S
?用‘ * ’表示 S表的全部列名,而不必逐一列
出。
例 3.23 查询选修了课程的学生号 。
SELECT DISTINCT SNO FROM SC
?查询结果中的重复行被去掉
?上述查询均为不使用 WHERE子句的无条件查
返回 295
?另外, 利用投影查询可控制列名的顺序, 并可
通过指定 别名 改变查询结果的列标题的名字 。
例 3.24 查询全体学生的姓名, 学号和年龄 。
SELECT SNAME NAME,SNO,AGE FROM
S
?其中,NAME为 SNAME的别名
返回 296
3.3.2 条件查询
?当要在表中找出满足某些条件的行时, 则需使
用 WHERE子句指定查询条件 。
?WHERE子句中, 条件通常通过三部分来描述,
?1,列名;
?2,比较运算符;
?3,列名, 常数 。
运算符
含义
=,>,<,>=,<=,!=
比较大小
多重条件
AND,OR
BETWEEN AND
确定范围
IN
确定集合
LIKE
字符匹配
IS NULL
空值
表 3.8 常用的比较运算符
返回 297
3.3.2.1 比较大小
例 3.25 查询选修课程号为 ‘ C1?的学生的学号和
成绩 。
SELECT SNO,SCORE FROM SC WHERE
CNO=?C1?
例 3.26 查询成绩高于 85分的学生的学号, 课程号
和成绩 。
SELECT SNO,CNO,SCORE FROM SC WHERE
SCORE>85
返回 298
3.3.2.2 多重条件查询
?当 WHERE子句需要指定一个以上的查询条件
时, 则需要使用逻辑运算符 AND,OR和 NOT
将其连结成复合的逻辑表达式 。
?其 优先级 由高到低为,NOT,AND,OR,用
户可以使用括号改变优先级 。
例 3.27 查询选修 C1或 C2且分数大于等于 85分学
生的的学号, 课程号和成绩 。
?SELECT SNO,CNO,SCORE
?FROM SC
?WHERE( CNO=?C1? OR CNO=?C2?) AND
SCORE>=85
返回 299
3.3.2.3 确定范围
例 3.28 查询工资在 1000至 1500之间的教师的教师
号, 姓名及职称 。
?SELECT TNO,TN,PROF
?FROM T
?WHERE SAL BETWEEN 1000 AND 1500
?等价于
?SELECT TNO,TN,PROF
?FROM T
?WHERE SAL>=1000 AND SAL<=1500
返回 300
例 3.29 查询工资不在 1000至 1500之间的教师的教
师号, 姓名及职称 。
?SELECT TNO,TN,PROF
?FROM T
?WHERE SAL NOT BETWEEN 1000 AND 1500
3.2.2.4 确定集合
?利用, IN”操作可以查询属性值属于指定集合
的元组 。
例 3.30 查询选修 C1或 C2的学生的学号, 课程号
和成绩 。
?SELECT SNO,CNO,SCORE
?FROM SC
?WHERE CNO IN(?C1?,?C2?)
?此语句也可以使用逻辑运算符, OR”实现 。
返回 301
?SELECT SNO,CNO,SCORE
?FROM SC
?WHERE CNO=?C1? OR CNO= ?C2?
?利用,NOT IN”可以查询指定集合外的元组。
例 3.31 查询没有选修 C1,也没有选修 C2的学生
的学号, 课程号和成绩 。
?SELECT SNO,CNO,SCORE
?FROM SC
?WHERE CNO NOT IN(?C1?,?C2?)
?等价于,
?SELECT SNO,CNO,SCORE
?FROM SC
?WHERE CNO!=?C1? AND CNO!= ?C2?
返回 302
3.3.2.5 部分匹配查询
?上例均属于完全匹配查询, 当不知道完全精确
的値时, 用户还可以使用 LIKE或 NOT LIKE
进行部分匹配查询 ( 也称模糊查询 ) 。
?LIKE定义的一般格式为,
<属性名 > LIKE <字符串常量 >
?属性名必须为字符型, 字符串常量的字符可以包含
如下两个特殊符号,
?%:表示任意知长度的字符串;
?_:表示任意单个字符 。
例 3.32 查询所有姓张的教师的教师号和姓名 。
?SELECT TNO,TN
?FROM T
?WHERE TN LIKE ?张 %?
返回 303
例 3.33 查询姓名中第二个汉字是, 力, 的教师号
和姓名 。
?SELECT TNO,TN
?FROM T
?WHERE TN LIKE ?_ _力 %?
?注:一个汉字占两个字符 。
3.3.2.6 空值查询
?某个字段没有值称之为具有空值( NULL)。
?通常没有为一个列输入值时,该列的值就是空
值。
?空值不同于零和空格,它不占任何存储空间。
?例如,某些学生选课后没有参加考试,有选课
记录,但没有考试成绩,考试成绩为空值,这
与参加考试,成绩为零分的不同。
返回 304
例 3.34 查询没有考试成绩的学生的学号和相应的
课程号 。
?SELECT SNO,CNO
?FROM SC
?WHERE SCORE IS NULL
?注意:这里的空值条件为 IS NULL,不能写成
SCORE=NULL。
返回 305
3.2.2 常用库函数及统计汇总查询
? SQL提供了许多 库函数, 增强了基本检索能
力 。
? 常用的库函数, 如表 3.2所示 函数名称 功能
AVG
按列计算平均值
SUM
按列计算值的总和
MAX
求一列中的最大值
MIN
求一列中的最小值
COUNT
按列值计个数
返回 306
例 3.35 求学号为 S1学生的总分和平均分 。
?SELECT SUM(SCORE) AS TotalScore,AVG(SCORE)
AS AveScore
?FROM SC
?WHERE (SNO = 'S1')
?注意:函数 SUM和 AVG只能对 数值型 字段进
行计算 。
返回 307
例 3.36 求选修 C1号课程的最高分, 最低分及之间
相差的分数
?SELECT MAX(SCORE) AS MaxScore,MIN(SCORE)
AS MinScore,MAX(SCORE) - MIN(SCORE)
? AS Diff
?FROM SC
?WHERE (CNO = 'C1')
例 3.37 求计算机系学生的总数
?SELECT COUNT(SNO) FROM S
?WHERE DEPT='计算机 '
返回 308
例 3.38 求学校中共有多少个系
?SELECT COUNT(DISTINCT DEPT) AS DeptNum
?FROM S
?注意:加入关键字 DISTINCT后表示消去重复
行, 可计算字段, DEPT“不同值的数目 。
?COUNT函数对 空值 不计算, 但对 零 进行计算 。
例 3.39 统计有成绩同学的人数
?SELECT COUNT (SCORE)
?FROM SC
? 上例中成绩为零的同学计算在内,没有成绩(即为空
值)的不计算。
返回 309
例 3.40 利用特殊函数 COUNT(*)求计算机系学生
的总数
?SELECT COUNT(*) FROM S
?WHERE DEPT=?计算机 ’
?COUNT( *) 用来统计元组的个数
?不消除重复行, 不允许使用 DISTINCT关键字 。
返回 310
3.3.3 分组查询
?GROUP BY子句可以将查询结果按属性列或属
性列组合在 行 的方向上进行分组, 每组在 属性
列 或 属性列组合 上具有相同的值 。
例 3.42 查询各位教师的教师号及其任课的门数 。
?SELECT TNO,COUNT(*) AS C_NUM
?FROM TC
?GROUP BY TNO
?GROUP BY子句按 TNO的值分组, 所有具有
相同 TNO的元组为一组, 对每一组使用函数
COUNT进行计算, 统计出各位教师任课的门
数 。
返回 311
?若在分组后还要按照一定的条件进行筛选,则
需使用 HAVING子句。
例 3.43 查询选修两门以上课程的学生学号和选课
门数
?SELECT SNO,COUNT(*) AS SC_NUM
?FROM SC
?GROUP BY SNO
?HAVING COUNT(*)>=2
?GROUP BY子句按 SNO的值分组, 所有具有相
同 SNO的元组为一组, 对每一组使用函数
COUNT进行计算, 统计出每位学生选课的门
数 。
子句去掉不满足 ( ) 的
返回 312
?当在一个 SQL查询中同时使用 WHERE子句,
GROUP BY 子句和 HAVING子句时, 其顺序
是 WHERE- GROUP BY- HAVING。
?WHERE与 HAVING子句的根本区别在于 作用
对象 不同 。
?WHERE子句作用于 基本表或视图, 从中选择满足
条件的元组;
?HAVING子句作用于 组, 选择满足条件的组, 必须
用于 GROUP BY子句之后, 但 GROUP BY子句可没
有 HAVING子句 。
返回 313
3.3.5 查询的排序
?当需要对查询结果排序时, 应该使用 ORDER
BY子句
?ORDER BY子句必须出现在其他子句之后
?排序方式可以指定, DESC为降序, ASC为升
序, 缺省时为升序
例 3.44 查询选修 C1 的学生学号和成绩, 并按成
绩降序排列 。
?SELECT SNO,SCORE
?FROM SC
?WHERE CNO='C1'
?ORDER BY SCORE DESC
返回 314
例 3.45 查询选修 C2,C3,C4或 C5课程的学号, 课程
号和成绩, 查询结果按学号升序排列, 学号相同
再按成绩降序排列 。
?SELECT SNO,CNO,SCORE
?FROM SC
?WHERE CNO IN ('C2','C3','C4','C5')
?ORDER BY SNO,SCORE DESC
例 3.46 求选课在三门以上且各门课程均及格的学生
的学号及其总成绩, 查询结果按总成绩降序列出 。
?SELECT SNO,SUM(SCORE) AS TotalScore FROM SC
?WHERE SCORE>=60
?GROUP BY SNO
?HAVING COUNT(*)>=3
?ORDER BY SUM(SCORE) DESC
返回 315
?此语句为 分组排序, 执行过程如下,
?1.( FROM) 取出整个 SC
?2.( WHERE) 筛选 SCORE>=60的元组
?3.( GROUP BY) 将选出的元组按 SNO分组
?4.( HAVING) 筛选选课三门以上的分组
?5.( SELECT) 以剩下的组中提取学号和总成绩
?6.( ORDER BY) 将选取结果排序
?ORDER BY SUM(SCORE) DESC 可以改写成
ORDER BY 2 DESC
2 代表查询结果的第二列。
返回 316
3.3.6 数据表连接及连接查询
?数据表之间 的联系是通过表的 字段值 来体现的,
这种字段称为 连接字段 。
?连接操作的 目的 就是通过加在连接字段的条件
将多个表连接起来, 以便从多个表中查询数据 。
?前面的查询都是针对一个表进行的, 当查询同
时涉及两个以上的表时, 称为 连接查询 。
?表的连接方法有两种,
?方法 1,表之间满足一定的条件的行进行连接, 此
时 FROM子句中指明进行连接的表名, WHERE子句
指明连接的列名及其连接条件 。
?方法 2,利用关键字 JOIN进行连接 。
返回 317
具体分为以下几种,
? INNER JOIN,显示符合条件的记录, 此为 默认值 ;
? LEFT ( OUTER) JOIN,显示符合条件的数据行以
及左边表中不符合条件的数据行, 此时右边数据行会
以 NULL来显示, 此称为 左连接 ;
? RIGHT ( OUTER) JOIN,显示符合条件的数据行以
及右边表中不符合条件的数据行, 此时左边数据行会
以 NULL来显示, 此称为 右连接;
? FULL ( OUTER) JOIN,显示符合条件的数据行以
及左边表和右边表中不符合条件的数据行, 此时缺乏
数据的数据行会以 NULL来显示;
? CROSS JOIN,会将一个表的每一笔数据和另一表的
每笔数据匹配成新的数据行 。
? 当将 JOIN 关键词放于 FROM子句中时, 应有关键词
ON与之相对应, 以表明连接的条件 。
返回 318
3.3.6.1 等值连接与非等值连接
? 例 3.47 查询刘伟老师所讲授的课程 。
? 方法 1,
?SELECT T.TNO,TN,CNO
?FROM T,TC
?WHERE (T.TNO = TC,TNO) AND (TN=?刘伟 ’ )
?这里, TN=?刘伟 ’ 为 查询条件, 而 T.TNO = TC.TNO 为 连接
条件, TNO为 连接字段 。 连接条件的一般格式为,
? [<表名 1>.] <列名 1> <比较运算符 > [<表名 2>.] <列名 2>
?其中,比较运算符主要有:=, >, <, >=, <=, ! = 。
?当比较运算符为, =, 时, 称为 等值连接, 其他情况为非等
值连接 。
返回 319
?引用列名 TNO时要加上 表名前缀, 是因为两个表中
的列名相同, 必须用表名前缀来确切说明所指列属
于哪个表, 以避免二义性 。 如果列名是唯一的, 比
如 TN,就不必须加前缀 。
?上面的操作是将 T表中的 TNO 和 TC表中的 TNO相等
的行 连接, 同时 选取 TN为, 刘伟, 的行, 然后再在
TN,CNO列上 投影, 这是 连接, 选取 和 投影 的操作
组合 。
?方法 2,
?SELECT T.TNO,TN,CNO
?FROM T INNER JOIN TC
?ON T.TNO=TC.TNO AND T.TN='刘伟 '
返回 320
?方法 3,
?SELECT R2.TNO,R2.TN,R1.CNO
?FROM
?(SELECT TNO,CNO FROM TC ) AS R1
?INNER JOIN
?(SELECT TNO,TN FROM T
?WHERE TN='刘伟 ') AS R2
?ON R1.TNO=R2.TNO
返回 321
例 3.48 查询所有选课学生的学号, 姓名, 选课名称
及成绩 。
?SELECT S.SNO,SN,CN,SCORE
?FROM S,C,SC
?WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO
?本例涉及三个表, WHERE子句中有两个连接条件 。
当有两个以上的表进行连接时, 称为 多表连接 。
返回 322
3.3.6.2 自身连接
?当一个表与其自已进行连接操作时, 称为表的
自身连接 。
例 3.49 查询所有比刘伟工资高的教师姓名, 性别,
工资和刘伟的工资 。
?要查询的内容均在同一表 T中, 可以将表 T分
别取两个 别名, 一个是 X,一个是 Y。 将 X,Y
中满足比刘伟工资高的行连接起来 。 这实际上
是同一表 T的自身连接 。
?方法 1,
?SELECT X.TN,X.SAL AS SAL_a,Y.SAL AS SAL_b
?FROM T AS X,T AS Y
?WHERE X.SAL>Y.SAL AND Y.TN='刘伟 '
返回 323
?方法 2,
?SELECT X.TN,X.SAL,Y.SAL
?FROM T AS X INNER JOIN T AS Y
?ON X.SAL>Y.SAL AND Y.TN='刘伟 '
?方法 3,
?SELECT R1.TN,R1.SAL,R2.SAL FROM
?(SELECT TN,SAL FROM T ) AS R1
?INNER JOIN
?(SELECT SAL FROM T
?WHERE TN='刘伟 ') AS R2
?ON R1.SAL>R2.SAL
返回 324
例 3.50 检索所有学生姓名, 年龄和选课名称 。
? 方法 1,
SELECT SN,AGE,CN
FROM S,C,SC
WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO
? 方法 2,
?SELECT R3.SNO,R3.SN,R3.AGE,R4.CN
?FROM
?(SELECT SNO,SN,AGE FROM S) AS R3
?INNER JOIN
?(SELECT R2.SNO,R1.CN
?FROM
?(SELECT CNO,CN FROM C) AS R1
?INNER JOIN
?(SELECT SNO,CNO FROM SC) AS R2
?ON R1.CNO=R2.CNO) AS R4
?ON R3.SNO=R4.SNO
返回 325
3.3.6.3 外连接
? 在上面的连接操作中, 不满足连接条件的元组不能作
为查询结果输出 。
? 如例 3.48的查询结果只包括有选课记录的学生, 而不
会有吴丽同学的信息 。 若将例 3.48改成,
例 3.51 查询所有学生的学号, 姓名, 选课名称及成绩 。
( 没有选课的同学的选课信息显示为空 ) 则应写成如
下的 SQL语句 。
?SELECT S.SNO,SN,CN,SCORE
?FROM S
?LEFT OUTER JOIN SC
?ON S.SNO=SC.SNO
?LEFT OUTER JOIN C
?ON C.CNO=SC.CNO
? 则查询结果只包括所有的学生, 没有选课的吴丽同学
的选课信息显示为空 。
返回 326
3.3.7 子查询
?在 WHERE子句中包含一个形如 SELECT-FROM-
WHERE的查询块, 此查询块称为 子查询 或 嵌套查
询, 包含子查询的语句称为 父查询 或 外部查询 。
?嵌套查询 可以将一系列简单查询构成复杂查询,
增强查询能力 。
?子查询的嵌套层次最多可达到 255层, 以层层嵌
套的方式构造查询充分体现了 SQL“结构化, 的
特点 。
?嵌套查询在执行时 由里向外 处理, 每个子查询
是在上一级外部查询处理之前完成, 父查询要
用到子查询的结果 。
返回 327
3.3.7.1 返回一个值的子查询
?当子查询的返回值只有一个时, 可以使用比较
运算符 ( =,>,<,>=,<=,!=) 将父查询和
子查询连接起来 。
例 3.52 查询与刘伟教师职称相同的教师号, 姓
名 。
?SELECT TNO,TN
?FROM T
?WHERE PROF=(SELECT PROF
?FROM T
?WHERE TN='刘伟 ')
?此查询相当于分成两个查询块来执行 。 先执行
子查询,
?SELECT PROF
返回 328
?子查询向主查询只返回一个值, 即刘伟教师的
职称, 讲师,, 然后以此作为父查询的条件,
相当于再执行父查询,查询所有职称为, 讲师,
的教师号, 姓名 。
?SELECT TNO,TN
?FROM T
?WHERE PROF=?讲师 ’
返回 329
3.3.7.2 返回一组值的子查询
?如果子查询的返回值不止一个, 而是一个集合
时, 则不能直接使用比较运算符, 可以在比较
运算符和子查询之间插入 ANY或 ALL。 其具体含
义详见以下各例 。
1,使用 ANY
例 3.53 查询讲授课程号为 C5的教师姓名 。
?SELECT TN
?FROM T
?WHERE TNO=ANY
? (SELECT TNO
? FROM TC
? WHERE CNO='C5')
返回 330
?先执行子查询,找到讲授课程号为 C5的教师号,
为一组值构成的集合 (T2,T3,T5);
?再执行父查询,其中 ANY的含义为 任意一个,
查询教师号为 T2,T3,T5的教师的姓名。
?该例也可以使用前面所讲的 连接操作 来实现,
?SELECT TN
?FROM T,TC
?WHERE T.TNO=TC.TNO
?AND TC.CNO='C5?
?可见, 对于同一查询可使用 子查询 和 连接 两种
方法来解决, 可根据习惯任意选用 。
返回 331
例 3.54 查询其他系中比计算机系某一教师工资
高的教师的姓名和工资 。
?SELECT TN,SAL
?FROM T
?WHERE SAL>ANY
? (SELECT SAL
? FROM T
? WHERE DEPT='计算机 ')
? AND DEPT!= '计算机 '
? /*注意:此行是父查询中的
条件 */
?先执行子查询,找到计算机系中所有教师的工
资集合 (1500,900);
?再执行父查询,查询所有不是计算机系且工资
高于 1500或 900的教师姓名和工资。
返回 332
?此查询也可以写成,
?SELECT TN,SAL
?FROM T
?WHERE SAL>
? (SELECT MIN(SAL )
? FROM T
? WHERE DEPT='计算机 ')
? AND DEPT!= ?计算机 ’
?先执行子查询, 利用库函数 MIN找到计算机系
中所有教师的最低工资 ——900;
?再执行父查询, 查询所有不是计算机系且工资
高于 900的教师 。
返回 333
2,使用 IN
?可以使用 IN代替, =ANY”。
?例 3.55( 题目同 3.53)
?SELECT TN
?FROM T
?WHERE TNO IN
? (SELECT TNO
? FROM TC
? WHERE CNO='C5')
返回 334
3,使用 ALL
? ALL的含义为 全部 。
例 3.56 查询其他系中比计算机系所有教师工资都高的教
师的姓名和工资 。
?SELECT TN,SAL
?FROM T
?WHERE SAL>ALL
? (SELECT SAL
? FROM T
? WHERE DEPT='计算机 ')
? AND DEPT!= ?计算机 ’
? 子 查询 找到 计算 机系 中所 有教 师的 工资集 合
(1500,900);
? 父查询找到所有不是计算机系且工资高于 1500的教师
姓名和工资 。
返回 335
?此查询也可以写成,
?SELECT TN,SAL
?FROM T
?WHERE SAL>
? (SELECT MAX(SAL )
?FROM T
? WHERE DEPT='计算机 ')
? AND DEPT!= ?计算机 ’
?库函数 MAX的作用是找到计算机系中所有教师
的最高工资 1500。
返回 336
例 3.57 查询不讲授课程号为 C5的教师姓名 。
?SELECT DISTINCT TN
?FROM T
?WHERE 'C5' !=ALL
? (SELECT CNO
?FROM TC
? WHERE TNO=T.TNO)
?!=ALL的含义为不等于子查询结果中的任何一
个值, 也可使用 NOT IN代替 !=ALL。
?子查询包含 普通子查询 和 相关子查询 。
?前面所讲的子查询均为普通子查询, 而本例中
子查询的查询条件引用了父查询表中的属性值
( T表的 TNO值 ), 我们把这类查询称为 相关子
查询 。
返回 337
? 二者的执行方式不同,
?普通子查询的执行顺序是,
? 首先执行子查询, 然后把子查询的结果作为父查询的查询条件的
值 。
? 普通子查询只执行一次, 而父查询所涉及的所有记录行都与其查
询结果进行比较以确定查询结果集合 。
?相关子查询的执行顺序是,
? 首先选取父查询表中的第一行记录, 内部的子查询利用此行中相
关的属性值进行查询,
? 然后父查询根据子查询返回的结果判断此行是否满足查询条件 。
如果满足条件, 则把该行放入父查询的查询结果集合中 。 重复执
行这一过程, 直到处理完父查询表中的每一行数据 。
? 由此可以看出, 相关子查询的执行次数是由父查询表
的行数决定的 。
返回 338
?如上例表 T中每的一行即每个教师记录都要执
行一次子查询以确定该教师是否讲授 C5这门课,
当 C5不是教师的任一门课时, 则该教师被选
取 。
?以下几例均为相关子查询 。
4,使用 EXISTS
?EXISTS表示存在量词, 带有 EXISTS的子查询不
返回任何实际数据, 它只得到逻辑值, 真, 或
,假, 。
?当子查询的的查询结果集合为非空时, 外层的
WHERE子句返回真值, 否则返回假值 。 NOT
EXISTS与此相反 。
含有 IN的查询通常可用 EXISTS表示, 但反过来
返回 339
例 3.58( 题目同 3.53) 略
?SELECT TN
?FROM T
?WHERE EXISTS
? (SELECT *
?FROM TC
? WHERE TNO=T.TNO
?AND CNO='C5')
?当子查询 TC表存在一行记录满足其 WHERE子句
中的条件时, 则父查询便得到一个 TN值, 重复
执行以上过程, 直到得出最后结果 。
返回 340
例 3.59 查询选修所有课程的学生姓名
?SELECT SN FROM S
?WHERE NOT EXISTS
?(SELECT * FROM C
? WHERE NOT EXISTS
? (SELECT * FROM SC
? WHERE SNO = S.SNO
? AND CNO=C.CNO))
?选出这样一些学生名单,在 SC表中不存在他们
没有选修课程的记录。
返回 341
3.4 SQL数据更新
?SQL语言的数据更新语句 DML主要包括插入数据,
修改数据和删除数据三种语句 。
3.4.1 插入数据记录
?插入数据是把新的记录插入到一个存在的表中 。
插入数据使用语句 INSERT INTO,可分为以下
几种情况 。
3.4.1.1 插入一行新记录
?语法格式为,
INSERT INTO < 表名 >[(< 列名 1>[,< 列名 2>… ])]
VALUES(<值 >)
?其中, <表名 >是指要插入新记录的表
<列名 >是可选项, 指定待添加数据的列
返回 342
? 列名的排列顺序不一定要和表定义时的顺序
一致。
? 但当指定列名表时 VALUES子句值的排列顺序
必须和列名表中的列名排列顺序一致,个数
相等,数据类型一一对应。
? 例 3.60 在 S表中插入一条学生记录 ( 学号:
S7;姓名:郑冬;性别:女;年龄,21;系
别:计算机 ) 。
? INSERT INTO S
? VALUES ('s7','郑冬 ','女 ',21,'计算机 ')
注意,
? 必须用 逗号 将各个数据分开,字符型数据要
用 单引号 括起来。
? INTO子句中没有指定列名,则新插入的记录
必须在每个属性列上均有值,且 VALUES子句
返回 343
3.4.1.2 插入一行的部分数据值
例 3.61 在 SC 表中插入一条选课记录
( ’ S7?,?C1?) 。
?INSERT INTO SC (SNO,CNO)
?VALUES ('s7',?c1')
?将 VALUES子句中的值按照 INTO子句中指定列名
的顺序插入到表中
?对于 INTO子句中没有出现的列,则新插入的记
录在这些列上将取空值,如上例的 SCORE即赋
空值。
?但在表定义时有 NOT NULL约束的属性列不能取
空值。
返回 344
3.4.1.3 插入多行记录
?用于表间的拷贝, 将一个表中的数据抽取数行
插入另一表中, 可以通过子查询来实现 。
?插入数据的命令语法格式为,
?INSERT INTO <表名 > [(<列名 1>[,<列名 2>… ])]
?子查询
?例 3.62 求出各系教师的平均工资, 把结果存
放在新表 AVGSAL中 。
?首先建立新表 AVGSAL,用来存放系名和各系的平均
工资
?CREATE TABLE AVGSAL
?(DEPARTMENT VARCHAR(20),
?AVGSAL SMALLINT)
返回 345
?然后利用子查询求出 T表中各系的平均工资,
把结果存放在新表 AVGSAL中 。
?INSERT INTO AVGSAL
?SELECT DEPT,AVG(SAL)
?FROM T
?GROUP BY DEPT
返回 346
2.4.2 修改数据记录
?SQL语言可以使用 UPDATE语句对表中的一行或
多行记录的某些列值进行修改, 其语法格式为,
? UPDATE <表名 >
? SET <列名 >=<表达式 > [,<列名 >=<表达式 >]…
? [WHERE <条件 >]
其中,
?<表名 >是指要修改的表
?SET子句给出要修改的列及其修改后的值
?WHERE子句指定待修改的记录应当满足的条件,
WHERE子句省略时, 则修改表中的所有记录 。
返回 347
3.4.2.1 修改一行
例 3.63 把刘伟教师转到信息系 。
?UPDATE T
?SET DEPT='信息 '
?WHERE TN='刘伟 '
3.4.2.2 修改多行
例 3.64 将所有学生年龄增加 1岁
?UPDATE S
?SET AGE=AGE+1
返回 348
例 3.65 把教师表中工资小于等于 1000元的讲师
的工资提高 20%。
?UPDATE T
?SET SAL=1.2*SAL
?WHERE PROF='讲师 '
?AND SAL <=1000
返回 349
3.4.2.3用子查询选择要修改的行
例 3.66 把讲授 C5课程的教师的岗位津贴增加 100
元 。
?UPDATE T
?SET COMN=COMN+100
?WHERE TNO IN
?(SELECT T.TNO
?FROM T,TC
?WHERE T.TNO=TC.TNO
?AND TC.CNO='C5')
?子查询的作用是得到讲授 C5课程的教师号 。
返回 350
3.4.2.4 用子查询提供要修改的值
例 3.67 把所有教师的工资提高到平均工资的 1.2

?UPDATE T
?SET SAL =
?(SELECT 1.2*AVG(SAL) FROM T)
?子查询的作用是得到所有教师的平均工资 。
返回 351
3.4.3 删除数据记录
?使用 DELETE语句可以删除表中的一行或多行记
录, 其语法格式为,
?DELETE
?FROM<表名 >
?[WHERE <条件 >]
其中,
?<表名 >是指要删除数据的表 。
?WHERE子句指定待删除的记录应当满足的条件,
WHERE子句省略时, 则删除表中的所有记录 。
返回 352
3.4.3.1 删除一行记录
例 3.68 删除刘伟教师的记录 。
?DELETE
?FROM T
?WHERE TN=?刘伟 ’
3.4.3.2 删除多行记录
例 3.69 删除所有教师的授课记录
?DELETE
?FROM TC
?执行此语句后, TC表即为一个空表, 但其定义
仍存在数据字典中 。
返回 353
3.4.3.3 利用子查询选择要删除的行
例 3.70 删除刘伟教师授课的记录 。
?DELETE
?FROM TC
?WHERE TNO=
?(SELECT TNO
? FROM T
? WHERE TN=? 刘伟 ’ )
返回 354
3.5 视图
?视图是 虚表, 其数据不存储, 其记录来自基本
表, 只在数据库中 存储其定义 。
?视图在概念上与基本表等同, 用户可以在视图
上再定义视图, 可以对视图进行查询, 删
除, 更新等操作 。
3.5.1 定义和删除视图
3.5.1.1 定义视图
?定义视图使用语句 CREATE VIEW,其语法格式
为,
?CREATE VIEW <视图名 >[(<视图列表 >)]
?AS <子查询 >
?其中,<视图列表 >为可选项,省略时,视图的
列名由子查询的结果决定。
返回 355
以下两种情况下,视图列名不可省略,
?1.视图由多个表连接得到,在不同的表中存在同名
列,则需指定列名;
?2.当视图的列名为表达式或库函数的计算结果时,
而不是单纯的属性名时,则需指明列名。
?在子查询中不许使用 ORDER BY 子句和
DISTINCT短语,如果需要排序,则可在视图定
义后,对视图查询时再进行排序。
例 3.71 创建一个计算机系教师情况的视图 SUB_T。
?CREATE VIEW SUB_T
?AS SELECT TNO,TN,PROF
?FROM T WHERE DEPT ='计算机 '
返回 356
?其中,
?视图名字为 SUB_T,省略了视图列表。
?视图由子查询中的三列 TNO,TN,PROF组成。
?视图创建后,对视图 SUB_T的数据的访问只限制在
计算机系内,且只能访问 TNO,TN,PROF三列的内容,
从而达到了数据保密的目的。
?视图创建后,只在数据字典中存放 视图
的定义,而其中的子查询 SELECT语句并
不执行。
?只有当用户对视图进行操作时,才按照
视图的定义将数据从基本表中取出。
返回 357
例 3.72 创建一学生情况视图 S_SC_C(包括
学号、姓名、课程名及成绩)。
?CREATE VIEW S_SC_C(SNO,SN,CN,SCORE)
?AS SELECT S.SNO,SN,CN,SCORE
?FROM S,C,SC
?WHERE S.SNO = SC.SNO AND
?SC.CNO = C.CNO
?此视图由三个表连接得到,在 S表和 SC表
中均存在 SNO列,则需指定视图列名。
返回 358
例 3.73 创建一学生平均成绩视图 S_AVG
?CREATE VIEW S_AVG (SNO,AVG)
?AS SELECT SNO,AVG (SCORE)
?FROM SC GROUP BY SNO
?此视图的列名之一 AVG为库函数的计算结果,
则在定义时需指明列名。
返回 359
3.5.1.2 删除视图
?视图定义后可随时删除,删除视图的语法格式
为,
?DROP VIEW <视图名 >
例 3.74 删除计算机系教师情况的视图 SUB_T。
?DROP VIEW SUB_T
?视图删除后,只会删除该视图在数据字典中的
定义,而与该视图有关的基本表中的数据不会
受任何影响,由此视图导出的其他视图的定义
不会删除,但已无任何意义。用户应该把这些
视图删除。
返回 360
3.5.2 查询视图
?视图定义后,对视图的查询操作如同对基本表
的查询操作一样。
例 3.75 查找视图 SUB_T中职称为教授的教师号
和姓名。
?SELECT TNO,TN
?FROM SUB_T
?WHERE PROF='教授 '
返回 361
?此查询的执行过程是系统 首先 从数据字典中找
到 SUB_T的定义,然后 把此定义和用户的查询
结合起来,转换成等价的对基本表 T的查询,
这一转换过程称为 视图消解 ( View
Resolution),相当于执行以下查询,
?SELECT TNO,TN
?FROM T
?WHERE DEPT =?计算机 ’ AND PROF=?教授 ’
?由上例可以看出,当对一个基本表进行复杂的
查询时,可以先对基本表建立一个视图,然后
只需对此视图进行查询,这样就不必再键入复
杂的查询语句,而将一个复杂的查询转换成一
个简单的查询,从而简化了查询操作。
返回 362
3.5.3 更新视图
?由于视图是一张虚表,所以对视图的更
新,最终实际上是转换成对基本表的更
新。
?其更新操作包括 插入, 修改 和 删除 数据,
?其语法格式如同对基本表的更新操作一
样。
?有些更新在理论上是不可能的,有些实
现起来比较困难,以下仅考虑可以更新
的视图。
返回 363
3.5.3.1 插入( INSERT)
例 3.76 向计算机系教师视图 SUB_T中插入
一条记录 ( 教师号,T6;姓名:李丹;
职称:副教授 ) 。
?INSERT INTO SUB_T
?VALUES ('T6','李丹 ','副教授 ')
?系统在执行此语句时,首先从数据字典
中找到 SUB_T的定义,然后把此定义和插
入操作结合起来,转换成等价的对基本
表 T的插入。相当于执行以下操作,
?INSERT INTO T
?VALUES (?T6?,? 李丹 ’, ’ 副教授 ’, ’ 计算机 ’ )
返回 364
3.5.3.2 修改 ( UPDATE)
例 3.77 将计算机系教师视图 SUB_T中刘伟的职
称改为, 副教授, 。
? UPDATE SUB_T
? SET PROF = '副教授 '
?WHERE TN = ?刘伟 ’
?转换成对基本表的修改操作,
?UPDATE T
?SET PROF=?副教授 ’
?WHERE TN=?刘伟 ’ AND DEPT=?计算机 ’
返回 365
3.5.3.3 删除 ( DELETE)
例 3.78 删除计算机系教师视图 SUB_T中刘伟教
师的记录。
?DELETE
?FROM SUB_T
?WHERE TN=?刘伟 ’
?转换成对基本表的删除操作,
?DELETE
?FROM T
?WHERE TN=?刘伟 ’ AND DEPT=?计算机 ’
?由于视图中的数据不是存放在视图中的,即视
图没有相应的存储空间,对视图的一切操作最
终都要转换成对基本表的操作,这样看来使操
作更加复杂,那么为什么还要使用视图呢?
返回 366
?使用视图有如下几个优点,
?1,利于数据保密,对不同的用户定义不同的视图,
使用户只能看到与自己有关的数据。
? 例如,对教师表创建了计算机系视图,本系教师只能使用此视图,
而无法访问其他系教师的数据。
?2,简化查询操作,为复杂的查询建立一个视图,
用户不必键入复杂的查询语句,只需针对此视图做
简单的查询即可。 如例 3.75。
?3,保证数据的逻辑独立性 。对于视图的操作,比
如查询,只依赖于视图的定义。当构成视图的基本
表要修改时,只需修改视图定义中的子查询部分。
而基于视图的查询不用改变。这就是第一章介绍过
的外模式与模式之间的独立性,即 数据的逻辑独立
性 。
返回 367
3.6 SQL 数据控制
数据库中的数据由多个用户共享, 为保证数据库
的安全, SQL语言提供数据控制语句 DCL(Data
Control Language)对数据库进行统一的控制管
理 。
3.6.1 权限与角色
3.6.1.1权限
?在 SQL系统中, 有两个 安全机制,
?一种是上一节介绍的 视图机制, 当用户通过视图访
问数据库时, 不能访问此视图外的数据, 它提供了
一定的安全性 。
?主要的安全机制是 权限机制 。
? 权限机制的基本思想是给用户授予不同类型的权限, 在必要时,
可以收回授权 。
? 使用户能够进行的数据库操作以及所操作的数据限定在指定的
范围内, 禁止用户超越权限对数据库进行非法的操作, 从而保
证数据库的安全性 。
返回 368
在 SQL SERVER中, 权限可分为 系统权限和对象权限 。
?系统权限 由数据库管理员授予其他用户, 是指数
据库用户能够对数据库系统进行某种特定的操作
的权力 。
?如创建一个基本表 ( CREATE TABLE)
?对象权限 由创建基本表, 视图等数据库对象的用
户授予其他用户, 是指数据库用户在指定的数据
库对象上进行某种特定的操作的权力 。
?如查询 ( SELECT), 插入 ( INSERT), 修改 ( UPDATE)
和删除 ( DELETE) 等操作 。
3.6.1.2 角色
?角色 是多种权限的集合, 可以把角色授予用户或
其他角色 。 当要为某一用户同时授予或收回多项
权限时, 则可以把这些权限定义为一个角色, 对
此角色进行操作 。 这样就避免了许多重复性的工
作, 简化了管理数据库用户权限的工作 。
返回 369
3.6.2 系统权限与角色的授予与收回
?3.6.2.1 系统权限与角色的授予
?SQL语言使用 GRANT语句为用户授予系统权限,
其语法格式为,
?GRANT <系统权限 >|<角色 > [,<系统权限 >|<角色 >]…
?TO <用户名 >|<角色 >|PUBLIC[,<用户名 >|<角色 >]…
?[WITH ADMIN OPTION]
?其语义为:将指定的系统权限授予指定的用户
或角色 。
?其中,
?PULBIC代表数据库中的全部用户 。
?WITH ADMIN OPTION为可选项, 指定后则允许被授
权的用户将指定的系统特权或角色再授予其他用户
或角色 。
返回 370
例 3.79 为用户 ZHANGSAN授予 CREATE TABLE的系统
权限 。
?GRANT CREATE TABLE
?TO ZHANGSAN
3.6.2.2 系统权限与角色的收回
?数据库管理员可以使用 REVOKE语句收回系统权限,
其语法格式为,
?REVOKE <系统权限 >|<角色 > [,<系统权限 >|<角色
>]…
?FROM <用户名 >|<角色 >|PUBLIC[,<用户名 >|<角色
>]…
?例 3.80 收回用 户 ZHANGSAN 所拥有 的 CREATE
TABLE的系统权限 。
?REVOKE CREATE TABLE
返回 371
3.6.3 对象权限与角色的授予与收回
3.6.3.1 对象权限与角色的授予
?数据库管理员拥有系统权限, 而作为数据库的
普通用户, 只对自己创建的基本表, 视图等数
据库对象拥有对象权限 。
?如果要共享其他的数据库对象, 则必须授予他
一定的对象权限 。
?同系统权限的授予类似,SQL语言使用 GRANT语
句为用户授予对象权限,其语法格式为,
?GRANT ALL|<对象权限 >[(列名 [,列名 ]… )][,<对象权限 >]… ON
<对象名 >
?TO <用户名 >|<角色 >|PUBLIC[,<用户名 >|<角色 >]…
?[WITH GRANT OPTION]
返回 372
?其语义为:将指定的操作对象的对象权限授予
指定的用户或角色 。
?其 中,
?ALL代表 所有的对象权限 。
?列名 用于指定要授权的数据库对象的一列或多列 。
如果不指定列名, 被授权的用户将在数据库对象的
所有列上均拥有指定的特权 。
? 实际上, 只有当授予 INSERT,UPDATE权限时才需指定
列名 。
?ON子句用于指定要授予对象权限的数据库对象名,
可以是基本表名, 视图名等 。
?WITH ADMIN OPTION为可选项, 指定后则允许被授
权的用户将权限再授予其他用户或角色 。
返回 373
例 3.81 将对 S表和 T表的所有对象权限授予 USER1
和 USER2。
?GRANT ALL
?ON S,T
?TO USER1,USER2
例 3.82 将对 C表的查询权限授予所有用户 。
?GRANT SELECT
?ON C
?TO PUBLIC
返回 374
例 3.83 将查询 T表和修改教师职称的权限授予
USER3,并允许将此权限授予其他用户 。
?GRANT SELECT,UPDATE(PROF)
?ON T
?TO USER3
?WITH ADMIN OPTION
?USER3具有此对象权限, 并可使用 GRANT命令给
其他用户授权, 如下例, USER3将此权限授予
USER4,
?GRANT SELECT,UPDATE(PROF)
?ON T
?TO USER4
返回 375
3.6.3.2 对象权限与角色的收回
?所有授予出去的权力在必要时都可以由数据库
管理员和授权者收回, 收回对象权限仍然使用
REVOKE语句, 其语法格式为,
?REVOKE <对象权限 >|<角色 > [,<对象权限 >|<角色
>]…
?FROM <用户名 >|<角色 >|PUBLIC[,<用户名 >|<角色
>]…
例 3.84 收回用户 USER1对 C表的查询权限 。
?REVOKE SELECT
?ON C
?FROM USER1
返回 376
例 3.85 收回用户 USER3查询 T表和修改教师职称
的权限 。
?REVOKE SELECT,UPDATE(PROF)
?ON T
?FROM USER3
?在例 3.83中, USER3将对 T表的权限授予了
USER4,在收回 USER3对 T表的权限的同时, 系
统会自动收回 USER4对 T表的权限 。
返回 377
小 结
? 本章以 SQL SERVER为例, 详细介绍了 SQL语言的使用方
法 。
? 在讲解 SQL语言的同时, 进一步介绍了关系数据库的有
关概念, 如索引和视图的概念及其作用 。
? SQL语言具有数据定义, 数据查询, 数据更新, 数据控
制四大功能 。 其全部功能可以用表 3.3的 9个动词概括出
来 。
表 3.3 SQL语言的动词
SQL功能
动词
数据定义
CREATE,DROP,ALTER
数据查询
SELECT
数据操纵
INSERT,UPDATE,DELETE
数据控制
GRANT,REVOKE
?其中:其数据查询功能最为丰富和复杂,也非常重要,
初学者掌握起来有一定的困难,应反复上机加强练习。
返回 378
第 4章 关系数据库理论
返回 379
本章概要
? 前面已经讲述了 关系数据库, 关系模型 的基本概念以及关系数据
库的 标准语言 。
? 如何使用关系模型设计关系数据库,也就是面对一个现实问题,
如何选择一个比较好的关系模式的集合,每个关系又应该由哪些
属性组成。这属于数据库设计的问题,确切地讲是数据库 逻辑设
计 的问题,有关数据库设计的全过程将在第 6章详细讨论。
? 本章讲述 关系数据库规范化理论,这是数据库逻辑设计的理论依
据。
? 要求了解规范化理论的研究动机及其在数据库设计中的作用,
? 掌握函数依赖的有关概念,
? 第一范式、第二范式、第三范式的定义,
? 重点掌握并能够灵活运用关系模式规范化的方法和关系模式分解的
方法,这也是本章的难点。
返回 380
4.1 规范化问题的提出
4.1.1 规范化理论的主要内容
? 关系数据库的规范化理论最早是由关系数据库的创始
人 E.F.Codd提出的,
? 后经许多专家学者对关系数据库理论作了深入的研究
和发展, 形成了一整套有关关系数据库设计的理论 。
? 在该理论出现以前, 层次和网状数据库的设计只是遵
循其模型本身固有的原则, 而无具体的理论依据可言,
因而带有盲目性, 可能在以后的运行和使用中发生许
多预想不到的问题 。
返回 381
? 在关系数据库系统中,关系模型 包括一组 关系模式,
各个关系不是完全孤立的,数据库的设计较层次和网
状模型更为重要。
? 如何设计一个适合的关系数据库系统,关键是关系数
据库 模式 的设计,一个好的关系数据库模式应该包括
多少 关系模式,而每一个关系模式又应该包括哪些 属
性,又如何将这些相互关联的关系模式组建一个适合
的 关系模型,这些工作决定了到整个系统运行的效率,
也是系统成败的关键所在,所以必须在关系数据库的
规范化理论 的指导下逐步完成。
返回 382
? 关系数据库的规范化理论主要包括三个方面的内容,
? 函数信赖
? 范式 ( Normal Form)
? 模式设计
? 其中, 函数信赖 起着核心的作用, 是模式分解和模式设计的基础,
范式是模式分解的标准 。
4.1.2 关系模式的存储异常问题
? 数据库的逻辑设计为什么要遵循一定的规范化理论?
? 什么是好的关系模式?
? 某些不好的关系模式可能导致哪些问题?
? 下面通过例子进行分析,
返回 383
例如, 要求设计 教学管理数据库, 其关系模式 SCD如下,
? SCD(SNO,SN,AGE,DEPT,MN,CNO,SCORE)
? 其中, SNO表示学生学号, SN表示学生姓名, AGE表示学生年龄,
DEPT表示学生所在的系别, MN表示系主任姓名, CNO表示课程号,
SCORE表示成绩 。
根据实际情况, 这些数据有如下语义规定,
? 1,一个系有若干个学生, 但一个学生只属于一个系;
? 2,一个系只有一名系主任, 但一个系主任可以同时兼几个系的系主
任;
? 3,一个学生可以选修多门功课, 每门课程可有若干学生选修;
? 4,每个学生学习课程有一个成绩 。
? 在此关系模式中填入一部分具体的数据, 则可得到 SCD关系模式
的实例, 即一个教学管理数据库, 如图 4.1所示 。
返回 384
图 4.1 关系 SCD
SNO
SN
AGE
DEPT
MN
CNO
SCORE
S1
赵亦
17
计算机
刘伟
C1
90
S1
赵亦
17
计算机
刘伟
C2
85
S2
钱尔
18
信息
王平
C5
57
S2
钱尔
18
信息
王平
C6
80
S2
钱尔
18
信息
王平
C7
70
S2
钱尔
18
信息
王平
C5
70
S3
孙珊
20
信息
王平
C1
0
S3
孙珊
20
信息
王平
C2
70
S3
孙珊
20
信息
王平
C4
85
S4
李思

自动化
刘伟
C1
93
返回 385
?根据上述的语义规定, 并分析以上关系中的数据, 我们可以看出:
(SNO,CNO)属性的组合能唯一标识一个元组, 所以 (SNO,CNO)是该
关系模式的 主关系键 。 但在进行数据库的操作时, 会出现以下几方
面的问题 。
?1,数据冗余 。 每个系名和系主任的名字存储的次数等于该系
的学生人数乘以每个学生选修的课程门数, 同时学生的姓名, 年
龄也都要重复存储多次, 数据的冗余度很大, 浪费了存储空间 。
?2,插入异常 。 如果某个新系没有招生, 尚无学生时, 则系名
和系主任的信息无法插入到数据库中 。
? 因为在这个关系模式中, (SNO,CNO)是主关系键 。 根据关系的 实
体完整性约束, 主关系键的值不能为空, 而这时没有学生, SNO
和 CNO均无值, 因此不能进行插入操作 。
? 另外, 当某个学生尚未选课, 即 CNO未知, 实体完整性约束还规
定, 主关系键的值不能部分为空, 同样不能进行插入操作 。
返回 386
?3,删除异常 。
?某系学生全部毕业而没有招生时, 删除全部学生的记录则系名,
系主任也随之删除, 而这个系依然存在, 在数据库中却无法找
到该系的信息 。
?另外, 如果某个学生不再选修 C1课程, 本应该只删去 C1,但 C1
是主关系键的一部分, 为保证实体完整性, 必须将整个元组一
起删掉, 这样, 有关该学生的其它信息也随之丢失 。
?4,更新异常 。
?如果学生改名, 则该学生的所有记录都要逐一修改 SN;
?又如某系更换系主任, 则属于该系的学生记录都要修改 MN的内
容, 稍有不慎, 就有可能漏改某些记录, 这就会造成数据的不
一致性, 破坏了数据的完整性 。
返回 387
? 由于存在以上问题, 我们说, SCD是一个不好的关系模式 。 产生
上述问题的原因, 直观地说, 是因为关系中, 包罗万象,, 内容
太杂了 。
? 那么, 怎样才能得到一个好的关系模式呢?
? 我们把关系模式 SCD分解为下面三个结构简单的关系模式, 如图
4.2所示 。
?学生关系 S(SNO,SN,AGE,DEPT)
?选课关系 SC(SNO,CNO,SCORE)
?系关系 D(DEPT,MN)
返回 388
S SC
SNO
SN
AGE
DEPT
SNO
CNO
SCORE
S1
赵亦
17
计算机
S1
C1
90
S2
钱尔
18
信息
S1
C2
85
S3
孙珊
20
信息
S2
C5
57
S4
李思
21
自动化
S2
C6
80
S2
C7
D
S2
C5
70
DEPT
MN
S3
C1
0
计算机
刘伟
S3
C2
70
信息
王平
S3
C4
85
自动化
刘伟
S4
C1
93
图 4.2 分解后的关系模式
返回 389
? 在以上三个关系模式中,实现了信息的某种程度的分
离,
?S中存储学生基本信息,与所选课程及系主任无关;
?D中存储系的有关信息,与学生无关;
?SC中存储学生选课的信息,而与所学生及系的有关信息无关。
? 与 SCD相比,分解为三个关系模式后,数据的冗余度明
显降低。
?当新插入一个系时,只要在关系 D中添加一条记录。
?当某个学生尚未选课,只要在关系 S中添加一条学生记录,而
与选课关系无关,这就避免了 插入异常 。
?当一个系的学生全部毕业时,只需在 S中删除该系的全部学生
记录,而关系 D中有关该系的信息仍然保留,从而不会引起 删
除异常 。
?同时,由于数据冗余度的降低,数据没有重复存储,也不会
引起 更新异常 。
返回 390
?经过上述分析, 我们说分解后的关系模式是一
个好的关系数据库模式 。
?从而得出结论, 一个好的关系模式应该具备以
下四个条件,
?1,尽可能少的数据冗余 。
?2,没有插入异常 。
?3,没有删除异常 。
?4,没有更新异常 。
返回 391
? 但要注意, 一个好的关系模式并不是在任何情况下都是最优的,
? 比如查询某个学生选修课程名及所在系的系主任时, 要通过连接,
而连接所需要的系统开销非常大, 因此要以实际设计的目标出发进
行设计
? 如何按照一定的规范设计关系模式,将结构复杂的关系分解成结
构简单的关系,从而把不好的关系数据库模式转变为好的关系数
据库模式,这就是 关系的规范化 。
? 规范化又可以根据不同的要求而分成若干级别。
? 我们要设计的关系模式中的各属性是相互依赖、相互制约的,这
样才构成了一个结构严谨的整体。
? 因此在设计关模式时,必须从语义上分析这些 依赖关系 。
? 数据库模式的好坏和关系中各属性间的依赖关系有关,因此,我
们先讨论属性间的依赖关系,然后再讨论关系规范化理论。
返回 392
4.2 函数依赖
4.2.1 函数依赖的定义及性质
? 关系模式中的各属性之间相互依赖, 相互制约的联系称为 数据依
赖 。
? 数据依赖一般分为 函数依赖, 多值依赖 和 连接依赖 。
? 其中,函数依赖 是最重要的数据依赖 。
? 函数依赖 ( Functional Dependency) 是关系模式中属性之间的
一种 逻辑依赖关系 。
? 例如在上一节介绍的关系模式 SCD中, SNO与 SN,AGE,DEPT之间都有
一种依赖关系 。
? 由于一个 SNO只对应一个学生, 而一个学生只能属于一个系, 所以当
SNO的值确定之后, SN,AGE,DEPT的值也随之被唯一的确定了 。
? 这类似于变量之间的 单值函数关系 。 设单值函数 Y=F(X),自变量 X的
值可以决定一个唯一的函数值 Y。
? 在这里, 我们说 SNO决定函数 ( SN,AGE,DEPT), 或者说 ( SN,AGE,
DEPT) 函数依赖于 SNO。
返回 393
下面给函数依赖的形式化定义。
4.2.1.1 函数依赖的定义
定义 4.1 设关系模式 R(U,F),U是属性全集, F是 U上的函数依赖集,
X和 Y是 U的子集, 如果对于 R(U)的任意一个可能的关系 r,对于 X的每
一个具体值, Y都有唯一的具体值与之对应, 则称 X决定函数 Y,或 Y
函数依赖于 X,记作 X→Y 。 我们称 X为 决定因素, Y为 依赖因素 。 当 Y
不函数依赖于 X时, 记作,X Y。 当 X→Y 且 Y→X 时, 则记作,X Y。
?对于关系模式 SCD
? U={SNO,SN,AGE,DEPT,MN,CNO,SCORE}
? F={SNO→SN, SNO→AGE, SNO→DEPT}
?一个 SNO有多个 SCORE的值与其对应, 因此 SCORE不能唯一地确定,
即 SCORE不能函数依赖于 SNO,所以有,SNO SCORE。
?但是 SCORE可以被( SNO,CNO)唯一地确定。所以可表示为:
( SNO,CNO) → SCORE。
?
返回 394
有关函数依赖的几点说明,
1,平凡的函数依赖与非平凡的函数依赖 。
? 当属性集 Y是属性集 X的子集时, 则必然存在着函数依赖 X→Y,这种类
型的函数依赖称为平凡的函数依赖 。
? 如果 Y不是 X的子集, 则称 X→Y 为非平凡的函数依赖 。
? 若不特别声明, 我们讨论的都是非平凡的函数依赖 。
2,函数依赖是语义范畴的概念 。
? 我们只能根据语义来确定一个函数依赖, 而不能按照其形式化定义
来证明一个函数依赖是否成立 。
? 例如, 对于关系模式 S,当学生不存在重名的情况下, 可以得到,
? SN→AGE
? SN→DEPT
? 这种函数依赖关系,必须是在没有重名的学生条件下才成立的,否
则就不存在函数依赖了。
? 所以函数依赖反映了一种语义完整性约束。
返回 395
3,函数依赖与属性之间的联系类型有关 。
?( 1) 在一个关系模式中, 如果属性 X与 Y有 1:1联系时, 则存在函数
依赖 X→Y, Y→X, 即 X Y。
例如, 当学生无重名时, SNO SN。
?( 2) 如果属性 X与 Y有 1:m的联系时, 则只存在函数依赖 X→Y 。
? 例如, SNO与 AGE,DEPT之间均为 1:m联系, 所以有 SNO→AGE,
SNO→DEPT 。
?( 3) 如果属性 X与 Y有 m,n的联系时, 则 X与 Y之间不存在任何函数依
赖关系 。
? 例如, 一个学生可以选修多门课程, 一门课程又可以为多个学
生选修, 所以 SNO与 CNO之间不存在函数依赖关系 。
?由于函数依赖与属性之间的联系类型有关,所以在确定属性间的
函数依赖关系时,可以从分析 属性间的联系类型 入手,便可确定
属性间的函数依赖。
?
?
返回 396
4,函数依赖关系的存在与时间无关 。
?因为函数依赖是指关系中的所有元组应该满足的约束条件,
而不是指关系中某个或某些元组所满足的约束条件。
?当关系中的元组增加、删除或更新后都不能破坏这种函数依
赖。
?因此,必须根据语义来确定属性之间的函数依赖,而不能单
凭某一时刻关系中的实际数据值来判断。
?例如,对于关系模式 S,假设没有给出无重名的学生这种语义
规定,则即使当前关系中没有重名的记录,也只能存在函数
依赖 SNO→ SN,而不能存在函数依赖 SN→ SNO,因为如果新
增加一个重名的学生,函数依赖 SN→ SNO必然不成立。
?所以函数依赖关系的存在 与时间无关,而只与数据之间的 语
义规定 有关。
返回 397
5,函数依赖可以保证关系分解的无损连接性 。
?设 R( X,Y,Z), X,Y,Z为不相交的属性集合, 如果 X→Y 或
X→Z,则有 R(X,Y,Z)=R[X,Y]*R[X,Z],
?其中, R[X,Y]表示关系 R在属性 ( X,Y) 上的投影, 即 R等于
其投影在 X上的自然连接, 这样便保证了关系 R分解后不会丢
失原有的信息, 称作 关系分解的无损连接性 。
?例如,对于关系模式 SCD,有 SNO→ ( SN,AGE,DEPT,MN),
SCD( SNO,SN,AGE,DEPT,MN,CNO,SCORE) =SCD[SNO,SN,
AGE,DEPT,MN]*SCD[SNO,CNO,SCORE],也就是说,用其投
影在 SNO上的自然连接可复原关系模式 SCD。
?这一性质非常重要,在后一节的 关系规范化 中要用到。
返回 398
4.2.1.2 函数依赖的基本性质
1,投影性 。
? 根据平凡的函数依赖的定义可知, 一组属性函数决定它的所有子集 。
? 例如, 在关系 SCD中, ( SNO,CNO) → SNO和 ( SNO,CNO) → CNO。
2,扩张性 。
? 若 X→Y 且 W→Z, 则 ( X,W) → ( Y,Z) 。
? 例如, SNO→ ( SN,AGE), DEPT→MN, 则有 ( SNO,DEPT) → ( SN,AGE,
MN) 。
3,合并性 。
? 若 X→Y 且 X→Z 则必有 X→ ( Y,Z) 。
? 例如, 在关系 SCD中, SNO→ ( SN,AGE), SNO→ ( DEPT,MN), 则有 SNO→
( SN,AGE,DEPT,MN) 。
4,分解性 。
? 若 X→ ( Y,Z),则 X→Y 且 X→Z 。 很显然, 分解性为合并性的逆过程 。
? 由合并性和分解性, 很容易得到以下事实,
? X→A 1,A2,…,An成立的充分必要条件是 X→A i( i=1,2,…,n)成立。
返回 399
4.2.2 完全函数依赖与部分函数依赖
定义 4.2 设关系模式 R(U),U是属性全集, X和 Y是 U的子集,
? 如果 X→Y, 并且对于 X的任何一个真子集 X′,都有 X′ Y,则称 Y对 X
完全函数依赖 ( Full Functional Dependency), 记作 X Y。
? 如果对 X的某个真子集 X′, 有 X′ →Y, 则称 Y对部分函数依赖
( Partial Functional Dependency), 记作 X Y。
? 例如, 在关系模式 SCD中, 因为 SNO SCORE,且 CNO SCORE,所以
有,( SNO,CNO) SCORE 。
? 而 SNO→AGE, 所以 ( SNO,CNO) AGE。
? 由定义 4.2可知,
? 只有当决定因素是组合属性时,讨论部分函数依赖才有意义,
? 当决定因素是单属性时,只能是完全函数依赖。
? 例如,在关系模式 S( SNO,SN,AGE,DEPT),决定因素为单属性
SNO,有 SNO→ ( SN,AGE,DEPT),不存在部分函数依赖。
? ?? f
? ?? p
? ?? f
? ?? p
返回 400
4.2.3 传递函数依赖
定义 4.3 设有关系模式 R( U), U是属性全集, X,Y,
Z是 U的子集,
? 若 X→Y, 但 Y X,而 Y→Z ( Y X,Z Y), 则称 Z对 X传递函数依赖
( Transitive Functional Dependency), 记作,X Z。
? 如果 Y→X, 则 X Y,这时称 Z对 X直接函数依赖, 而不是传递函数依
赖 。
? 例如, 在关系模式 SCD 中, SNO→DEPTN, 但 DEPTN SNO, 而
DEPTN→MN, 则有 SNO MN。 当学生不存在重名的情况下, 有
SNO→SN, SN→SNO, SNO SN,SN→DEPTN, 这时 DEPTN对 SNO是 直接
函数依赖, 而不是传递函数依赖 。
? 综上所述, 函数依赖分为 完全函数依赖, 部分函数依赖 和 传递函数
依赖 三类, 它们是规范化理论的依据和规范化程度的准则, 下面我
们将以介绍的这些概念为基础, 进行数据库的 规范设计 。
? ?
? ?? t
?
? ?? t
?
返回 401
4.3 范式
? 规范化的 基本思想 是消除关系模式中的数据冗余,消除数据依赖
中的不合适的部分,解决数据插入、删除时发生异常现象。
? 这就要求关系数据库设计出来的关系模式要满足一定的条件。
? 我们把关系数据库的规范化过程中为不同程度的规范化要求设立
的不同标准称为 范式 ( Normal Form)。
? 由于规范化的程度不同,就产生了 不同的范式 。
? 满足最基本规范化要求的关系模式叫 第一范式,
? 在第一范式中进一步满足一些要求为 第二范式,
? 以此类推就产生了 第三范式 等概念。
? 每种范式都规定了一些限制约束条件。
返回 402
?范式的概念最早由 E.F.Codd提出 。
?从 1971年起, Codd相继提出了关系的三级规范化形式,
即第一范式 ( 1NF), 第二范式 ( 2NF), 第三范式
( 3NF) 。
?1974年, Codd和 Boyce以共同提出了一个新的范式的概
念, 即 Boyce-Codd范式, 简称 BC范式 。
?1976年 Fagin提出了第四范式,
?后来又有人定义了第五范式 。
?至此在关系数据库规范中建立了一个范式系列:
1NF,2NF,3NF,BCNF,4NF,5NF,一级比一级有更严格的要求 。
?各个范式之间的联系可以表示为,
?5NF 4NF BCNF 3NF 2NF 1NF
?如图 4.3所示。
? ? ? ? ?
返回 403
图 4.3 各种范式之间的关系
下面逐一介绍各级范式及其规范化。
返回 404
4.3.1 第一范式
?第一范式 ( First Normal Form) 是最基本的规范形式,
即关系中每个属性都是不可再分的简单项 。
定义 4.4 如果关系模式 R,其所有的属性均为简单属性,
即每个属性都城是不可再分的, 则称 R属于第一范式, 简
称 1NF,记作 R?1NF。
?在第 2章讨论关系的性质时,我们把满足这个条件的关系称为 规范
化关系 。
?在关系数据库系统中只讨论规范化的关系,凡是非规范化的关系
模式必须化成规范化的关系。
?在非规范化的关系中去掉组合项就能化成规范化的关系。
?每个规范化的关系都属于 1NF,这也是它之所以称为, 第一, 的原
因。
返回 405
?然而, 一个关系模式仅仅属于第一范式是不适用的 。
?在 4.1节中给出的关系模式 SCD属于第一范式, 但其具
有大量的数据冗余, 具有插入异常, 删除异常, 更新
异常等弊端 。
?为什么会存在这种问题呢?
?让我们分析一下 SCD中的函数依赖关系, 它的关系键
是 ( SNO,CNO) 的属性组合, 所以有,
?( SNO,CNO) SCORE
?SNO→SN, ( SNO,CNO) SN
?SNO→AGE, ( SNO,CNO) AGE
?SNO→DEPT, ( SNO,CNO) DEPT
?SNO MN,( SNO,CNO) MN
? ?? f
? ?? p
? ?? p
? ?? p
? ?? p? ?? t
返回 406
我们可以用函数信赖图表示以上函数依赖关系,如图 4.4所示。
SDN
MN
SNO
图 4.4 SCD中的函数依赖关系
SNO
CNO
P
P
f
?由此可见,在 SCD中,既存在完全函数依赖,又存在部分函数依赖
和传递函数依赖。
?这种情况往往在数据库中是不允许的,也正是由于关系中存在着复
杂的函数依赖,才导致数据操作中出现了种弊端。
?克服这些弊端的方法是用投影运算将关系分解,去掉过于复杂的函
数依赖关系,向更高一级的范式进行转换。
返回 407
4.3.2 第二范式
4.3.2.1 第二范式的定义
定义 4.5 如果关系模式 R?1NF,且每个非主属性都完全函数依赖于
R的每个关系键, 则称 R属于 第二范式 ( Second Normal Form), 简
称 2NF,记作 R?2NF。
?在关系模式 SCD中,SNO,CNO为主属性,AGE,DEPT,MN,MN,
SCORE均为非主属性,经上述分析,存在非主属性对关系键的部分函
数依赖,所以 SCD2NF。
?而如图 4.2所示的由 SCD分解的三个关系模式 S,D,SC,其中 S的关
系键为 SNO,D的关系键为 DEPT,都是单属性,不可能存在部分函数
依赖。
?而对于 SC,( SNO,CNO) SCORE。所以 SCD分解后,消除了非
主属性对关系键的部分函数依赖,S,D,SC均属于 2NF。
? ?? f
返回 408
? 又如在 2.4.2中, 讲述全码的概念时给出的关系模式
TCS( T,C,S),
?一个教师可以讲授多门课程, 一门课程可以为多个教师讲授,
?同样一个学生可以选听多门课程, 一门课程可以为多个学生
选听,
?(T,C,S)三个属性的组合是关系键, T,C,S都是主属性, 而无
非主属性, 所以也就不可能存在非主属性对关系键的部分函
数依赖, TCS?2NF。
? 经以上分析, 可以得到两个结论,
?1,从 1NF关系中消除非主属性对关系键的部分函数依赖, 则
可得到 2NF关系 。
?2,如果 R的关系键为单属性, 或 R的全体属性均为主属性, 则
R?2NF。
返回 409
4.3.2.2 2NF规范化
?2NF规范化是指把 1NF关系模式通过投影分解转换成 2NF关系模式的
集合 。
?分解时遵循的基本原则就是, 一事一地,, 让一个关系只描述一
个实体或者实体间的联系 。 如果多于一个实体或联系, 则进行投影
分解 。
?下面以关系模式 SCD为例, 来说明 2NF规范化的过程
例 4.1 将 SCD(SNO,SN,AGE,DEPT,MN,CNO,SCORE)规范到 2NF。
? 由 SNO→SN, SNO→AGE, SNO→DEPT,( SNO,CNO) SCORE,可
以判断,关系 SCD至少描述了两个实体,
? 一个为学生实体,属性有 SNO,SN,AGE,DEPT,MN;
? 另一个是学生与课程的联系(选课),属性有 SNO,CNO和 SCORE。
? 根据分解的原则,我们可以将 SCD分解成如下两个关系,如图 4.5所
示。 ? ?? f
返回 410
?SD(SNO,SN,AGE,DEPT,MN),描述学生实体;
?SC(SNO,CNO,SCORE),描述学生与课程的联系 。
SD
SNO
SN
AGE
DEPT
MN
S1 赵亦 17 计算机 刘伟
S2
钱尔
18
信息
王平
S3 孙珊 20 信息 王平
S4
李思
21
自动化
刘伟
SC SNO
CNO
SCORE
S1 C1 90 S1
C2
85
S2 C5 57 S2
C6
80
S2 C7 S2
C5
70
S3 C1 0 S3
C2
70
S3 C4 85 S4
C1
93
图 4.5 关系 SD和 SC
返回 411
? 对于分解后的两个关系 SD和 SC,主键分别为 SNO和( SNO,CNO),
非主属性对主键完全函数依赖。因此,SD?2NF,SC?2NF,而且
前面已经讨论,SCD的这种分解没有丢失任何信息,具有无损连
接性。
? 分解后,SD和 SC的函数依赖分别如图 4.6和 4.7所示。
SNO
SN SNO
CNO
SCORE AGE
DEPT
MN
图 4.6 SD中的函数依赖关系 图 4.7 SC中的函数依赖关系
返回 412
? 1NF的关系模式经过投影分解转换成 2NF后,消除了一些数据冗余。
? 分析图 4.5中 SD和 SC中的数据,可以看出,它们存储的冗余度比
关系模式 SCD有了较大辐度的降低。
? 学生的姓名、年龄不需要重复存储多次。
? 这样便可在一定程度上避免数据更新所造成的数据不一致性的问
题。
? 由于把学生的基本信息与选课信息分开存储,则学生基本信息因
没选课而不能插入的问题得到了解决,插入异常现象得到了部分
改善。
? 同样,如果某个学生不再选修 C1课程,只在选课关系 SC中删去该
该学生选修 C1的记录即可,而 SD中有关该学生的其它信息不会受
到任何影响,也解决了部分删除异常问题。
? 因此可以说关系模式 SD和 SC在性能上比 SCD有了显著提高。
返回 413
下面对 2NF规范化作 形式化的描述 。
?设关系模式 R( X,Y,Z), R?1NF,但 R2NF,其中,
X是 键属性, Y,Z是 非键属性, 且存在部分函数依赖,
X Y。 设 X可表示为 X1,X2,其中 X1 Y。 则 R( X,
Y,Z) 可以分解为 R[X1,Y]和 R[X,Z]。
?因为 X1→Y, 所以 R(X,Y,Z)=R[X1,Y]*R[X1,X2,
Z]=R[X1,Y]*R[X,Z],即 R等于其投影 R[X1,Y]和 [X,
Z]在 X1上的 自然连接, R的分解具有 无损连接性 。
?由于 X1 Y,因此 R[X1,Y]?2NF。若 R[X,Z]2NF,
可以按照上述方法继续进行投影分解,直到将 R[X,Z]
分解为属于 2NF关系的集合,且这种分解必定是有限的。
? ?? p
? ?? f
? ?? f
返回 414
4.3.2.3 2NF的缺点
?2NF的关系模式解决了 1NF中存在的一些问题, 2NF规范化的程度比
1NF前进了一步, 但 2NF的关系模式在进行数据操作时, 仍然存在着
一些问题,
?1,数据冗余 。 每个系名和系主任的名字存储的次数等于该系的学生
人数 。
?2,插入异常 。 当一个新系没有招生时, 有关该系的信息无法插入 。
?3,删除异常 。 某系学生全部毕业而没有招生时, 删除全部学生的记
录也随之删除了该系的有关信息 。
?4,更新异常 。 更换系主任时, 仍需改动较多的学生记录 。
?之所以存在这些问题,是由于在 SCD中存在着非主属性对主键的传
递依赖。
?分析 SCD中的函数依赖关系,SNO→SN, SNO→AGE, SNO→DEPT,
DEPT→MN, SNO MN,非主属性 MN对主键 SNO传递依赖。
?为此,对关系模式 SCD还需进一步简化,消除这种传递依赖,得到
3NF。 ? ?? t
返回 415
4.3.3 第三范式
4.3.3.1 第三范式的定义
定义 4.6 如果关系模式 R?2NF,且每个非主属性都不传递依赖于 R
的每个关系键, 则称 R属于第三范式 ( Third Normal Form), 简称
3NF,记作 R?3NF。
?第三范式具有如下性质,
1,如果 R?3NF,则 R也是 2NF。
? 证明,3NF的另一种等价描述是:对于关系模式 R,不存在如下条件
的函数依赖,X→Y ( Y X),Y→Z,其中 X是键属性,Y是任意属性
组,Z是非主属性,Z Y。在此定义下,令 Y X,Y是 X的真子集,
则以上条件 X→Y, Y→Z 就变成了非主属性对键 X的部分函数依赖,X
Z。但由于 3NF中不存在这样的函数依赖,所以 R中不可能存在非主
属性对键 X的部分函数依赖,R必定是 2NF。 ?
?
? ?? p
返回 416
2,如果 R?2NF,则 R不一定是 3NF。
?例如,我们前面由关系模式 SCD分解而得到的 SD和 SC都为 2NF,
其中,SC?3NF,但在 SD中存在着非主属性 MN对主键 SNO传递依
赖,SD3NF。对于 SD,应该进一步进行分解,使其转换成 3NF。
4.3.3.2 3NF规范化
?3NF规范化 是指把 2NF关系模式通过投影分解转换成 3NF关系模式的
集合 。
?和 2NF的规范化时遵循的原则相同, 即, 一事一地,, 让一个关系
只描述一个实体或者实体间的联系 。
?下面以 2NF关系模式 SD为例,来说明 3NF规范化的过程。
返回 417
例 4.2 将 SD(SNO,SN,AGE,DEPT,MN)规范到 3NF。
? 分析 SD的属性组成, 可以判断, 关系 SD实际上描述了两个实
体,
? 一个为学生实体, 属性有 SNO,SN,AGE,DEPT;
? 另一个是系的实体, 其属性 DEPT和 MN。
?根据分解的原则, 我们可以将 SD分解成如下两个关系, 如图
4.8所示 。
? S(SNO,SN,AGE,DEPT),描述学生实体;
? D(DEPT,MN),描述系的实体。
返回 418
S D
SNO
SN
AGE
DEPT
DEPT
MN
S1
赵亦
17
计算机
计算机
刘伟
S2
钱尔
18
信息
信息
王平
S3
孙珊
20
信息
自动化
刘伟
S4
李思
21
自动化
?对于分解后的两个关系 S和 D,主键分别为 SNO和 DEPT,
不存在非主属性对主键的传递函数依赖 。 因此, S?3NF,
D?3NF。
图 4.8 关系 S和 D
返回 419
? 分解后, S和 D的函数依赖分别如图 4.9和 4.10所示 。
SNO
SN
DEPT AGE
DEPT
MN
图 4.9 S中的函数依赖关系图 图 4.10 D中的函数依赖关系图
由以上两图可以看出, 关系模式 SD由 2NF分解为 3NF后, 函数依赖关系变得
更加简单, 既没有非主属性对键的部分依赖, 也没有非主属性对键的传递
依赖, 解决了 2NF中存在的四个问题 。
返回 420
1,数据冗余降低 。 系主任的名字存储的次数与该系的学生人数无关, 只在关系 D中存
储一次 。
2,不存在插入异常 。 当一个新系没有学生时, 该系的信息可以直接插入到关系 D中,
而与学生关系 S无关 。
3,不存在删除异常 。 要删除某系的全部学生而仍然保留该系的有关信息时, 可以只
删除学生关系 S中的相关学生记录, 而不影响系关系 D中的数据 。
4.不存在更新异常。更换系主任时,只需修改关系 D中一个相应元组的 MN属性值,
从而不会出现数据的不一致现象。
? SCD规范到 3NF后, 所存在的异常现象已经全部消失 。
? 但是, 3NF只限制了非主属性对键的依赖关系, 而没有限制主属性对键的依赖关系 。
? 如果发生了这种依赖, 仍有可能存在数据冗余, 插入异常, 删除异常和修改异常 。
? 这时, 则需对 3NF进一步规范化, 消除主属性对键的依赖关系, 为了解决这种问题,
Boyce与 Codd共同提出了一个新范式的定义, 这就是 Boyce-Codd范式, 通常简称
BCNF或 BC范式 。 它弥补了 3NF的不足 。
返回 421
4.3.4 BC范式
4.3.4.1 BC范式的定义
定义 4.7 如果关系模式 R?1NF,且所有的函数依赖 X→Y
( Y X),决定因素 X都包含了 R的一个候选键, 则称 R
属于 BC范式 ( Boyce-Codd Normal Form), 记作
R?BCNF。
BCNF具有如下性质,
?1,满足 BCNF的关系将消除任何属性 ( 主属性或非主属性 ) 对
键的部分函数依赖和传递函数依赖 。 也就是说, 如果 R?BCNF,
则 R也是 3NF。
?证明:采用反证法。设 R不是 3NF。则必然存在如下条件的函
数依赖,X→Y ( Y X),Y→Z,其中 X是键属性,Y是任意属性
组,Z是非主属性,Z Y,这样 Y→Z 函数依赖的决定因素 Y不包
含候选键,这与 BCNF范式的定义相矛盾,所以如果 R?BCNF,则
R也是 3NF。
?
?
返回 422
2,如果 R?3NF,则 R不一定是 BCNF。
? 现举例说明。设关系模式 SNC( SNO,SN,CN0,SCORE),其中 SNO代表
学号,SN代表学生姓名并假设没有重名,CNO代表课程号,SCORE代表成
绩。可以判定,SNC有两个候选键( SNO,CNO)和( SN,CNO),其函数
依赖如下,
? SNO SN
? ( SNO,CNO) → SCORE
? ( SN,CNO) → SCORE。
? 唯一的非主属性 SCORE对键不存在部分函数依赖,也不存在传递函数依
赖。所以 SNC?3NF。
? 但是,因为 SNO SN,即决定因素 SNO或 SN不包含候选键,从另一个角
度说,存在着主属性对键的部分函数依赖,( SNO,CNO)
SN,( SN,CNO) SNO,所以 SNC不是 BCNF。
? 正是存在着这种主属性对键的部分函数依赖关系,造成了关系 SNC中存
在着较大的数据冗余,学生姓名的存储次数等于该生所选的课程数。从
而会引起修改异常。
? 比如,当要更改某个学生的姓名时,则必须搜索出现该姓名的每个学生
记录,并对其姓名逐一修改,这样容易造成数据的不一致问题。
? 解决这一问题的办法仍然是通过投影分解进一步提高 SNC的范式等级,
将 SNC规范到 BCNF。
?
?
? ?? p ? ?? p
返回 423
4.3.4.2 BCNF规范化
? BCNF规范化是指把 3NF关系模式通过投影分解转换成 BCNF关系模
式的集合 。
下面以 3NF关系模式 SNC为例, 来说明 BCNF规范化的过程 。
例 4.3 将 SNC(SNO,SN,CNO,SCORE)规范到 BCNF。
? 分析 SNC数据冗余的原因, 是因为在这一个关系中存在两个实体,
一个为学生实体, 属性有 SNO,SN;另一个是选课实体, 属性有
SNO,CNO和 SCORE。
? 根据分解的原则, 我们可以将 SNC分解成如下两个关系,
? S1(SNO,SN),描述学生实体;
? S2(SNO,CNO,SCORE),描述学生与课程的联系 。
? 对于 S1,有两个候选键 SNO和 SN,
? 对于 S2,主键为( SNO,CNO)。
? 在这两个关系中,无论主属性还是非主属性都不存在对键的部分
依赖和传递依赖,S1?BCNF,S2?BCNF。
返回 424
分解后, S1和 S2的函数依赖分别如图 4.11和 4.12所示 。
SNO SN
SNO
CNO
SCORE
图 4.11 S1中的函数依赖关系 图 4.12 S2中的函数依赖关系
? 关系 SNC转换成 BCNF后,数据冗余度明显降低。
?学生的姓名只在关系 S1中存储一次,学生要改名时,只需改动一条
学生记录中的相应的 SN值,从而不会发生修改异常。
返回 425
例 4.4 设关系模式 TCS( T,C,S), T表示教师, C表示课程, S表示学生 。
语义假设是, 每一位教师只讲授一门课程;每门课程由多个教师讲授;
某一学生选定某门课程, 就对应于一确定的教师 。
? 根据语义假设, TCS的函数依赖是,
? ( S,C) → T,( S,T) → C,T→C 。
? 函数依赖图如图 4.13所示。
S
C
T
S
T
C
4.13 TCS中的函数依赖关系
返回 426
?对于 TCS,( S,C) 和 ( S,T) 都是候选键, 两个候选键相交, 有
公共的属性 S。 TCS中不存在非主属性, 也就不可能存在非主属性对
键的部分依赖或传递依赖, 所以 TCS?3NF。
?但从 TCS的一个关系实例 ( 如图 4.14) 分析, 仍存在一些问题 。
T
C S
T1 C1 S1 T1
C1
S2
T2 C1 S3
T2
C1
S4
T3 C2 S2
T4
C2
S2
T4 C3 S2
图 4.14 关系 TCS
返回 427
1,数据冗余 。 虽然每个教师只开一门课, 但每个选修该教师该该门
课程的学生元组都要记录这一信息 。
2,插入异常 。 当某门课程本学期不开, 自然就没有学生选修 。 没有
学生选修, 因为主属性不能为空, 教师上该门课程的信息就无法
插入 。 同样原因, 学生刚入校,尚未选课, 有关信息也不能输入 。
3,删除异常 。 如果选修某门课程的学生全部毕业, 删除学生记录的
同时,随之也删除了教师开设该门课程的信息 。
4,更新异常。 当某个教师开设的某门课程改名后,所有选修该教师
该门课程的学生元组都要进行修改,如果漏改某个数据,则破坏
了数据的完整性。
返回 428
? 分析出现上述问题的原因在于主属性部分依赖于键, ( S,T) C,
因此关系模式还继续分解, 转换成更高一级的范式 BCNF,以消除
数据库操作中的异常现象 。
? 将 TCS分解为两个关系模式 ST( S,T) 和 TC( T,C), 消除函数
依赖 ( S,T) C。 其中 ST的键为 S,TC的键为 T。 ST?BCNF,
TC?BCNF。 这两个关系模式的函数依赖图分别如图 4.15和 4.16所
示 。
S T T C
图 4.15 ST中的函数依赖关系 图 4.16 TC中的函数依赖关系
返回 429
? 关系模式 TCS由规范到 BCNF后, 使原来存在的四个异常问题得到解决 。
? 1,数据冗余降低 。 每个教师开设课程的信息只在 TC关系中存储一次 。
? 2,不存在插入异常 。 对于所开课程尚未有学生选修的教师信息可以直接存
储在关系 TC中, 而对于尚未选修课程的学生可以存储在关系 ST中 。
? 3,不存在删除异常 。 如果选修某门课程的学生全部毕业, 可以只删除关系
ST中的相关学生记录, 而不影响系关系 TC中相应教师开设该门课程的信息 。
? 4,不存在更新异常 。 当某个教师开设的某门课程改名后, 只需修改关系 TC
中的一个相应元组即可, 不会破坏数据的完整性 。
? 如果一个关系数据库中所有关系模式都属于 3NF,则已在很大程度上消
除了插入异常和删除异常, 但由于可能存在主属性对候选键的部分依赖
和传递依赖, 因此关系模式的分离仍不够彻底 。
? 如果一个关系数据库中所有关系模式都属于 BCNF,那么在函数依赖的范
畴内, 已经实现了模式的彻底分解, 消除了产生插入异常和删除异常的
根源, 而且数据冗余也减少到极小程度 。
返回 430
4.4 关系模式的规范化
? 到目前为止, 规范化理论已经提出了六类范式 ( 有关 4NF和 5NF的
内容不再详细介绍 ) 。
? 各范式级别是在分析函数依赖条件下对关系模式分离程度的一种
测度, 范式级别可以逐级升高 。
? 一个低一级范式的关系模式, 通过模式分解转化为若干个高一级
范式的关系模式的集合, 这种分解过程叫作关系模式的 规范化
( Normalization) 。
4.4.1 关系模式规范化的目的和原则
? 一个关系只要其分量都是不可分的数据项,就可称作规范化的关系,但
这只是最基本的规范化。
? 这样的关系模式是合法的。
? 但人们发现有些关系模式存在插入、删除、修改异常、数据冗余等弊病。
? 规范化的目的就是使结构合理,消除存储异常,使数据冗余尽量小,便
于插入、删除和更新。
返回 431
? 规范化的 基本原则 就是遵从概念单一化, 一事一地, 的原则, 即一个关
系只描述一个实体或者实体间的联系 。
? 若多于一个实体, 就把它, 分离, 出来 。
? 因此, 所谓规范化, 实质上是概念的单一化, 即一个关系表示一个实体 。
4.4.2 关系模式规范化的步骤
? 规范化就是对原关系进行投影, 消除决定属性不是候选键的任何
函数依赖 。 具体可以分为以下几步,
? 1,对 1NF关系进行投影, 消除原关系中非主属性对键的部分函数依
赖, 将 1NF关系转换成若干个 2NF关系 。
? 2,对 2NF关系进行投影, 消除原关系中非主属性对键的传递函数依
赖, 将 2NF关系转换成若干个 3NF关系 。
? 3,对 3NF关系进行投影, 消除原关系中主属性对键的部分函数依赖
和传递函数依赖, 也就是说使决定因素都包含一个候选键 。 得到一
组 BCNF关系 。
返回 432
关系规范化的基本步骤如图 4.17所示。
1NF
2NF
3NF
BCNF
消除决定属性
不是候选键的
非平凡的函数
依赖
消除非主属性对键的部分函数依赖
消除非主属性对键的传递函数依赖
消除主属性对键的部分和传递函数依赖
图 4.17 规范化过程
?一般情况下,我们说没有异常弊病的数据库设计是好的数据库设计,一个不
好的关系模式也总是可以通过分解转换成好的关系模式的集合。
?但是在分解时要全面衡量,综合考虑,视实际情况而定。
?对于那些只要求查询而不要求插入、删除等操作的系统,几种异常现象的存
在并不影响数据库的操作。这时便不宜过度分解,否则当要对整体查询时,
需要更多的多表连接操作,这有可能得不偿失。
?在实际应用中,最有价值的是 3NF和 BCNF,在进行关系模式的设计时,通常
分解到 3NF就足够了。
返回 433
4.4.2 关系模式规范化的要求
? 关系模式的规范化过程是通过对关系模式的投影分解来实现的, 但是投
影分解方法不是唯一的, 不同的投影分解会得到不同的结果 。
? 在这些分解方法中, 只有能够保证分解后的关系模式与原关系模式等价
的方法才是有意义的 。
下面先给出两个定义,
? 无损连接性 ( Lossless Join),设关系模式 R(U,F)被分解为若干个关
系模式 R1(U1,F1),R2(U2,F2),…,Rn(Un,Fn),其中 U=U1U2… UN,且不
存在 UNUj式, Fi为 F在 Uj上的投影, 如果 R与 R1,R2,…, Rn自然连接的结
果相等, 则称关系模式 R的分解具有无损连接性 。
? 函数依赖保持性 ( Preserve Dependency),设关系模式 R(U,F)被分解
为若干个关系模式 R1(U1,F1),R2(U2,F2),…,Rn(Un,Fn),其中
U=U1U2… UN,且不存在 UNUj式, Fi为 F在 Uj上的投影, 如果 F所蕴含的函数
依赖一定也由分解得到的某个关系模式中的函数依赖 Fi所蕴含, 则称关
系模式 R的分解具有函数依赖保持性 。
返回 434
? 判断对关系模式的一个分解是否与原关系模式等价可以有三种不同的标
准,
? 1,分解要具有无损连接性 。
? 2,分解要具有函数依赖保持性 。
? 3,分解既要具有无损连接性, 又要具有函数依赖保持性 。
例如, 对于 4.3.2.2中例 4.2的关系模式 SD(SNO,SN,AGE,DEPT,MN),规范到
3NF,可以有以下三种不同的分解方法,
? 第一种,
? S(SNO,SN,AGE,DEPT)
? D(DEPT,MN)
? SD( SNO,SN,AGE,DEPT,MN) =S[SNO,SN,AGE,DEPT]*D[DEPT,MN],
? 也就是说, 用其两个投影在 DEPT上的自然连接可复原关系模式 SD。 也就是说
这种分解具有无损连接性 。
? 对于分解后的关系模式 S,有函数依赖 SNO→DEPT, 对于 D,有函数依赖
DEPT→MN, 这种分解方法保持了原来的 SD中的两个完全函数依赖
SNO→DEPT, DEPT→MN 。 分解既具有无损连接性, 又具有函数依赖保持
性 。
? 前面已经给出详细的论述,这是一种正确的分解方法。
返回 435
? 第二种,
? S1(SNO,SN,AGE,DEPT)
? D1(SNO,MN)
? 分解后的关系如图 4.18所示 。
S1 D1
SNO
SN
AGE
DEPT
SNO
MN
S1
赵亦
17
计算机
S1
刘伟
S2
钱尔
18
信息
S2
王平
S3
孙珊
20
信息
S3
王平
S4
李思
21
自动化
S4
刘伟
图 4.18 关系 S1和 D1
返回 436
? 分解以后, 两个关系的主键都为 SNO,也不存在非主属性对
主键的传递函数依, 所以两个关系均属于 3NF。
? 且 SD=S1*D1,关系模式 SD等于 S1和 D1在 SNO上的自然连接,
这种分解也具有无损连接性, 保证不丢失原关系中的信息 。
但这种分解结果, 仍然存在着一些问题,
?1,数据冗余 。 每个系名和系主任的名字存储的次数等于该系
的学生人数 。
?2,插入异常 。 当一个新系没有招生时, 系主任的名字则无法
插入 。
?3,删除异常 。 某系学生全部毕业而没有招生时, 要删除全部
学生的记录, 两个关系都要涉及, 有关该系的信息将被删除 。
?4,更新异常 。 更换系主任时, 需改动较多的学生记录 。 另外,
某个学生要转系, 还必须修改两个关系 。
返回 437
? 之所以存在上述问题, 是因为分解得到的两个关系模
式不是相互独立的 。
? SD中的函数依赖 DEPT→MN 既没有投影到关系模式 S1上,
也没有投影到关系模式 D1上, 而是跨在这两个关系模
式上, 也就是说这种分解方法没有保持原关系中的函
数依赖, 却用了原关系隐含的传递函数依赖 SNO MN。
? 分解只具有无损连接性, 而不具有函数依赖保持性 。
? 因此,, 弊病, 仍然没有解决 。
? ?? t
返回 438
? 第三种,
? S2(SNO,SN,AGE,MN)
? D2(DEPT,MN)
? 分解后的关系如图 4.19所示 。
S2 D2
SNO
SN
AGE
MN
DEPT
MN
S1
赵亦
17
刘伟
计算机
刘伟
S2
钱尔
18
王平
信息
王平
S3
孙珊
20
王平
自动化
刘伟
S4
李思
21
刘伟
图 4.19 关系 S2和 D2
返回 439
? 分解以后, 两个关系均为 3NF,公共属性为 MN,但 MN
SNO,MN DEPT,所以 S2*D2≠SD 。
? S2和 D2在 MN上的自然连接的结果如图 4.20。
SNO
SN
AGE
DEPT
MN
S1
赵亦
17
计算机
刘伟
S1
赵亦
17
自动化
刘伟
S2
钱尔
18
信息
王平
S3
孙珊
20
信息
王平
S4
李思
21
计算机
刘伟
S4
李思
21
自动化
刘伟
图 4.20 S2和 D2的自然连接
返回 440
? S2*D2比原来的关系 SD多了两个元组 ( S1,赵亦, 17,自动化,
刘伟 ) 和 ( S4,李思, 21,计算机, 刘伟 ), 因此也无法知道原
来的 SD关系中究竟有哪些元组, 从这个意义上说, 此分解方法仍
然丢失了信息 。 所以其分解是不可恢复的 。
? 另外, 这种分解方法只保持了原来的 SD中的 DEPT→MN 这个完全函
数依赖而未用另外一个 SNO→DEPT 完全依赖, 却用了原关系的传
递函数依赖 SNO MN。 所以分解既不具有无损连接性, 也不具有
函数依赖保持性, 同样存在着数据操作的异常情况 。
? 经以上几种分解方法的分析, 如果一个分解具有无损连接性, 则
能够保证不丢失信息 。 如果一个分解具有函数依赖保持性, 则可
以减轻或解决各种异常情况 。
? 分解具有无损连接性和函数依赖保持性是两个相互独立的标准 。
具有无损连接性的分解不一定具有函数依赖保持性 。 同样, 具有
函数依赖保持性的分解也不一定具有无损连接性 。
? ?? t
返回 441
? 规范化理论提供了一套完整的模式分解方法, 按照这套算法可以
做到:如果要求分解既具有无损连接性, 以具有函数依赖保持性,
则分解一定能够达到 3NF,但不一定能够达到 BCNF。
? 所以在 3NF的规范化中, 既要检查分解是否具有无损连接性, 又
要检查分解是否具有函数依赖保持性 。
? 只有这两条都满足, 才能保证分解的正确性和有效性, 才既不会
发生信息丢失, 又保证关系中的数据满足完整性约束 。
返回 442
小 结
? 在这一章,我们首先由关系模式的存储异常问题引出了函数依赖的概念,
其中包括完全函数依赖、部分函数依赖和传递函数依赖,这些概念是规
范化理论的依据和规范化程度的准则。
? 规范化就是对原关系进行投影,消除决定属性不是候选键的任何函数依
赖。
? 一个关系只要其分量都是不可分的数据项,就可称作规范化的关系,也
称作 1NF。
? 消除 1NF关系中非主属性对键的部分函数依赖,得到 2NF,消除 2NF关系
中非主属性对键的传递函数依赖,得到 3NF,消除 3NF关系中主属性对
键的部分函数依赖和传递函数依赖,便可得到一组 BCNF关系。
? 在规范化过程中,逐渐消除存储异常,使数据冗余尽量小,便于插入、
删除和更新。
? 规范化的基本原则就是遵从概念单一化, 一事一地, 的原则,即一个关
系只描述一个实体或者实体间的联系。
? 规范化的投影分解方法不是唯一的,对于 3NF的规范化,分解既要具有
无损连接性,又要具有函数依赖保持性。
返回 443
第 5章 数据库安全保护
返回 444
本章概要
? 随着计算机的普及,数据库的使用也越来越广泛。
?例如,一个企业的全部信息,国家机构的事务管理信息,国
防情报等机密信息,都集中地存放在数据库中。
? 在前面我们已经讲到,数据库系统中的数据是由 DBMS
统一进行管理和控制的。
? 为了适应和满足数据共享的环境和要求,DBMS要保证
整个系统的正常运转,防止数据意外丢失和不一致数
据的产生,以及当数据库遭受破坏后能迅速地恢复正
常,这就是 数据库的安全保护 。
? DBMS对数据库的安全保护功能是通过四方面实现的,
即安全性控制、完整性控制、并发性控制和数据库恢
复。
? 本章就是从这四方面来介绍数据库的安全保护功能,
?要求掌握安全性、完整性、并发性和数据库恢复的含义,
?掌握这四方面分别实现安全保护功能的方法。
返回 445
5.1.1 数据库安全性的含义
? 数据库的安全性是指保护数据库, 以防止非法使用所
造成数据的泄露, 更改或破坏 。
? 安全性问题有许多方面, 其中包括,
( 1) 法律, 社会和伦理方面, 例如请求查询信息的人是不
有合法的权力 。
( 2) 物理控制方面, 例如计算机机房或终端是否应该加锁
或用其他方法加以保护 。
( 3) 政策方面, 确定存取原则, 允许哪些用户存取哪些数
据 。
( 4) 运行方面, 使用口令时, 如何使口令保持秘密 。
( 5) 硬件控制方面, CPU是否提供任何安全性方面的功能,
诸如存储保护键或特权工作方式 。
5.1 数据库的安全性
返回 446
( 6) 操作系统安全性方面, 在主存储器和数据文件用过以后, 操
作系统是否把它们的内容清除掉 。 ( 7) 数据库系统本身安全性
方面 。 这里讨论的是数据库本身的安全性问题, 即主要考虑安
全保护的策略, 尤其是控制访问的策略 。
5.1.2 安全性控制的一般方法
? 安全性控制是指要尽可能地杜绝所有可能的数据库非法
访问 。
? 用户非法使用数据库可以有很多种情况 。 例如, 编写合
法的程序绕过 DBMS授权机制, 通过操作系统直接存取,
修改或备份有关数据 。
? 用户访问非法数据, 无论它们是有意的还是无意的,都
应该加以严格控制, 因此, 系统还要考虑数据信息的流
动问题并加以控制, 否则有隐蔽的危险性 。
返回 447
?因为数据的流动可能使无权访问的用户获得访
问权利。
?例如,甲用户可以访问文件 F1,但无权访问文件 F2,
如果乙用户把文件 F2移至文件 F1中之后,则由于乙
用户的操作,使甲用户获得了对文件 F2的访问权。
此外,用户可以多次利用允许的访问结果,经过逻
辑推理得到他无权访问的数据。
?为防止这一点,访问的许可权还要结合过去访
问的情况而定。
?可见安全性的实施是要花费一定代价的,安全
保护策略就是要以最小的代价来防止对数据的
非法访问,层层设置安全措施。
返回 448
?实际上, 安全性问题并不是数据库系统所独有
的, 所有计算机系统中都存在这个问题 。
?在计算机系统中, 安全措施是一级一级层层设
置的, 安全控制模型如图 5.1所示 。
图 5.1 安全控制模型
用户标识
和鉴定
用户
用户存取
权限控制
DBMSM
MS
操作系统
安全保护
OS
密码存储
DB
返回 449
?根据图 5.1的安全模型,当用户进入计算机系
统时,系统首先根据输入的用户标识进行身份
的鉴定,只有合法的用户才准许进入系统。
?对已进入系统的用户,DBMS还要进行存取控制,
只允许用户进行合法的操作。
?DBMS是建立在操作系统之上的,安全的操作系
统是数据库安全的前提。
?操作系统应能保证数据库中的数据必须由 DBMS
访问,而不允许用户越过 DBMS,直接通过操作
系统访问。
?数据最后可以通过密码的形式存储到数据库中。
返回 450
5.1.2.1 用户标识和鉴定
( Identification and Authentication)
? 数据库系统是不允许一个未经授权的用户对数据库进
行操作的 。
? 用户标识和鉴定是系统提供的最外层的安全保护措施,
其方法是由系统提供一定的方式让用户标识自己的名
字或身份, 系统内部矛盾记录着所有合法用户的标识,
每次用户要求进入系统时, 由系统进行核实, 通过鉴
定后才提供机器的使用权 。
? 用户标识和鉴定的方法有多种, 为了获得更强的安全
性, 往往是多种方法并举, 常用的方法有以下几种,
返回 451
1,用一个 用户名或用户标识符 来标明用户的身份, 系统
以此来鉴别用户的合法性 。 如果正确, 则可进入下一
步的核实, 否则, 不能使用计算机 。
2,用户标识符是用户公开的标识, 它不足以成为鉴别用
户身份的凭证 。 为了进一步核实用户身份, 常采用 用
户名与口令 ( Password) 相结合的方法,系统通过核对
口令判别用户身份的真伪 。
? 系统有一张用户口令表, 为每个用户保持一个记录, 包括用
户名和口令两部分数据 。
?用户先输入用户名, 然后系统要求用户输入口令 。
?为了保密, 用户在终端上输入的口令不显示在屏幕上 。
?系统核对口令以鉴别用户身份 。
3.通过用户名和口令来鉴定用户的方法简单易行,但该
方法在使用时,由于用户名和口令的产生和使用比较
简单,也容易被窃取,因此还可采用更复杂的方法。
返回 452
?例如, 每个用户都预先约定好一个过程或者函数,
鉴别用户身份时, 系统提供一个随机数, 用户根据
自己预先约定的计算过程或者函数进行计算, 系统
根据计算结果辨别用户身份的合法性 。
?例如, 让用户记住一个表达式, 如 T=X+2Y,系统告
诉用户 X=1,Y=2,如果用户回答 T=5,则证实了该用
户的身份 。
?当然, 这是一个简单的例子, 在实际使用中, 还可
以设计复杂的表达式, 以使安全性更好 。 系统每次
提供不同的 X,Y值, 其他人可能看到的是 X,Y的值,
但不能推算出确切的变换公式 T。
返回 453
5.1.2.2 用户存取权限控制
?用户存取权限指的是不同的用户对于不同的数
据对象允许执行的操作权限 。
?在数据库系统中, 每个用户只能访问他有权存
取的数据并执行有权使用的操作 。
?因此, 必须预先定义用户的存取权限 。
?对于合法的用户, 系统根据其存取权限的定义
对其各种操作请求进行控制, 确保合法操作 。
?存取权限由两个要素组成, 数据对象和操作类
型 。
?定义一个用户的存取权限就是要定义这个用户
可以在哪些数据对象上进行哪些类型的操作 。
返回 454
?在数据库系统中, 定义用户存取权限称为 授权
( Authorization) 。
?第三章讨论 SQL的数据控制功能时, 我们已知
道授权有两种:系统特权和对象特权 。
?系统特权 是由 DBA授予某些数据库用户, 只有得到
系统特权, 才能成为数据库用户 。
?对象特权 可以由 DBA授予, 也可以由数据对象的创
建者授予, 使数据库用户具有对某些数据对象进行
某些操作的特权 。
?在系统初始化时, 系统中至少有一个具有 DBA
特权的用户, DBA可以通过 GRANT语句将系统特
权或对象特权授予其他用户 。
?对于已授权的用户可以通过 REVOKE语句收回所
授予的特权 。
返回 455
? 这些授权定义经过编译后以一张授权表的形式存放在
数据字典中 。
? 授权表主要有三个属性, 用户标识, 数据对象 和 操作
类型 。
?用户标识不但可以是用户个人, 也可以是团体, 程序和终端 。
在非关系系统中, 存取控制的数据对象仅限于数据本身 。
?而关系系统中, 存取控制的数据对象不仅有基本表, 属性列
等数据本身, 还有内模式, 外模式, 模式等数据字典中的内
容 。
?下表列出了关系系统中的存取权限 。
数据对象
操作类型
模式
模式
建立、修改、检索
外模式
建立、修改、检索
内模式
建立、修改、检索
数据

查找、插入、修改、删除
属性列
查找、插入、修改、删除
返回 456
?对于授权表, 一个衡量授权机制的重要指标就
是 授权粒度, 即可以定义的数据对象的范围;
?在关系数据库中, 授权粒度包括 关系, 记录 或
属性 。
?一般来说, 授权定义中粒度越细, 授权子系统
就越灵活
?例如, 表 5.2是一个授权粒度很粗的表, 它只
能对整个关系授权 。
?如 USER1拥有对关系 S的一切权限;
?USER2拥有对关系 C的 SELECT权和对关系 SC的 UPDATE
权;
?USER3只可以向关系 SC中插入新记录 。
返回 457
表 5.2 授权表 1
用户标识
数据对象
操作类型
USER1
关系 S
ALL
USER2
关系 C
SELECT
USER2
关系 SC
UPDATE
USER3
关系 SC
INSERT



返回 458
?表 5.3是一个授权粒度较为精细,它可以精确
到关系的某一属性。
?USER1拥有对关系 S的一切权限;
?USER2只能查询关系 C的 CNO属性和修改关系 SC的
SCORE属性;
?USER3可以向关系 SC中插入新记录。
表 5.3 授权表 2
用户标识
数据对象
操作类型
USER1
关系 S
ALL
USER2
列 C.CNO
SELECT
USER2
列 SC.SCORE
UPDATE
USER3
关系 SC
INSERT



返回 459
? 表 5.3的授权表中的授权只涉及到数据名 ( 关系, 记录或
属性的名字 ), 而未提到具体的值 。
? 系统不必访问具体的数据本身, 就可以执行这种控制 。 这
种控制称为, 值独立, 的控制 。
? 表 5.4中的授权表则不但可以对属性列授权, 还可以提供
与数值有关的授权, 即可以对关系中的一组记录授权 。
?比如, USER1只能对计算机系的学生进行操作 。
? 对于提供与数据值有关的授权, 系统必须能够支持存取谓
词的操作 。
表 5.4 授权表 3
用户标识
数据对象
操作类型
存取谓词
USER1
关系 S
ALL
DEPT=?计算机 ’
USER2
列 C.CNO
SELECT
USER2
列 SC.SCORE
UPDATE
USER3
关系 SC
INSERT



返回 460
?可见授权粒度越细, 授权子系统就越灵活, 能够
提供的安全性就越完善 。
?但另一方面, 如果用户比较多, 数据库比较大,
授权表将很大, 而且每次数据库访问都要用到这
张表做授权检查, 这将影响数据库的性能 。
?所幸的是, 在大部分数据库中, 需要保密的数据
是少数, 对于大部分公开的数据, 可以一次性地
授权给 PUBLIC,而不必再对每个用户个别授权 。
?对于表 5.4中与数据值有关的授权, 可以通过另
外一种数据库安全措施, 即定义视图 。
返回 461
5.1.2.3 定义视图
? 为不同的用户定义不同的视图, 可以限制各个用户的访
问范围 。
? 通过视图机制把要保密的数据对无权存取这些数据的用
户隐藏起来, 从而自动地对数据提供一定程度的安全保
护 。 例如, USER1只能对计算机系的学生进行操作,
? 一种方法是通过授权机制对 USER1授权, 如表 5.5所示,
? 另一种简单的方法就是定义一个计算机系的视图 。
? 但视图机制的安全保护功能太不精细, 往往不能达到应
用系统的要求, 其主要功能在于提供了数据库的逻辑独
立性 。
? 在实际应用中, 通常将视图机制与授权机制结合起来使
用, 首先用视图机制屏蔽一部分保密数据, 然后在视图
上面再进一步定义存取权限 。
返回 462
5.1.2.4 数据加密 ( Data Encryption)
?前面介绍的几种数据库安全措施, 都是防止从
数据库系统窃取保密数据, 不能防止通过不正
常渠道非法访问数据, 例如, 偷取存储数据的
磁盘, 或在通信线路上窃取数据, 为了防止这
些窃密活动, 比较好的办法是对数据加密 。
?数据加密 是防止数据库中数据在存储和传输中
失密的有效手段 。
?加密的基本思想是根据一定的算法将原始数据
( 术语为明文, Plain text) 加密成为不可直
接识别的格式 ( 术语为密文, Clipher text),
数据以密码的形式存储和传输 。
返回 463
? 加密方法有两种,
?一种是 替换方法, 该方法使用密钥 ( Encryption Key) 将明文
中的每一个字符转换为密文中的一个字符 。
?另一种是 转换方法, 该方法将明文中的字符按不同的顺序重新
排列 。
? 通常将这两种方法结合起来使用, 就可以达到相当高
的安全程度 。
?例如美国 1977年制定的官方加密标准, 数据加密标准 ( Data
Encryption Standard,简称 DES) 就是使用这种算法的例子 。
? 数据加密后,对于不知道解密算法的人,即使利用系
统安全措施的漏洞非法访问数据,也只能看到一些无
法辨认的二进制代码。
? 合法的用户检索数据时,首先提供密码钥匙,由系统
进行译码后,才能得到可识别的数据。
返回 464
?目前不少数据库产品提供了数据加密例行程序,
用户可根据要求自行进行加密处理, 还有一些
未提供加密程序的产品也提供了相应的接口,
通话用户用其他厂商的加密程序对数据加密 。
?用密码存储数据, 在存入时需加密, 在查询时
需解密, 这个过程会占用大量系统资源, 降低
了数据库的性能 。
?因此数据加密功能通常允许用户自由选择, 只
对那些保密要求特别高的数据, 才值得采用此
方法 。
返回 465
5.1.2.5 审计 ( Audit)
? 前面介绍的各种数据库安全性措施, 都可将用户操作
限制在规定的安全范围内 。
? 但实际上任何系统的安全性措施都不是绝对可靠的,
窃密者总有办法打破这些控制 。
? 对于某些高度敏感的保密数据, 必须以审计功作为预
防手段 。
? 审计功能是一种监视措施, 跟踪记录有关数据的访问
活动 。
? 审计追踪把用户对数据库的所有操作自动记录下来,
存放在一个特殊文件上中, 即审计日志 ( Audit Log)
中 。
? 记录的内容一般包括,
?操作类型, 如修改, 查询等;
?操作终端标识与操作者标识;
?操作日期和时间;
返回 466
? 操作所涉及到的相关数据, 如基本表, 视图, 记录,
属性等;数据的前象和后象 。 利用这些信息, 可以重
现导致数据库现有状况的一系列事件, 以进一步找出
非法存取数据的人, 时间和内容等 。
? 使用审计功能会大大增加系统的开销, 所以 DBMS通常
将其作为可选特征, 提供相应的操作语句可灵活地打
开或关闭审计功能 。
? 例如, 可使用如下 SQL语句打开对表 S的审计功能, 对
表 S的每次成功的查询, 增加, 删除, 修改操作都作审
计追踪,
AUDIT SELECT,INSERT,DELETE,UPDATE,
ON S WHENEVER SUCCESSFUL
? 要关闭对表 S的审计功能可以使用如下语句,
NO AUDIT ALL ON S。
返回 467
5.2.1 数据库完整性的含义
? 数据库的完整性是指保护数据库中数据的正确性, 有
效性和相容性, 防止错误的数据进入数据库造成无效
操作 。
? 有关完整性的含义在第一章中已作简要介绍 。
?比如年龄属于数值型数据, 只能含 0,1,… 9,不能含字母或特
殊符号;
?月份只能用 1~ 12之间的正整数表示;
?表示同一事实的两个数据应相同, 否则就不相容, 如一个人
不能有两个学号 。
? 显然, 维护数据库的完整性非常重要, 数据库中的数
据是否具备完整性关系到数据能否真实地反映现实世
界 。
5.2 完整性控制
返回 468
?数据库的完整性和安全性是数据库保护的两个不
同的方面 。
?安全性是保护数据库, 以防止非法使用所造成数
据的泄露, 更改或破坏, 安全性措施的防范对象
是非法用户和非法操作;
?完整性是防止合法用户使用数据库时向数据库中
加入不符合语义的数据, 完整性措施的防范对象
是不合语义的数据 。
?但从数据库的安全保护角度来讲, 安全性和完整
性又是密切相关的 。
返回 469
5.2.2 完整性规则的组成
? 为了实现完整性控制, 数据库管理员应向 DBMS提出
一组完整性规则, 来检查数据库中的数据, 看其是否
满足语义约束 。
? 这些语义约束构成了数据库的完整性规则, 这组规则
作为 DBMS控制数据完整性的依据 。
? 它定义了何时检查, 检查什么, 查出错误又怎样处理
等事项 。
? 具体地说, 完整性规则主要由以下三部分构成,
1,触发条件:规定系统什么时候使用规则检查数据;
2,约束条件:规定系统检查用户发出的操作请求违背了
什么样的完整性约束条件;
3,违约响应:规定系统如果发现用户的操作请求违背了
完整性约束条件, 应该采取一定的动作来保证数据的完
整性, 即违约时要做的事情 。
返回 470
?完整性规则从执行时间上可分为立即执行约束
( Immediate Constraints ) 和延迟执行约束
( Deferred Constrainsts) 。
?立即执行约束 是指在执行用户事务过程中, 某一条语
句执行完成后, 系统立即对此数据进行完整性约束条
件检查 。
?延迟执行约束 是指在整个事务执行结束后, 再对约束
条件进行完整性检查, 结果正确后才能提交 。
?某一条语句执行完成后, 系统立即对此数据进
行完整性约束条件检查 。
返回 471
?例如, 银行数据库中, 借贷总金额应平衡, 的约束就应该属于
延迟执行约束, 从账号 A转一笔钱到账号 B为一个事务, 从账号
A转出去钱后, 账就不平了, 必须等转入账号 B后, 账才能重新
平衡, 这时才能进行完整性检查 。
? 如果发现用户操作请求违背了立即执行约束, 则可以拒
绝该操作, 以保护数据的完整性 。
? 如果发现用户操作请求违背了延迟执行约束, 而又不知
道是哪个事务的操作破坏了完整性, 则只能拒绝整个事
务, 把数据库恢复到该事务执行前的状态 。
? 一条完整性规则可以用一个五元组 ( D,O,A,C,P)
来形式化地表示 。 其中,
?D( data),代表约束作用的数据对象;
?O( operation):代表触发完整性检查的数据库操作,即当用户
发出什么操作请求时需要检查该完整性规则;
返回 472
?A( assertion),代表数据对象必须满足的语义约束,
这是规则的主体;
?C( condition),代表选择 A作用的数据对象值的谓
词;
?P( procdure),代表违反完整性规则时触发执行的
操作过程 。
例如, 对于, 学号不能为空, 的这条完整性约束,
?D:代表约束作用的数据对象为 SNO属性;
?O( operation),当用户插入或修改数据时需要检查
该完整性规则;
?A( assertion), SNO不能为空;
?C( condition), A可作用于所有记录的 SNO属性;
?P( procdure),拒绝执行用户请求 。
返回 473
? 关系模型的完整性包括 实体完整性, 参照完整性 和 用户
定义完整性 。
? 对于违反实体完整性和用户定义完整性规则的操作一般
都是采用拒绝执行的方式进行处理。
? 而对于违反参照完整性的操作,并不都是简单的拒绝执
行,一般在接受这个操作的同时,执行一些附加的操作,
以保证数据库的状态仍然是正确的。
? 例如在删除被参照关系中的元组时,应该将参照关系中
所有的外码值与被参照关系中要删除元组主码值相对应
的元组一起删除。
?比如,要删除 S关系中 SNO=?S1?的元组,而 SC关系中又有
两个 SNO=?S1?的元组。
?这时根据应用环境的语义,因为当一个学生毕业或退学后,
他的个人记录从 S关系中删除,选课记录也应随之从 SC表
中删除,所以应该将 SC关系中两个 SNO=?S1?的元组一起删
除。
返回 474
?这些完整性规则都由 DBMS提供的语句进行描述,
经过编译后存放在数据字典中 。
?一旦进入系统, 就开始执行该组规则 。
?其主要优点是违约由系统来处理, 而不是由用
户处理 。
?另外, 规则集中在数据字典中, 而不是散布在
各应用程序之中, 易于从整体上理解和修改,
效率较高 。
?数据库系统的整个完整性控制都是围绕着完整
性约束条件进行的, 从这个角度来看, 完整性
约束条件是完整性控制机制的核心 。
返回 475
5.2.3 完整性约束条件的分类
5.2.3.1 从约束条件使用的对象分为值的约束和结构的约束
1,值的约束,即对数据类型, 数据格式, 取值范
围等进行规定 。
?( 1) 对数据类型的约束, 包括数据的类型, 长度,
单位和精度等 。
? 例如, 规定学生姓名的数据类型应为字符型, 长度为 8。
?( 2) 对数据格式的约束 。
? 例如, 规定出生日期的数据格式为 YY.MM.DD。
?( 3) 对取值范围的约束 。
? 例如, 月份的取值范围为 1~ 12,日期 1~ 31。
?( 4) 对空值的约束 。 空值表示未定义或未知的值,
它与零值和空格不同 。 有的列值允许空值, 有的则
不允许 。
? 例如, 学号和课程号不可以为空值, 但成绩可以为空值 。
返回 476
2,结构约束,即对数据之间联系的约束 。
?数据库中同一关系的不同属性之间, 应满足一
定的约束条件, 同时, 不同关系的属性之间也
有联系, 也应满足一定的约束条件 。
?常见的结构约束有如下四种,
( 1)函数依赖约束:说明了同一关系中不同属性之
间应满足的约束条件。
? 如,2NF,3NF,BCNF这些不同的范式应满足不同的约束条
件。
?大部分函数依赖约束都是隐含在关系模式结构中的,
特别是对于规范化程度较高的关系模式,都是由模
式来保持函数依赖的。
返回 477
( 2) 实体完整性约束:说明了关系键的属性列必须唯
一, 其值不能为空或部分为空 。
( 3) 参照完整性约束:说明了不同关系的属性之间的
约束条件, 即外部键的值应能够在参照关系的主键
值中找到或取空值 。
( 4) 统计约束, 规定某个属性值与一个关系多个元组
的统计值之间必须满足某种约束条件 。
? 例如, 规定系主任的奖金不得高于该系的平均奖金的 40%。,
不得低于该系的平均奖金的 20%。 这里该系平均奖金的值就
是一个统计计算值 。
?其中, 实体完整性约束和参照完整性约束是关
系模型的两个极其重要的约束, 被称为关系的
两个不变性 。 统计约束实现起来开销很大 。
返回 478
5.2.3.2 从约束对象的状态分为静态约束和动态约束
1,静态约束
?静态约束是指对数据库每一个确定状态所应满足的
约束条件, 是反映数据库状态合理性的约束, 这是
最重要的一类完整性约束 。
?上面介绍的值的约束和结构的约束均属于静态约束 。
2,动态约束
?动态约束是指数据库从一种状态转变为另一种状态
时, 新旧值之间所应满足的约束条件, 动态约束反
映的是数据库状态变迁的约束 。
?例如, 学生年龄在更改时只能增长, 职工工资在调
整时不得低于其原来的工资 。
返回 479
5.3.1 数据库并发性的含义
? 上一节讨论的完整性是保证各个事务本身能得到正确
的数据,只考虑一个用户使用数据库的情况,但实际
上数据库中有许多用户。
? 每个用户在存取数据库中的数据时,可能是串行执行,
即每个时刻只有一个用户程序运行,也可能是多个用
户并行地存取数据库。
? 数据库的最大特点之一就是数据资源是共享的,串行
执行意味着一个用户在运行程序时,其他用户程序必
须等到这个用户程序结束才能对数据库进行存取,这
样如果一个用户程序涉及大量数据的输入 /输出交换,
则数据库系统的大部分时间将处于闲置状态。
5.3 并发控制与封锁
返回 480
? 因此,为了充分利用数据库资源,很多时候数据库用
户都是对数据库系统并行存取数据,这样就会发生多
个用户并发存取同一数据块的情况,如果对并发操作
不加控制可能会产生不正确的数据,破坏数据的完整
性,并发控制就是解决这类问题,以保持数据库中数
据的一致性,即在任何一个时刻数据库都将以相同的
形式给用户提供数据。
5.3.2 事务 ( Transaction)
5.3.2.1 事务的定义
? 在上一节中就曾提到过事务的概念, DBMS的并发控制
也是以事务为基本单位进行的 。
? 那么到底什么是事务呢?
返回 481
? 事务 是数据库系统中执行的一个工作单位, 它是由用
户定义的一组操作序列 。
? 一个事务可以是一组 SQL语句, 一条 SQL语句或整个程
序, 一个应用程序可以包括多个事务 。
? 事务的开始与结束可以由用户显式控制 。 如果用户没
有显式地定义事务, 则由 DBMS按照缺省规定自动划分
事务 。 在 SQL语言中, 定义事务的语句有三条,
?BEGIN TRANSACTION
?COMMIT
?ROLLBACK
?BEGIN TRANSACTION表示事务的开始;
?COMMIT表示事务的提交,即将事务中所有对数据库的更新写
回到磁盘上的物理数据库中去,此时事务正常结束;
?ROLLBACK表示事务的回滚,即在事务运行的过程中发生了某
种故障,事务不能继续执行,系统将事务中对数据库的所有
已完成的更新操作全部撤销,再回滚到事务开始时的状态。
返回 482
5.3.2.2 事务的特征
? 事务是由有限的数据库操作序列组成, 但并不是任意
的数据库操作序列都能成为事务, 为了保护数据的完
整性, 一般要求事务具有以下四个特征,
1,原子性 ( Atomic)
? 一个事务是一个不可分割的工作单位, 事务在执行时,
应该遵守, 要么不做, 要么全做, ( nothing or all)
的原则, 即不允许事务部分的完成 。
? 即使因为故障而使事务未能完成, 它执行的部分结果
要被取消 。
返回 483
2,一致性 ( Consistency)
?事务对数据库的作用是数据库从一个一致状态
转变到另一个一致状态 。
?所谓数据库的一致状态是指数据库中的数据满
足完整性约束 。
?例如, 银行企业中,, 从帐号 A转移资金额 R到帐号 B”
是一个典型的事务, 这个事务包括两个操作, 从帐
号 A中减去资金额 R和在帐号 B中增加资金额 R,如果
只执行其中一个操作, 则数据库处于不一致状态,
帐务会出现问题 。 也就是说, 两个操作要么全做,
要么全不做, 否则就不能成为事务 。
?可见事务的一致性与原子性是密切相关的 。
返回 484
3,隔离性 ( Isolation)
?如果多个事务并发地执行, 应像各个事务独立
执行一样, 一个事务的执行不能被其他事务干
扰 。
?即一个事务内部的操作及使用的数据对并发的
其他事务是隔离的 。
?并以控制就是为了保证事务间的隔离性 。
4,持久性 ( Durability)
?指一个事务一旦提交, 它对数据库中数据的改
变就应该是持久的, 即使数据库因故障而受到
破坏, DBMS也应该能够恢复 。
返回 485
? 事务上述四个性质的英文术语的第一个字母为 ACID。
因此, 这四个性质以称为事务的 ACID准则 。
? 下面是一个事务的例子, 从帐号 A转移资金额 R到帐号 B,
BEGIN TRANSACTION
READ A
A← A-R
IF A<0 /* A 款不足 */
THEN
BEGIN
DISPLAY,A款不足,
ROLLBACK
END
ELSE /* 拨款 */
BEGIN
B← B+R
DISPLAY,拨款完成,
COMMIT
END
返回 486
?这是对一个简单事务的完整的描述。
?该事务有两个出口,
?当 A 帐号的款项不足时,事务以 ROLLBACK(撤
销)命令结束,即撤销该事务的影响;
?另一个出口是以 COMMIT(提交)命令结束,完
成从帐号 A到帐号 B的拨款。
? 在 COMMIT之前,即在数据库修改过程中,数据可能是
不一致的,事务本身也可能被撤销。
? 只有在 COMMIT之后,事务对数据库所产生的变化才对
其他事务开放,这就可以避免其他事务访问不一致或不
存在的数据。
返回 487
5.3.3 并发操作与数据的不一致性
? 当同一数据库系统中有多个事务并发运行时, 如果不加
以适当控制, 可能产生数据的不一致性 。
[例 1]并发取款操作 。 假设存款余额 R=1000元, 甲事务 T1
取走存款 100元, 乙事务 T2取走存款 200元, 如果正常操
作, 即甲事务 T1执行完毕再执行乙事务 T2,存款余额更
新后应该是 700元 。 但是如果按照如下顺序操作, 则会
有不同的结果,
?甲事务 T1读取存款余额 R =1000元;
?乙事务 T2读取存款余额 R =1000元;
?甲事务 T1取走存款 100元, 修改存款余额 R =R - 100=900,
把 R =900写回到数据库;
?乙事务 T2取走存款 200元, 修改存款余额 R =R - 200=800,
把 R =800写回到数据库 。
返回 488
?结果两个事务共取走存款 300元, 而数据库中
的存款却只少了 200元 。
?得到这种错误的结果是由甲乙两个事务并发操
作引起的, 数据库的并发操作导致的数据库不
一致性主要有以下三种,
1,丢失更新 ( Lost Update)
?当两个事务 T1和 T2读入同一数据做修改,并发
执行时,T2把 T1或 T1把 T2的修改结果覆盖掉,
返回 489
?造成了数据的丢失更新问题, 导致数据的不一
致 。
?仍以例 6.1中的操作为例进行分析 。
?在表 5.5中, 数据库中 R的初值是 1000,事务 T1包含
三个操作:读入 R初值 ( FIND R) ;计算 ( R=R-
100) ;更新 R( UPDATE R) 。
?事务 T2也包含三个操作,FIND R;计算 ( R=R-200) ;
UPDATE R。
?如果事务 T1和 T2顺序执行, 则更新后, R的值是 700。
但如果 T1和 T2按照表 5.5所示的并发执行, R的值是
800,得到错误的结果, 原因在于在 t7时刻丢失了 T1
对数据库的更新操作 。
?因此, 这个并发操作不正确 。
返回 490
表 5.5 丢失更新问题
时间
事务 T1
数据库中 R的值
事务 T2
T
0
1000
t
1
FIND R
t
2
FIND R
t
3
R=R-100
t
4
R=R-200
t
5
UPDATE R
t
6
900
UPDATE R
t
7
800
返回 491
2,污读 ( Dirty Read)
? 事务 T1更新了数据 R,事务 T2读取了更新后的数据 R,
事务 T1由于某种原因被撤消, 修改无效, 数据 R恢复原
值 。 事务 T2得到的数据与数据库的内容不一致, 这种
情况称为, 污读, 。
? 在表 5.6中, 事务 T1把 R的值改为 900,但此时尚未做
COMMIT操作, 事务 T2将修改过的值 900读出来, 之后事
务 T1执行 ROLLBACK操作, R的值恢复为 1000,而事务 T2
将仍在使用已被撤消了的 R值 900。
? 原因在于在 t4时刻事务 T2读取了 T1未提交的更新操作
结果, 这种值是不稳定的, 在事务 T1结束前随时可能
执行 ROLLBACK操作 。
? 对于这些未提交的随后又被撤消的更新数据称为, 脏
数据, 。
?比如, 这里事务 T2在 t2时刻读取的就是, 脏数据, 。
返回 492
表 5.6 污读问题
时间
事务 T1
数据库中 R的值
事务 T2
t
0
1000
t
1
FIND R
t
2
R=R-100
t
3
UPDATE R
t
4
900
FIND R
t
5
ROLLBACK
t
6
1000
返回 493
3,不可重读 ( Unrepeatable Read)
? 事务 T1读取了数据 R,事务 T2读取并更新了数据 R,当
事务 T1再读取数据 R以进行核对时, 得到的两次读取值
不一致, 这种情况称为, 不可重读, 。
? 在表 5.7中, 在 t0时刻事务 T1读取 R的值为 1000,但事
务 T2在 t4时刻将 R的值更新为为 800。 所以 T1所使用的值
已经与开始读取的值不一致 。
时间
事务 T1
数据库中 R的值
事务 T2
t
0
1000
t
1
FIND R
t
2
FIND R
t
3
R=R-200
t
4
UPDATE R
t
5
800
表 5.7 不可重读问题
返回 494
? 产生上述三类数据不一致性的主要原因就是并发操作
破坏了事务的隔离性 。
? 并发控制就是要求 DBMS提供并发控制功能以正确的方
式高度并发事务, 避免并发事务之间的相互干扰造成
数据的不一致性, 保证数据库的完整性 。
5.3.4 封锁
? 实现并发控制的方法主要有两种:封锁 ( Lock) 技术
和时标 ( Timestamping) 技术 。 这里只介绍封锁技术 。
5.3.4.1 封锁类型 ( Lock Type)
? 所谓封锁就是当一个事务在对某个数据对象(可以是
数据项、记录、数据集、以至整个数据库)进行操作
之前,必须获得相应的锁,以保证数据操作的正确性
和一致性。
返回 495
?封锁是目前 DBMS普遍采用的并发控制方法,基本
的封锁类型有两种:排它锁和共享锁。
1,排它锁 ( Exclusive Lock)
?排它锁又称写锁, 简称为 X锁, 其采用的原理是禁止并发
操作 。
?当事务 T对某个数据对象 R实现 X封锁后, 其他事务要等 T
解除 X封锁以后, 才能对 R进行封锁 。 这就保证了其他事
务在 T释放 R上的锁之前, 不能再对 R进行操作 。
2,共享锁 ( Share Lock)
?共享锁又称读锁,,简称为 S锁, 其采用的原理是允许其
他用户对同一数据对象进行查询, 但不能对该数据对象
进行修改 。
?当事务 T对某个数据对象 R实现 S封锁后, 其他事务只能对
R加 S锁, 而不能加 X锁, 直到 T释放 R上的 S锁 。
?这就保证了其他事务在 T释放 R上的 S锁之前, 只能读取 R,
而不能再对 R作任何修改 。
返回 496
5.3.4.2 封锁协议 ( Lock Protocol)
? 封锁可以保证合理的进行并发控制, 保证数据的一致
性 。
? 实际上, 锁是一个控制块, 其中包括被加锁记录的标
识符及持有锁的事务的标识符等 。
? 在封锁时, 要考虑一定的封锁规则, 例如, 何时开始
封锁, 封锁多长时间, 何时释放等,这些封锁规则称为
封锁协议 。
? 对封锁方式规定不同的规则, 就形成了各种不同的封
锁协议 。
? 封锁协议在不同程序上对正确控制并发操作提供了一
定的保证 。
? 上面讲述过的并发操作所带来的丢失更新, 污读和不
可重读等到数据不一致性问题, 可以通过三级封锁协
议在不同程度上给予解决, 下面介绍三级封锁协议 。
返回 497
1,一级封锁协议
? 一级封锁协议的内容是:事务 T在修改数据对象之前必
须对其加 X锁, 直到事务结束 。
? 具体地说, 就是任何企图更新记录 R的事务必须先执行
,XLOCK R”操作, 以获得对该记录进行寻址的能力并对
它取得 X封锁 。
? 如果未获准, X 封锁,, 那么这个事务进入等待状态,
一直到获准, X封锁,, 该事务才继续做下去 。
? 该事务规定事务在更新记录 R时必须获得排它性封锁,
使得两个同时要求更新 R的并行事务之一必须在一个事
务更新操作执行完成之后才能获得 X封锁, 这样就避免
了两个事务读到同一个 R值而先后更新时所发生的丢失
更新问题 。
返回 498
?利用一级封锁协议可以解决表 5.5中的数据丢失
更新问题,如表 5.8所示。
?事务 T1先对 R进行 X封锁( XLOCK),事务 T2执行
,XLOCK R”操作,未获准, X封锁,,则进入
等待状态,直到事务 T1更新 R值以后,解除 X封
锁操作( UNLOCK X)。
?此后事务 T2再执行, XLOCK R”操作,获准, X
封锁,,并对 R值进行更新(此时 R已是事务 T1
更新过的值,R=900)。
?这样就能得出正确的结果。
返回 499
表 5.8 无丢失更新问题
时间
事务 T1
数据库中 R的值
事务 T2
t
0
XLOCK R
1000
t
1
FIND R
t
2
XLOCK R
t
3
R=R-100
WAIT
t
4
UPDATE R
WAIT
t
5
UNLOCK X
900
WAIT
t
6
XLOCK R
t
7
R=R-200
T
8
UPDATE R
t
9
700
UNLOCK X
返回 500
? 一级封锁协议只有当修改数据时才进行加锁, 如果只是
读取数据并不加锁, 所以它不能防止, 污读, 和, 重读,
数据 。
2,二级封锁协议
? 二级封锁协议的内容是:在一级封锁协议的基础上, 另
外加上事务 T在读取数据 R之前必须先对其加 S锁, 读完
后释放 S锁 。
? 所以二级封锁协议不但可以解决更新时所发生的数据丢
失问题, 还可以进一步防止, 污读, 。
? 利用二级封锁协议可以解决表 5.6中的数据, 污读, 问
题, 如表 5.9所示 。
? 事务 T1先对 R进行 X封锁 ( XLOCK), 把 R的值改为 900,
但尚未提交 。 这时事务 T2请求对数据 R加 S锁, 因为 T1已
对 R加了 X锁, T2只能等待, 直到事务 T1释放 X锁 。
返回 501
? 之后事务 T1因某种原因撤销, 数据 R恢复原值 1000,并
释放 R上的 X锁 。 事务 T2可对数据 R加 S锁, 读取 R=1000,
得到了正确的结果, 从而避免了事务 T2读取, 脏数
据, 。
时间
事务 T1
数据库中 R的值
事务 T2
t
0
XLOCK R
1000
t
1
FIND R
t
2
R=R-100
t
3
UPDATE R
t
4
900
SLOCK R
t
5
ROLLBACK
WAIT
t
6
UNLOCK R
1000
SLOCK R
t
7
FIND R
T
8
UNLOCK S
返回 502
?二级封锁协议在读取数据之后, 立即释放 S锁,
所以它仍然不能防止, 重读, 数据 。
3,三级封锁协议
?三级封锁协议的内容是:在一级封锁协议的基
础上, 另外加上事务 T在读取数据 R之前必须先
对其加 S锁, 读完后并不释放 S锁, 而直到事务
T结束才释放 。
?所以三级封锁协议除了可以防止更新丢失问题
和, 污读, 数据外, 还可进一步防止不可重读
数据, 彻底解决了并发操作所带来的三个不一
致性问题 。
?利用三级封锁协议可以解决表 5.7中的不可重
读问题, 如表 5.10所示 。
返回 503
?在表 5.10中, 事务 T1读取 R的值之前 先对其加 S
锁, 这样其他事务只能对 R加 S锁, 而不能加 X
锁, 即其他事务只能读取 R,而不能对 R进行修
改 。
?所以当事务 T2在 t3时刻申请对 R加 X锁时被拒绝,
使其无法执行修改操作, 只能等待事务 T1释放
R上的 S锁, 这时事务 T1再读取数据 R进行核对
时, 得到的值仍是 1000,与开始所读取的数据
是一致的, 即可重读 。
?在事务 T1释放 S锁后, 事务 T2可以对 R加 X锁, 进
行更新操作, 这样便保证了数据的一致性 。
返回 504
表 5.10 可重读问题
时间
事务 T1
数据库中 R的值
事务 T2
t
0
1000
t
1
SLOCK R
t
2
FIND R
t
3
XLOCK R
t
4
COMMIT
WAIT
t
5
UNLOCK S
WAIT
t
6
XLOCK R
t
7
FIND R
T
8
R=R-200
t
9
UPDATE R
t
10
UNLOCK X
返回 505
5.3.4.3 封锁粒度 ( Lock Granularity)
? 封锁粒度指封锁的单位 。
? 根据对数据的不同处理, 封锁的对象可以是这样一些
逻辑单元:字段, 记录, 表, 数据库等 。
? 封锁粒度与系统的并发度和并发控制的开销密切相关 。
? 封锁粒度越小, 系统中能够被封锁的对象就越多, 并
发度越高, 但封锁机构复杂, 系统开销也就越大 。 相
反, 封锁粒度越大, 系统中能够被封锁的对象就越少,
并发度越小, 封锁机构简单, 相应系统开销也就越小 。
? 因此, 在实际应用中, 选择封锁粒度时应同时考虑封
锁机构和并发度两个因素, 对系统开销与并发度进行
权衡, 以求得最优的效果 。
? 由于同时封锁一个记录的概率很小, 一般数据库系统
都在记录级上进行封锁, 以获得更高的并发度 。
返回 506
5.3.4.4 死锁和活锁
?封锁技术可有效解决并行操作的一致性问题,
但也可产生新的问题, 即活锁和死锁问题 。
1,活锁 ( Livelock)
?当某个事务请求对某一数据的排它性封锁时,
由于其他事务对该数据的操作而使这个事务处
于永久等待状态, 这种状态称为 活锁 。
?例如, 事务 T1在对数据 R封锁后, 事务 T2又请求
封锁 R,于是 T2等待 。 T3也请求封锁 R。 当 T1释
放了 R上的封锁后首先批准了 T3的请求, T2继续
等待 。 然后又有又 T4请求封锁 R,T3释放了 R上
的封锁后又批准了 T4的请求 …… T2可能永远处
于等待状态, 从而发生了活锁 。 如表 5.11所示 。
返回 507
表 5.11 活锁
时间
事务 T1
事务 T2
事务 T3
事务 T4
t
0
LOCK R
t
1

LOCK R
t
2
WAIT
LOCK R
t
3
UNLOCK
WAIT
WAIT
LOCK R
t
4

WAIT
LOCK R
WAIT
t
5
WAIT
WAIT
t
6
WAIT
UNLOCK
WAIT
t
7
WAIT
LOCK R
T
8
WAIT
返回 508
? 避免活锁的简单方法是采用先来先服务的策略, 按照请
求封锁的次序对事务排队, 一旦记录上的锁释放, 就使
申请队列中的第一个事务获得锁 。
? 有关活锁的问题我们不再详细讨论, 因为死锁的问题较
为常见, 这里主要讨论有关死锁的问题 。
1,死锁 ( Deadlock)
? 在同时处于等待状态的两个或多个事务中, 其中的每一
个在它能够进行之前, 都等待着某个数据, 而这个数据
已被它们中的某个事务所封锁, 这种状态称为死锁 。
? 例如, 事务 T1在对数据 R1封锁后, 又要求对数据 R2封锁,
而事务 T2已获得对数据 R2的封锁, 又要求对数据 R1封锁,
这样两个事务由于都不能得到封锁而处于等待状态, 发
生了死锁 。 如表 5.12所示 。
返回 509
表 5.12 死锁
时间
事务 T1
事务 T2
t
0
LOCK R1
t
1
LOCK R2
t
2

t
3
LOCK R2
t
4
WAIT
t
5
WAIT
LOCK R1
t
6
WAIT
WAIT
t
7
WAIT
WAIT
返回 510
(1)死锁产生的条件
?发生死锁的必要条件有以下四条,
① 互斥条件:一个数据对象一次只能被一个事务所使
用, 即对数据的封锁采用排它式;
② 不可抢占条件:一个数据对象只能被占有它的事务
所释放, 而不能被别的事务强行抢占 。
③ 部分分配条件:一个事务已经封锁分给它的数据对
象, 但仍然要求封锁其他数据;
④ 循环等待条件:允许等待其他事务释放数据对象,
系统处于加锁请求相互等待的状态 。
返回 511
( 2) 死锁的预防
? 死锁一旦发生, 系统效率将会大大下降, 因而要尽量避
免死锁的发生 。
? 在操作系统的多道程序运行中, 由于多个进程的并行执
行需要分别占用不同资源时, 也会发生死锁 。
? 要想预防死锁的产生, 就得破坏形成死锁的条件 。
? 同操作系统预防死锁的方法类似, 在数据库环境下, 常
用的方法有以下两种,
① 一 次加锁法
? 一 次加锁法是每个事物必须将所有要使用的数据对象全
部依次加锁, 并要求加锁成功, 只要一个加锁不成功,
表示本次加锁失败, 则应该立即释放所有已加锁成功的
数据对象, 然后重新开始从头加锁 。
? 一次加锁法的程序框图如图 5.2。
返回 512
Y
Y
N
Y
N
开始加锁
加锁第 1个数据
加锁成功吗?
加锁成功吗?
对第 m个表加锁
加锁成功吗?
加锁第 2个数据 释放所有已加锁的数据
N
……
一次加锁成功
图 5.2 一次加锁法
返回 513
? 如表 5.12发生死锁的例子, 可以通过 一 次加锁法加以
预防 。
? 事务 T1启动后, 立即对数据 R1和 R2依 次加锁, 加锁成功
后, 执行 T1,而事务 T2等待 。
? 直到 T1执行完后释放 R1和 R2上的锁, T2继续执行 。 这样
就不会发生死锁 。
? 一 次加锁法虽然可以有效地预防死锁的发生, 但也存
在一些问题 。
?首先, 对某一事务所要使用的全部数据一次性加锁, 扩大了
封锁的范围, 从而降低了系统的并发度 。
?其次, 数据库中的数据是不断变化的, 原来不要求封锁的数
据, 在执行过程中可能会变成封锁对象, 所以很难事先精确
地确定每个事务所要封锁的数据对象, 这样只能在开始扩大
封锁范围, 将可能要封锁的数据全部加锁, 这就进一步降低
了并发度, 影响了系统的运行效率 。
返回 514
② 顺序加锁法
? 顺序加锁法是预先对所有可加锁的数据对象规定一个加
锁顺序, 每个事务都需要按此顺序加锁, 在释放时, 按
逆序进行 。
? 例如对于表 5.12发生的死锁, 我们可以规定封锁顺序为
R1,R2,事务 T1和 T2都需要按此顺序加锁 。 T1先封锁 R1,
再封锁 R2。 当 T2再请求封锁 R1时, 因为 T1已经对 R1加锁,
T2只能等待 。 待 T1释放 R1后, T2再封锁 R1,则不会发生
死锁 。
? 顺序加锁法同 一 次加锁法一样, 也存在一些问题 。 因为
事务的封锁请求可以随着事务的执行而动态地决定, 所
以很难事先确定封锁对象, 从而更难确定封锁顺序 。 即
使确定了封锁顺序, 随着数据操作的不断变化, 维护这
些数据的封锁顺序要需要很大的系统开销 。
返回 515
? 在数据库系统中, 由于可加锁的目标集合不但很大,
而且是动态变化的;
? 可加锁的目标常常不是按名寻址, 而是按内容寻址,
预防死锁常要付出很高的代价, 因而上述两种在操作
系统中广泛使用的预防死锁的方法并不很适合数据库
的特点 。
? 一般情况下, 在数据库系统中, 可以允许发生死锁,
在死锁发生后可以自动诊断并解除死锁 。
返回 516
( 3) 死锁的诊断与解除
? 数据库系统中诊断死锁的方法与操作系统类似。
? 可以利用事务信赖图的形式来测试系统中是否存在死
锁。
? 例如在图 5.3中,事务 T1需要数据 R,但 R已经被事务
T2封锁,那么从 T1到 T2划一个箭头。
? 如果在事务依赖图中沿着箭头方向存在一个循环,那
么死锁的条件就形成了,系统就会出现死锁。
图 5.3 事务依赖图
数据 R
T1 T2
返回 517
?如果已经发现死锁, DBA从依赖相同资源的事
务中抽出某个事务作为牺牲品, 将它撤销, 解
除它的所有封锁, 释放此事务占用的所有数据
资源, 分配给其他事务, 使其他事务得以继续
运行下去, 这样就有可能消除死锁 。
?在解除死锁的过程中, 抽取牺牲事务的标准是
根据系统状态及其应用的实际情况来确定的,
通常采用的方法之一是选择一个处理死锁代价
最小的事务, 将其撤销 。
?不重要的用户, 取消其操作, 释放封锁的数据,
恢复对数据库所作的改变 。
返回 518
5.4.1 数据库恢复的含义
?虽然数据库系统中已采取一定的措施, 来防止
数据库的安全性和完整性的破坏, 保证并发事
务的正确执行, 但数据库中的数据仍然无法保
证绝对不遭受破坏, 比如计算机系统中硬件的
故障, 软件的的错误, 操作员的失误, 恶意的
破坏等都有可能发生, 这些故障的发生影响数
据库数据的正确性, 甚至可能破坏数据库, 使
数据库中的数据全部或部分丢失 。
?因此, 系统必须具有检测故障并把数据从错误
状态中恢复到某一正确状态的功能, 这就是数
据库的恢复 。
5.4 数据库的恢复
返回 519
5.4.2 数据库恢复的原理服及其实现技术
?数据库恢复的基本原理十分简单, 就是数据的
冗余 。
?数据库中任何一部分被破坏的或不正确的数据
都可以利用存储在系统其他地方的冗余数据来
修复 。
?因此恢复系统应该提供两种类型的功能,
?一种是生成冗余数据, 即对可能发生的故障作某些
准备;
?另一种是冗余重建, 即利用这些冗余数据恢复数据
库 。
?生成冗余数据最常用的技术是登记日志文件和
数据转储,在实际应用中,这两种方法常常结
合起来一起使用。
返回 520
5.4.2.1 登记日志文件 ( Logging)
?日志文件是用来记录事务对数据库的更新操作
的文件 。 对数据库的每次修改, 都将被修改项
目的旧值和新值写在一个叫做运行日志的文件
中, 目的是为数据库的恢复保留详细的数据 。
?典型的日志文件主要包含以下内容,
1,更新数据库的事务标识 ( 标明是哪个事务 ) ;
2,操作的类型 ( 插入, 删除或修改 )
3,操作对象;
4,更新前数据的旧值 ( 对于插入操作而言, 没有旧
值 ) ;
返回 521
5,更新前数据的新值 ( 对于删除操作而言, 没有新值 ) ;
6,事务处理中的各个关键时刻 ( 事务的开始, 结束及其真正回
写的时间 ) 。
? 日志文件是系统运行的历史记载, 必须高度可靠 。
? 所以一般都是双副本的, 并且独立地写在两个不同类
型的设备上 。
? 日志的信息量很大, 一般保存在海量存储器上 。
? 在对数据库修改时, 在运行日志中要写入一个表示这
个修改的运行记录 。
? 为了防止在这两个操作之间发生故障后, 运行日志中
没有记录下这个修改, 以后也无法撤消这个修改 。 为
保证数据库是可恢复的, 登记日志文件必须遵循两条
原则原则,
返回 522
?1.至少要等到相应运行记录的撤消部分已经写入日志文件中以
后, 才允许该事务往物理数据库中写入记录;
?2.直到事务的所有运行记录的撤消和重做两部分都已写入日志
文件中以后, 才允许事务完成提交处理 。
? 这两条原则称为日志文件的先写原则 。
? 先写原则蕴含了如下意义:如果出现故障, 只可能在
日志文件中登记所做的修改, 但没有修改数据库, 这
样在系统重新启动进行恢复时, 只是撤消或重做因发
生事故而没有做过的修改, 并不会影响数据库的正确
性 。 而如果先写了数据库修改, 而在运行记录中没有
登记这个修改, 则以后就无法恢复这个修改了 。
? 所以这了安全, 一定要先定日志文件, 后写数据库的
修改 。
返回 523
5.4.2.2 数据转储 ( Data Dump)
? 数据转储是指定期地将整个数据库复制到多个存储设
备如磁带, 磁盘上保存起来的过程, 它是数据库恢复
中采用的基本手段 。
? 转储的数据文本称为后备副本或后援副本, 当数据库
遭到破坏后就可利用后援副本把数据库有效地加以恢
复 。
? 转储是十分耗费时间和资源的, 不能频繁地进行, 应
该根据数据库使用情况确定一个适当的转储周期 。
? 按照转储方式转储可以分为海量转储和增量转储 。
? 海量转储是指每次转储全部数据库 。
? 增量转储每次只转储上次转储后被更新过的数据 。
返回 524
? 上次转储以来对数据库的更新修改情况记录在日志文
件中, 利用日志文件就可进行这种转储, 将更新过的
那些数据重新写入上次转储的文件中, 就完成了转储
操作, 这与转储整个数据库的效果是一样的, 但花的
时间要少得多 。
? 按照转储状态转储又可分为静态转储和动态转储。
?静态转储期间不允许有任何数据存取活动,因而需在当前用
户事务结束之后进行,新用户事务又需在转储结束之后才能
进行,这就降低了数据库的可用性。
?动态转储则不同,它允许转储期间继续运行用户事务,但产
生的副本并不能保证与当前状态一致。解决的办法是把转储
期间各事务对数据库的修改活动登记下来,建立日志文件。
?因此,备用副本加上日志文件就能把数据库恢复到某一时刻
的正确状态。
返回 525
5.4.3 数据库的故障和恢复的策略
?数据库系统在运行中发生故障后, 有些事务尚
未完成就被迫中断, 这些未完成事务对数据库
所做的修改有一部分已写入物理数据库 。
?这时数据库就处于一种不正确的状态, 或者说
是不一致的状态, 这时可利用日志文件和数据
库转储的后备副本将数据库恢复到故障前的某
个一致性状态 。
?数据库运行过程中可能会出现各种各样的故障,
这些故障可分为以下三类,事务故障, 系统故
障 和 介质故障 。
?根据故障类型的不同, 应该采取不同的恢复策
略 。
返回 526
5.4.3.1 事务故障 ( Transaction Failure) 及其恢复
? 事务故障表示由非预期的, 不正常的程序结束所造成
的故障 。
? 造成程序非正常结束的原因包括输入数据错误, 运算
溢出, 违反存储保护, 并行事务发生死锁等 。
? 发生事务故障时,被迫中断的事务可能已对数据库进
行了修改,为了消除该事务对数据库的影响,要利用
日志文件中所记载的信息,强行回滚( ROLLBACK)该
事务,将数据库恢复到修改前的初始状态。
? 为此,要检查日志文件中由这些事务所引起的发生变
化的记录,取消这些没有完成的事务所做的一切改变。
? 这类恢复操作称为事务撤消( UNDO),具体做法如下,
返回 527
1,反向扫描日志文件, 查找该事务的更新操作 。
2,对该事务的更新操作执行反操作, 即对已经插入
的新记录进行删除操作, 对已删除的记录进行插入
操作, 对修改的数据恢复旧值, 用旧值代替新值 。
这样由后向前逐个扫描该事务己做所有更新操作,
并做同样处理, 直到扫描到此事务的开始标记, 事
务故障恢复完毕 。
?因此, 一个事务是一个工作单位, 也是一个恢
复单位 。
?一个事务越短, 越便于对它进行 UNDO操作 。 如
果一个应用程序运行时间较长, 则应该把该应
用程序分成多个事务, 用明确的 COMMIT语句结
束各个事务 。
返回 528
5.4.3.2 系统故障 ( System Failure) 及其恢复
?系统故障是指系统在运行过程中, 由于某种原
因, 造成系统停止运转, 致使所有正在运行的
事务都以非正常方式终止, 要求系统重新启动 。
?引起系统故障的原因可能有:硬件错误如 CPU
故障, 操作系统或 DBMS代码错误, 突然断电等 。
?这时, 内存中数据库缓冲区的内容全部丢失,
存储在外部存储设备上的数据库并未破坏, 但
内容不可靠了 。
返回 529
?系统故障发生后,对数据库的影响有两种情况,
?一种情况是一些未完成事务对数据库的更新已写入
数据库,这样在系统重新启动后,要强行撤消
( UNDO)所有未完成事务,清除这些事务对数据库
所做的修改。这些未完成事务在日志文件中只有
BEGIN TRANSCATION标记,而无 COMMIT标记。
?另一种情况是有些己提交的事务对数据库的更新结
果还保留在缓冲区中,尚未写到磁盘上的物理数据
库中,这也使数据库处于不一致状态,因此应将这
些事务己提交的结果重新写入数据库。这类恢复操
作称为事务的重做( REDO)。这种己提交事务在日
志文件中既有 BEGIN TRANSCATION标记,也有
COMMIT标记。
返回 530
?因此, 系统故障的恢复要完成两方面的工作,
既要撤消所有未完成的事务, 还需要重做所有
己提交的事务, 这样才能将数据库真正恢复到
一致的状态 。 具体做法如下,
1,正向扫描日志文件, 查找尚未提交的事务, 将其
事务标识记入撤消队列 。 同时查找已经提交的事务,
将其事务标识记入重做队列 。
2,对撤消队列中的各个事务进行撤消处理 。 方法同
事务故障中所介绍的撤消方法相同 。
3,对重做队列中的各个事务进行重做处理 。 进行重
做处理的方法是:正向扫描日志文件, 按照日志文
件中所登记的操作内容, 重新执行操作, 使数据库
恢复到最近某个可用状态 。
返回 531
?系统发生故障后, 由于无法确定哪些未完成的
事务己更新过数据库, 哪些事务的提交结果尚
未写入数据库, 这样系统重新启动后, 就要撤
消所有的未完成事务, 重做所有的已经提交的
事务 。
?但是, 在故障发生前已经运行完毕的事务有些
是正常结束的, 有些是异常结束的 。 所以无需
把它们全部撤消或重做 。
?通常采用设立检查点 ( Checkpoint) 的方法来
判断事务是否正常结束 。 每隔一段时间, 比如
说 5分钟, 系统就产生一个检查点, 做下面一
些事情,
1,把仍保留在日志缓冲区中的内容写到日志文件中;
2,在日志文件中写一个, 检查点记录, ;
返回 532
3,把数据库缓冲区中的内容写到数据库中, 即把更
新的内容写到物理数据库中;
4,把日志文件中检查点记录的地址写到, 重新启动
文件, 中 。
?每全检查点记录包含的信息有:在检查点时
间的所有活动事务一览表, 每个事务最近日
志记录的地址 。
?在重新启动时, 恢复管理程序先从, 重新启
动文件, 中获得检查点记录的地址, 从日志
文件中找到该检查点记录的内容, 通过日志
往回找, 就能决定哪些事务需要撤消, 恢复
到初始的状态, 哪些事务需要重做 。
返回 533
5.4.3.3介质故障 ( Media Failure) 及其恢复
? 介质故障是指系统在运行过程中, 由于辅助存储器介
质受到破坏, 使存储在外存中的数据部分丢失或全部
丢失 。
? 这类故障比事务故障和系统故障发生的可能性要小,
但这是最严重的一种故障, 破坏性很大, 磁盘上的物
理数据和日志文件可能被破坏, 这需要装入发生介质
故障前最新的后备数据库副本, 然后利用日志文件重
做该副本后所运行的所有事务 。
? 具体方法如下,
1,装入最新的数据库副本, 使数据库恢复到最近一次转储时的
可用状态 。
2,装入最新的日志文件副本, 根据日志文件中的内容重做已完
成的事务 。 首先正向扫描
返回 534
? 日志文件, 找出发生故障前已提交的事务, 将其记入
重做队例 。
? 再对重做队列中的各个事务进行重做处理, 方法是:
正向扫描日志文件, 对每个重做事务重新执行登记的
操作, 即将日志文件中数据己更新后的值写入数据库 。
? 通过以上对三类故障的分析, 我们可以看出故障发生
后对数据库的影响有两种可能性,
1,数据库没有被破坏, 但数据可能处于不一致状态 。 这是由事
务故障和系统故障引起的, 这种情况在恢复时, 不需要重装
数据库副本, 直接根据日志文件, 撤销故障发生时未完成的
事务, 并重做己完成的事务, 使数据库恢复到正确的状态 。
这类故障的恢复是系统在重新启动时自动完成的, 不需要用
户干预 。
2,数据库本身被破坏 。 这是由介质故障引起的, 这种情况在恢
复时, 把最近一次转储的数据装入, 然后借助于日志文件,
再在此基础上对数据库进行更新, 从而重建了数据库 。 这类
故障的恢复不能自动完成, 需要 DBA的介入, 先由 DBA重装
最近转储的数据库副本和相应的日志文件的副本, 再执行系
统提供的恢复命令, 具体的恢复操作由 DBMS来完成 。
返回 535
?数据库恢复的基本原理就是利用数据的冗余的,
十分简单, 实现的方法也比较清楚, 但真正实
现起来相当复杂, 实现恢复的程序非常庞大,
常常占整个系统代码的百分之十以上 。
?数据库系统所采用的恢复技术是否行之有效,
不仅对系统的可靠程度起着决定性使用, 而且
对系统的运行效率也有很大的影响, 是衡量系
统性能优劣的重要指标 。
返回 536
? 数据库的重要特征是它能为多个用户提供数据共享 。 在多个用
户使用同一数据库系统时, 要保证整个系统的正常运转, DBMS
必须具备一整套完整而有效的安全保护措施 。 本章从安全性控
制, 完整性控制, 并发性控制和数据库恢复四方面讨论了数据
库的安全保护功能 。
? 数据库的安全性 是指保护数据库, 以防止因非法使用数据库所
造成数据的泄露, 更改或破坏 。 实现数据库系统安全性的方法
有用户标识和鉴定, 存取控制, 视图定义, 数据加密和审计等
多种, 其中, 最重要的是存取控制技术和审计技术 。
? 数据库的完整性 是指保护数据库中数据的正确性, 有效性和相
容性 。 完整性和安全性是两个不同的概念, 安全性措施的防范
对象是非法用户和非法操作, 完整性措施的防范对象是合法用
户的不合语义的数据 。 这些语义约束构成了数据库的三条完整
性规则, 即触发条件, 约束条件和违约响应 。 完整性约束条件
从使用对象分为值的约束和结构的约束, 从约束对象的状态又
可分为静态约束和动态约束 。
小 结
返回 537
小 结
? 并发控制 是为了防止多个用户同时存取同一数据, 造成数
据库的不一致性 。 事务是数据库的逻辑工作单位, 并发操
作中只有保证系统中一切事务的原子性, 一致性, 隔离性
和持久性, 才能保证数据库处于一致状态 。 并发操作导致
的数据库不一致性主要有丢失更新, 污读和不可重读三种 。
实现并发控制的方法主要是封锁技术, 基本的封锁类型有
排它锁和共享锁两种, 三个级别的封锁协议可以有效解决
并发操作的一致性问题 。 对数据对象施加封锁, 会带来活
锁和死锁问题, 并发控制机制可以通过采取 一 次加锁法或
顺序加锁法预防死锁的产生 。 死锁一旦发生, 可以选择一
个处理死锁代价最小的事务将其撤销 。
? 数据库的恢复 是指系统发生故障后,把数据从错误状态中
恢复到某一正确状态的功能。对于事务故障、系统故障和
介质故障三种不同的故障类型,DBMS有不同的恢复方法。
登记日志文件和数据转储是恢复中常用的技术,恢复的基
本原理是利用存储在日志文件和数据库后备副本中的冗余
数据来重建数据库。
返回 538
第 6章 数据库设计
返回 539
6.1 数据库设计概述
6.1.1 数据库设计的任务, 内容和特点
6.1.1.1 数据库设计的任务
?数据库设计是指根据用户需求研制数据库结构
的过程, 具体地说, 是指对于一个给定的应用
环境, 构造最优的数据库模式, 建立数据库及
其应用系统, 使之能有效的存储数据, 满足用
户的信息要求和处理要求 。
?也就是把现实世界中的数据, 根据各种应用处
理的要求, 加以合理地组织, 满足硬件和操作
系统的特性, 利用已有的 DBMS来建立能够实现
系统目标的数据库 。
返回 540
数据库设计的任务如图 6.1所示 。
数据库
设 计
信息需求
处理需求
信息需求
典型应用程序
DBM特性
硬件和操作
系统特性
图 6.1 数据库设计的任务
返回 541
6.1.1.2 数据库设计的内容
?数据库设计包括数据库的结构设计和数据库的
行为设计两方面的内容 。
1,数据库的结构设计
?数据库的结构设计指是根据给定的应用环境,
进行数据库的模式或子模式的设计 。
?它包括数据库的概念设计, 逻辑设计和物理设
计 。
?数据库模式是各应用程序共享的结构, 是静态
的, 稳定的, 一经形成后通常情况下是不容易
改变的, 所以结构设计又称为 静态模型设计 。
返回 542
2,数据库的行为设计
? 数据库的行为设计是指确定数据库用户的行为和动作 。
而在数据库系统中, 用户的行为和动作指用户对数据
库的操作, 这些要通过应用程序来实现, 所以数据库
的行为设计就是应用程序的设计 。
? 用户的行为总是使数据库的内容发生变化, 所以行为
设计是动态的, 行为设计又称为 动态模型设计 。
6.1.1.3 数据库设计的特点
? 在 70年代末 80年代初, 人们为了研究数据库设计方法
学的便利, 曾主张将结构设计和行为设计两者分离,
随着数据库设计方法学的成熟和结构化分析, 设计方
法的普遍使用, 人们主张将两者作一体化的考虑, 这
样可以缩短数据库的设计周期, 提高数据库的设计效
率 。
返回 543
?现代数据库的设计的特点是强调结构设计与行
为设计相结合, 是一种, 反复探寻, 逐步求精,
的过程 。 首先从数据模型开始设计, 以数据模
型为核心进行展开, 数据库设计和应用系统设
计相结合, 建立一个完整, 独立, 共享, 冗余
小, 安全有效的数据库系统 。
?图 6.2给出了数据库设计的全过程 。
返回 544
现实世界
数据分析
用户业务活动分析
概念设计
功能模型
逻辑设计
事务设计
物理设计
程序说明
子模式设计
应用程序设计
加载试验数据
程序编码调试
性能考核
满意


加载数据库
运行和维护
图 6.2 数据库设计的全过程
返回 545
6.1.2 数据库设计方法简述
? 数据库设计方法目前可分为四类,直观设计法, 规范设计法, 计
算机辅助设计法 和 自动化设计法 。
? 直观设计法也叫手工试凑法,它是最早使用的数据库设计方法。
这种方法依赖于设计者的经验和技巧,缺乏科学理论和工程原则
的支持,设计的质量很难保证,常常是数据库运行一段时间后又
发现各种问题,这样再重新进行修改,增加了系统维护的代价。
因此这种方法越来越不适应信息管理发展的需要。
? 为了改变这种情况,1978年 10月,来自三十多个国家的数据库专
家在美国新奥尔良( New Orleans)市专门讨论了数据库设计问
题,他们运用软件工程的思想和方法,提出了数据库设计的规范,
这就是著名的新奥尔良法,它是目前公认的比较完整和权威的一
种规范设计法。新奥尔良法将数据库设计分成需求分析(分析用
户需求)、概念设计(信息分析和定义)、逻辑设计(设计实现)
和物理设计(物理数据库设计)。目前,常用的规范设计方法大
多起源于新奥尔良法,并在设计的每一阶段采用一些辅助方法来
具体实现。
? 下面简单介绍几种常用的规范设计方法。
返回 546
1.基于 E-R模型的数据库设计方法
?基于 E-R模型的数据库设计方法是由 P.P.S.chen于
1976年提出的数据库设计方法,其基本思想是在需
求分析的基础上,用 E-R(实体 —联系)图构造一
个反映现实世界实体之间联系的企业模式,然后再
将此企业模式转换成基于某一特定的 DBMS的概念
模式。
2,基于 3NF的数据库设计方法
?基于 3NF的数据库设计方法是由 S·Atre提出的结构化
设计方法,其基本思想是在需求分析的基础上,确
定数据库模式中的全部属性和属性间的依赖关系,
将它们组织在一个单一的关系模式中,然后再分析
模式中不符合 3NF的约束条件,将其进行投影分解,
规范成若干个 3NF关系模式的集合。
?其具体设计步骤分为五个阶段,
返回 547
(1)设计企业模式, 利用规范化得到的 3NF关系
模式画出企业模式;
(2)设计数据库的概念模式, 把企业模式转换
成 DBMS所能接受的概念模式, 并根据概念模
式导出各个应用的外模式;
(3)设计数据库的物理模式 ( 存储模式 ) ;
(4)对物理模式进行评价;
(5) 实现数据库 。
返回 548
3,基于视图的数据库设计方法
?此方法先从分析各个应用的数据着手, 其基本
思想是为每个应用建立自己的视图, 然后再把
这些视图汇总起来合并成整个数据库的概念模
式 。 合并过程中要解决以下问题,
(1) 消除命名冲突;
(2) 消除冗余的实体和联系;
(3)进行模式重构, 在消除了命名冲突和冗余后, 需
要对整个汇总模式进行调整, 使其满足全部完整性
约束条件 。
返回 549
? 除了以上三种方法外, 规范化设计方法还有实体分析
法, 属性分析法和基于抽象语义的设计方法等, 这里
不再详细介绍 。
? 规范设计法从本质上来说仍然是手工设计方法, 其基
本思想是过程迭代和逐步求精 。
? 计算机辅助设计法是指在数据库设计的某些过程中模
拟某一规范化设计的方法, 并以人的知识或经验为主
导, 通过人机交互方式实现设计中的某些部分 。
? 目前许多计算机辅助软件工程 ( Computer Aided
Software Engineering,CASE) 工具可以自动或辅助
设计人员完成数据库设计过程中的很多任务,比如
SYSBASE公司的 PowerDesigner和 Oracle公司的 Design
2000。
返回 550
6.1.3 数据库设计的步骤
?和其他软件一样, 数据库的设计过程可以使用
软件工程中的生存周期的概念来说明, 称为
,数据库设计的生存期,, 它是指从数据库研
制到不再使用它的整个时期 。
?按规范设计法可将数据库设计分为六个阶段
( 如图 6.3所示 ),
( 1) 系统需求分析阶段
( 2) 概念结构设计阶段
( 3) 逻辑结构设计阶段
( 4) 物理设计阶段
( 5) 数据库实施阶段
( 6) 数据库运行与维护阶段
返回 551
? 该方法是分阶段完成的, 每完成一个阶段, 都要进行
设计分析, 评价一些重要的设计指标, 把设计阶段产
生的文档组织评审, 与用户进行交流 。 如果设计的数
据库不符合要求则进行修改, 这种分析和修改可能要
重复若干次, 以求最后实现的数据库能够比较精确地
模拟现实世界, 能较准确地反映用户的需求, 设计一
个完善的数据库应用系统往往是六个阶段的不断反复
的过程 。
? 数据库设计中, 前两个阶段是面向用户的应用要求,
面向具体的问题;中间两个阶段是面向数据库管理系
统;最后两个阶段是面向具体的实现方法 。 前四个阶
段可统称为, 分析和设计阶段,, 后两个阶段称为
,实现和运行阶段, 。
? 六个阶段的主要工作各有不同 。
返回 552
1,系统需求分析阶段
?需求分析是整个数据库设计过程的基础, 要收集数
据库所有用户的信息内容和处理要求, 并加以规格
化和分析 。 这是最费时, 最复杂的一步, 但也是最
重要的一步, 相当于待构建的数据库大厦的地基,
它决定了以后各步设计的速度与质量 。 需求分析做
得不好, 可能会导致整个数据库设计返工重做 。 在
分析用户需求时, 要确保用户目标的一致性 。
2,概念结构设计阶段
?概念设计是把用户的信息要求统一到一个整体逻辑
结构中, 此结构能够表达用户的要求, 是一个独立
于任何 DBMS软件和硬件的概念模型 。
3,逻辑结构设计阶段
?逻辑设计是将上一步所得到的概念模型转换为某个
DBMS所支持的数据模型, 并对其进行优化 。
返回 553
图 6.3 数据库的设计步骤
Y
Y
N
N
需求分析阶段
现 有应 用
,未来 应
用 数据分析
概念模型设计
转换规范, 规范
化理论 DBMS要
求 逻辑模型设计
用户应用要求
DBMS限制
物理模型设计
应 用程 序
的 使用 频

性能评价与预测
符合要求

物理实现
试运行
满意?
使用与维护
概念设计阶段
逻辑设计阶段
物理设计阶段
数据库实施阶段
数据库运行维护阶段
返回 554
4,物理设计阶段
?物理设计是为逻辑数据模型建立一个完整的能实现的数据库
结构, 包括存储结构和存取方法 。
?上述分析和设计阶段是很重要的, 如果做出不恰当的分析或
设计, 则会导致一个不恰当或反应迟钝的应用系统 。
5,数据库实施阶段
?根据物理设计的结果把原始数据装入数据库, 建立一个具体
的数据库并编写和调试相应的应用程序 。 应用程序的开发目
标是开发一个可依赖的有效的数据库存取程序, 来满足用户
的处理要求 。
6,数据库运行与维护阶段
?这一阶段主要是收集和记录实际系统运行的数据, 数据库运
行的记录用来提高用户要求的有效信息, 用来评价数据库系
统的性能, 进一步调整和修改数据库 。 在运行中, 必须保持
数据库的完整性, 并能有效地处理数据库故障和进行数据库
恢复 。 在运行和维护阶段, 可能要对数据库结构进行修改或
扩充 。
返回 555
? 可以看出, 以上六个阶段是从数据库应用系统设计和
开发的全过程来考察数据库设计的问题 。 因此, 它既
是数据库也是应用系统的设计过程 。 在设计过程中,
努力使数据库设计和系统其他部分的设计紧密结合,
把数据和处理的需求收集, 分析, 抽象, 设计和实现
在各个阶段同时进行, 相互参照, 相互补充, 以完善
两方面的设计 。 按照这个原则, 数据库过程各个阶段
的设计可用图 6.4描述 。
? 在上图有关处理特性的描述中, 采用的设计方法和工
具属于软件工程和管理信息系统等课程中的内容, 本
书不再讨论, 这里重点介绍数据特性的设计描述以及
在结构特性中参照处理特性设计以完善数据模型设计
的问题 。
? 以下各节分别详细介绍数据库设计的六个阶段 。
返回 556
?需求分析是数据库设计的起点,为以后的具体
设计作准备。
?需求分析的结果是否准确的反映了用户的实际
要求,将直接影响到后面各个阶段的设计,并
影响到设计结果是否合理和实用。
?经验证明,由于设计要求的不正确或误解,直
到系统测试阶段才发现许多错误,则纠正起来
要付出很大代价。
?因此,必须高度重视系统的需求分析。
6.2 系统需求分析
返回 557
6.2.1 需求分析的任务
?从数据库设计的角度来看,需求分析的任务是:
对现实世界要处理的对象(组织、部门、企业)
等进行详细的调查,通过对原系统的了解,收
集支持新系统的基础数据并对其进行处理,在
此基础上确定新系统的功能。
返回 558
具体地说,需求分析阶段的任务包括以下三项,
设计阶段
设 计 描 述
数据
处理
需求分析
数据字典, 全系统中数据项,
数据流, 数据存储的描述
数据流图和定表 ( 判定树 )
数据字典中处理过程的描述
概念结构设 计 概念模型 ( E-R图 )
数据字典
系统说明书 。 包括,
(1) 新系统要求, 方案和概图
(2) 反映新系统信息的数据流图
逻辑结构设 计 某种数据模型 关系模型
系统结构图
非关系模型 ( 模块结构图 )
物理设计
存储安排
存取方法选择
存取路径建立
模块设计
IPO表
实施阶段 编写模式 装入数据
数据库试运行
程序编码
编译联结
测试
运行维护 性能测试, 转储 /恢复数据库 重组和重构
新旧系统转换, 运行, 维护 ( 修正性, 适应性,
改善性维护 )
图 6.4 数据库各个设计阶段的描述
返回 559
1,调查分析用户的活动
?这个过程通过对新系统运行目标的研究, 对现
行系统所存在的主要问题的分析以及制约因素
的分析, 明确用户总的需求目标, 确定这个目
标的功能域和数据域 。 具体做法是,
(1) 调查组织机构情况, 包括该组织的部门组成情况,
各部门的职责和任务等 。
(2) 调查各部门的业务活动情况, 包括各部门输入和
输出的数据与格式, 所需的表格与卡片, 加工处理
这些数据的步骤, 输入输出的部门等 。
返回 560
2,收集和分析需求数据, 确定系统边界
? 在熟悉业务活动的基础上, 协助用户明确对新系统的
各种需求, 包括用户的信息需求, 处理需求, 安全性
和完整性的需求等 。
( 1) 信息需求指目标范围内涉及的所有实体, 实体的属性以及
实体间的联系等数据对象, 也就是用户需要从数据库中获得
信息的内容与性质 。 由信息要求可以导出数据要求, 即在数
据库中需要存储哪些数据 。
( 2) 处理需求指用户为了得到需求的信息而对数据进行加工处
理的要求, 包括对某种处理功能的响应时间, 处理的方式
( 批处理或联机处理 ) 等 。
( 3) 安全性和完整性的需求 。 在定义信息需求和处理需求的同
时必须相应确定安全性和完整性约束 。
? 在收集各种需求数据后, 对前面调查的结果进行初步
分析, 确定新系统的边界, 确定哪些功能由计算机完
成或将来准备让计算机完成, 哪些活动由人工完成 。
由计算机完成的功能就是新系统应该实现的功能 。
返回 561
3,编写需求分析说明书
? 系统分析阶段的最后是编写系统分析报告, 通常称为
需求规范说明书 。 需求规范说明书是对需求分析阶段
的一个总结 。 编写系统分析报告是一个不断反复, 逐
步深入和逐步完善的过程, 系统分析报告应包括如下
内容,
(1) 系统概况, 系统的目标, 范围, 背景, 历史和现状;
(2) 系统的原理和技术, 对原系统的改善;
(3) 系统总体结构与子系统结构说明;
(4) 系统功能说明;
(5) 数据处理概要, 工程体制和设计阶段划分;
(6) 系统方案及技术, 经济, 功能和操作上的可行性 。
? 完成系统的分析报告后,在项目单位的领导下要组织
有关技术专家评审系统分析报告,这是对需求分析结
构的再审查。审查通过后由项目方和开发方领导签字
认可。
返回 562
随系统分析报告提供下列附件,
(1) 系统的硬件, 软件支持环境的选择及规格要求
( 所选择的数据库管理系统, 操作系统, 汉字平台,
计算机型号及其网络环境等 ) 。
(2) 组织机构图, 组织之间联系图 t 各机构功能业务
一览图 。
(3) 数据流程图, 功能模块图和数据字典等图表 。
?如果用户同意系统分析报告和方案设计, 在与
用户进行详尽商讨的基础上, 最后签订技术协
议书 。
?系统分析报告是设计者和用户一致确认的权威
性文献, 是今后各阶段设计和工作的依据 。
返回 563
6.2.2 需求分析的方法
? 用户参加数据库设计是数据应用系统设计的特点, 是
数据库设计理论不可分割的一部分 。
? 在数据需求分析阶段, 任何调查研究没有用户的积极
参加是寸步难行的, 设计人员应和用户取得共同的语
言, 帮助不熟悉计算机的用户建立数据库环境下的共
同概念, 所以这个过程中不同背景的人员之间互相了
解与沟通是至关重要的, 同时方法也很重要 。
? 用于需求分析的方法有多种, 主要方法有自顶向下和
自底向上两种,如图 6.5所示 。
? 其中自顶向下的分析方法( Structured Analysis,简称
SA方法)是最简单实用的方法。 SA方法从最上层的系
统组织机构入手,采用逐层分解的方式分析系统,用
数据流图 ( Data Flow Diagram,DFD)和 数据字典
( Data Dictionary,DD)描述系统。
? 下面对数据流图和数据字典作些简单的介绍。
返回 564
1,数据流图
? 使用 SA方法, 任何一个系统都可抽象为图 6.6所示的数
据流图 。
? 在数据流图中, 用命名的箭头表示数据流, 用圆圈表
示处理, 用矩形或其他形状表示存储 。
? 图 6.7是一个简单的数据流图 。 一个简单的系统可用一
张数据流图来表示 。 当系统比较复杂时, 为了便于理
解, 控制其复杂性, 可以采用分层描述的方法 。 一般
用第一层描述系统的全貌, 第二层分别描述各子系统
的结构 。 如果系统结构还比较复杂, 那么可以继续细
化, 直到表达清楚为止 。 在处理功能逐步分解的同时,
它们所用的数据也逐级分解, 形成若干层次的数据流
图 。 数据流图表达了数据和处理过程的关系 。
? 在 SA方法中,处理过程的处理逻辑常常借助判定表或
判定树来描述,而系统中的数据则是借助数据字典来
描述
返回 565
图 6.5 需求分析的方法
(a) 自顶向下的需求分析 (b) 自底向上的需求分析
… …
… … …

需求
需求


需求

需求 需求 需求 需求
需求 需求 需求 需求
需求 需求

需求

返回 566
图 6.6 数据流图
数据流 数据流
数据存储
数据来源 处

数据输出
处理需求
信息需求
返回 567
图 6.7 数据流图示例
付款凭证 报销单
报销登记
报销人 审查
分录
返回 568
2,数据字典
? 数据字典是对系统中数据的详细描述, 是各类数据结
构和属性的清单 。 它与数据流图互为注释 。
? 数据字典贯穿于数据库需求分析直到数据库运行的全
过程, 在不同的阶段其内容和用途各有区别 。
? 在需求分析阶段, 它通常包含以下五部分内容 。
(1) 数据项
?数据项是数据的最小单位, 其具体内容包括:数据顶名, 含
义说明, 别名, 类型, 长度, 取值范围, 与其他数据项的关
系 。
?其中, 取值范围, 与其他数据项的关系这两项内容定义了完
整性约束条件, 是设计数据检验功能的依据 。
(2) 数据结构
?数据结构是数据项有意义的集合 。 内容包括:数据结构名,
含义说明, 这些内容组成数据项名 。
返回 569
(3) 数据流
?数据流可以是数据项, 也可以是数据结构, 它表示某一处理
过程中数据在系统内传输的路径 。
?内容包括:数据流名, 说明, 流出过程, 流入过程, 这些内
容组成数据项或数据结构 。
?其中, 流出过程说明该数据流由什么过程而来;流入过程说
明该数据流到什么过程 。
(4) 数据存储
?处理过程中数据的存放场所, 也是数据流的来源和去向之一 。
可以是手工凭证, 手工文档或计算机文件 。
?包括 { 数据存储名, 说明, 输入数据流, 输出数据流, 组成:
{ 数据项或数据结构 }, 数据量, 存取频度, 存取方式 } 。
?其中, 存取频度是指每天 ( 或每小时, 或每周 ) 存取几次,
每次存取多少数据等信息 。 存取方法指的是批处理, 还是联
机处理;是检索还是更新;是顺序检索还是随机检索等 。
返回 570
(5) 处理过程
?处理过程的处理逻辑通常用判定表或判定树来描述,
数据字典只用来描述处理过程的说明性信息 。
?处理过程包括 { 处理过程名, 说明, 输入,{ 数据
流 }, 输出,{ 数据流 }, 处理, { 简要说明 }} 。
?其中, 简要说明主要说明处理过程的功能及处理要
求 。
?功能是指该处理过程用来做什么 ( 不是怎么做 ),
处理要求指该处理频度要求, 如单位时间里处理多
少事务, 多少数据量, 响应时间要求等, 这些处理
要求是后面物理设计的输入及性能评价的标准 。
?最终形成的数据流图和数据字典为, 需求分析
说明书, 的主要内容,这是下一步进行概念设
计的基础。
返回 571
6.3.1 概念结构设计的必要性
? 在需求分析阶段, 设计人员充分调查并描述了用户的需求,
但这些需求只是现实世界的具体要求, 应把这些需求抽象
为信息世界的结构, 才能更好地实现用户的需求 。
? 概念设计就是将需求分析得到的用户需求抽象为信息结构,
即概念模型 。
? 在早期的数据库设计中, 概念设计并不是一个独立的设计
阶段 。 当时的设计方式是在需求分析之后, 接着就进行逻
辑设计 。 这样设计人员在进行逻辑设计时, 考虑的因素太
多, 既要考虑用户的信息, 又要考虑具体 DBMS的限制,
使得设计过程复杂化, 难以控制 。 为了改善这种状况,
P.P.S.chen设计了基于 E-R模型的数据库设计方法, 即在需
求分析和逻辑设计之间增加了一个概念设计阶段 。 在这个
阶段, 设计人员仅从用户角度看待数据及处理要求和约束,
产生一个反映用户观点的概念模型, 然后再把概念模型转
换成逻辑模型 。 这样做有三个好处,
6.3 概念结构设计
返回 572
(1) 从逻辑设计中分离出概念设计以后, 各阶段的任
务相对单一化, 设计复杂程度大大降低, 便于组织
管理 。
(2) 概念模型不受特定的 DBMS的限制, 也独立于存储
安排和效率方面的考虑, 因而比逻辑模型更为稳定 。
(3) 概念模型不含具体的 DBMS所附加的技术细节, 更
容易为用户所理解, 因而更有可能准确反映用户的
信息需求 。
?设计概念模型的过程称为概念设计 。 概念模型
在数据库的各级模型中的地位如图 6.8所示 。
返回 573
图 6.8 数据库各级模型的形成
应用 1
应用要求
应用 2
应用要求
应用 3
应用要求
概念模式
综合
应用 1
外模式 1
应用 2
外模式 2
应用 3
外模式 3
概念模式
概念模式
转换
映象
映象
返回 574
6.3.2 概念模型的特点
? 概念模型作为概念设计的表达工具, 为数据库提供一
个说明性结构, 是设计数据库逻辑结构即逻辑模型的
基础 。 因此, 概念模型必须具备以下特点,
(1) 语义表达能力丰富 。 概念模型能表达用户的各种需求, 充分
反映现实世界, 包括事物和事物之间的联系, 用户对数据的
处理要求, 它是现实世界的一个真实模型 。
(2) 易于交流和理解 。 概念模型是 DBA,应用开发人员和用户之
间的主要界面, 因此, 概念模型要表达自然, 直观和容易理
解, 以便和不熟悉计算机的用户交换意见, 用户的积极参与
是保证数据库设计和成功的关键 。
(3) 易于修改和扩充 。 概念模型要能灵活地加以改变, 以反映用
户需求和现实环境的变化 。
(4) 易于向各种数据模型转换 。 概念模型独立于特定的 DBMS,因
而更加稳定, 能方便地向关系模型, 网状模型或层次模型等
各种数据模型转换 。
? 人们提出了许多概念模型,其中最著名、最实用的一
种是 E-R模型,它将现实世界的信息结构统一用属性、
实体以及它们之间的联系来描述。
返回 575
6.3.3 概念结构设计的方法与步骤
1,概念结构设计的方法
? 设计概念结构的 E-R模型可采用四种方法 。
(1) 自顶向下 。 先定义全局概念结构 E-R模型的框架, 再逐步细
化 。 如图 6.9( a) 所示 。
(2) 自底向上 。 先定义各局部应用的概念结构 E-R模型, 然后将
它们集成, 得到全局概念结构 E-R模型 。 如图 6.9( b) 所示 。
(3) 逐步扩张 。 先定义最重要的核心概念 E-R模型, 然后向外扩
充, 以滚雪球的方式逐步生成其他概念结构 E-R模型 。 如图
6.9( c) 所示 。
(4) 混合策略 。 该方法采用自顶向下和自底向上相结合的方法,
先自顶向下定义全局框架, 再以它为骨架集成自底向上方法
中设计的各个局部概念结构 。
? 其中最常用的方法是自底向上。即自顶向下地进行需
求分析,再自底向上地设计概念结构。
返回 576
2,概念结构设计的步骤
? 自底向上的设计方法可分为两步, 如图 6.10所示,
(1) 进行数据抽象, 设计局部 E-R模型, 即设计用户视图 。
(2) 集成各局部 E-R模型, 形成全局 E-R模型, 即视图的集成 。
3,数据抽象与局部 E-R模型设计
? 概念结构是对现实世界的一种抽象 。
? 所谓抽象是对实际的人, 物, 事和概念进行人为处理,
它抽取人们关心的共同特性, 忽略非本质的细节, 并
把这些特性用各种概念精确地加以描述, 这些概念组
成了某种模型 。
? 概念结构设计首先要根据需求分析得到的结果 ( 数据
流图, 数据字典等 ) 对现实世界进行抽象, 设计各个
局部 E-R模型 。
返回 577
图 6.9 概念结构设计的方法

… … … 概念模式


(b) 自底向上的设计方法
概念模式 概念模式 概念模式
子需

概念模式 概念模式
全局概念模式
子需

子需

子需


全局概念模式


概念模式
概念模式 概念模式 概念模式 概念模式
(a) 自顶向下的设计方法
概念模式


(c) 逐步扩张的设计方法
核心需



核心
概念
结构
全局
概念
结构

返回 578
图 6.10 自底向上方法的设计步骤
需求分析
数据抽象,
局部视图设计
视图集成
征求用
户意见
DFD,DD
局部 E- R图
全局 E- R图
逻辑结构设计
返回 579
(1) E-R方法
? E-R方法是, 实体 -联系方法, ( Entity-Relationship
Approach) 的简称 。 它是描述现实世界概念结构模型的
有效方法 。 用 E-R方法建立的概念结构模型称为 E-R模型,
或称为 E-R图 。
? E-R图基本成分包含实体型, 属性和联系 。 ( 在第 1章已
经介绍过它们的基本概念, 这里只给出它们的表示方
法 。 )
① 实体型:用矩形框表示, 框内标注实体名称 。 如图 6.11( a) 所示 。
② 属性:用椭圆形框表示, 框内标注属性名称 。 如图 6.11( b) 所示 。
③ 联系:指实体之间的联系, 有一对一 ( 1,1), 一对多 ( 1,n)
或多对多 ( m, n) 三种联系类型 。 例如系主任领导系, 学生属
于某一系, 学生选修课程, 工人生产产品, 这里, 领导,,, 属
于,,, 选修,,, 生产, 表示实体间的联系, 可以作为联系名
称 。 联系用菱形框表示, 框内标注联系名称 。 如图 6.11( c) 所示 。
返回 580
?现实世界的复杂性导致实体联系的复杂性 。 表现在 E-R
图上可以归结为图 6.12所示的几种基本形式,
① 两个实体之间的联系, 如图 6.12( a) 所示 。
② 两个以上实体间的联系, 如图 6.12( b) 所示 。
③ 同一实体集内部各实体之间的联系, 例如一个部门内的职工
有领导与被领导的联系, 即某一职工 ( 干部 ) 领导若干名职工,
而一个职工 ( 普通员工 ) 仅被另外一个职工直接领导, 这就构
成了实体内部的一对多的联系 。 如图 6.12( c) 所示 。
?需要注意的是,因为联系本身也是一种实体型,所以
联系也可以有属性。如果一个联系具有属性,则这些
联系也要用无向边与该联系连接起来。例如,学生选
修的课程有相应的成绩。这里的, 成绩, 既不是学生
的属性,也不是课程的属性,只能是学生选修课程的
联系的属性。图 6.12( b)中, 供应数量, 是, 供应,
联系的属性。
返回 581
?E-R图的基本思想就是分别用矩形框、椭圆形
框和菱形框表示实体、属性和联系,使用无向
边将属性与其相应的实体连接起来,并将联系
分别和有关实体相连接,注明联系类型。
?图 6.12为几个 E-R图的例子,只给出了实体及
其 E-R图,省略了实体的属性。
?图 6.13为一个描述学生与课程联系的完整的 E-
R图。
返回 582
6.11 E-R图的三种基本成份及其图形的表示方法
学生 选修 学号
(a)实体 (b)属性 (c)联系
返回 583
图 6.12 实体及其联系图
(a)两个实体之间的联系
学生
选修 成绩
课程
系主任
领导

学生
属于

1
1
n
1



n
(c)实体集内部的联系
m
职工
领导
1 n
供应商
供应 数量
零件 项目
m
n n
(b)多个实体之间的联系
返回 584
图 6.13 学生与课程联系的完整的 E- R图



学生










课程
课程



n
选修


m
返回 585
(2) 数据抽象
? 在系统需求分析阶段, 最后得到了多层数据流图, 数
据字典和系统分析报告 。 建立局部 E-R模型, 就是根据
系统的具体情况, 在多层的数据流图中选择一个适当
层次的数据流图, 作为设计分 E-R图的出发点, 让这组
图中毎一部分对应一个局部应用 。 在前面选好的某一
层次的数据流图中, 每个局部应用都对应了一组数据
流图, 局部应用所涉及的数据存储在数据字典中 。 现
在就是要将这些数据从数据字典中抽取出来, 参照数
据流图, 确定每个局部应用包含哪些实体, 这些实体
又包含哪些属性, 以及实体之间的联系及其类型 。
? 设计局部 E-R模型的关键就是正确划分实体和属性 。
实体和属性之间在形式上并无可以明显区分的界限,
通常是按照现实世界中事物的自然划分来定义实体和
属性, 将现实世界中的事物进行数据抽象, 得到实体
和属性 。
? 一般有两种数据抽象:分类和聚集 。
返回 586
① 分类 ( Classification)
?分类定义某一类概念作为现实世界中一组对象的类
型, 将一组具有某些共同特性和行为的对象抽象为
一个实体 。 对象和实体之间是, is member of”的关
系 。
?例如, 在教学管理中,, 赵亦, 是一名学生, 表示
,赵亦, 是学生中的一员, 她具有学生们共同的特
性和行为 。
② 聚集 ( Aggregation)
?聚集定义某一类型的组成成份, 将对象类型的组成
成份抽象为实体的属性 。 组成成份与对象类型之间
是, is part of”的关系 。
?例如, 学号, 姓名, 性别, 年龄, 系别等可以抽象
为学生实体的属性, 其中学号是标识学生实体的主
键 。
返回 587
(2) 局部 E-R模型设计
? 数据抽象后得到了实体和属性, 实际上实体和属性是
相对而言的, 往往要根据实际情况进行必要的调整 。
在调整中要遵循两条原则,
① 实体具有描述信息, 而属性没有 。 即属性必须是不可分的数据
项, 不能再由另一些属性组成 。
② 属性不能与其他实体具有联系, 联系只能发生在实体之间 。
?例如:学生是一个实体, 学号, 姓名, 性别, 年龄, 系别等
是学生实体的属性, 系别只表示学生属于哪个系, 不涉及系
的具体情况, 换句话说, 没有需要进一步描述的特性, 即是
不可分的数据项, 则根据原则 ① 可以作为学生实体的属性 。
但如果考虑一个系的系主任, 学生人数, 教师人数, 办公地
点等, 则系别应看作一个实体 。 如图 6.14所示 。
?又如,,职称, 为教师实体的属性,但在涉及住房分配时,
由于分房与职称有关,即职称与住房实体之间有联系,则根
据原则②,职称应作为一个实体。如图 6.15所示。
返回 588
图 6.14 系别作为一个属性或实体
学生
学生 系别


n 1
m 姓















系主任 学生人

教师人

办公地

返回 589
图 6.15 职称作为一个属性或实体
聘任
教师 教师
n 1
职称


住房
姓名 性别 职称 姓名 性别
返回 590
? 此外, 我们可能会遇到这样的情况, 同一数据项, 可
能由于环境和要求的不同, 有时作为属性, 有时则作
为实体, 此时必须根据实际情况而定 。 一般情况下,
凡能作为属性对待的, 应尽量作为属性, 以简化 E-R图
的处理 。
? 下面举例说明局部 E-R模型设计 。
? 在简单的教务管理系统中, 有如下语义约束 。
① 一个学生可选修多门课程, 一门课程可为多个学生选修, 因此
学生和课程是多对多的联系;
② 一个教师可讲授多门课程, 一门课程可为多个教师讲授, 因此
教师和课程也是多对多的联系;
③ 一个系可有多个教师, 一个教师只能属于一个系, 因此系和教
师是一对多的联系, 同样系和学生也是一对多的联系 。
? 根据上述约定,可以得到如图 6.16所示的学生选课局
部E-R图和如图 6.17所示的教师任课局部E-R图。
形成局部 E-R模型后,应该返回去征求用户意见,以
求改进和完善,使之如实地反映现实世界。
? E-R图的优点就是易于被用户理解,便于交流。
返回 591
图 6.16 学生选课局部E-R图
m
m n
m

名称 系



学生
学号 姓名 性别 年龄
开课
课程 教师

课程号 课程名
选修
成绩
平均成绩
返回 592
图 6.17 教师任课局部E-R图
1
m
教师

姓名 性别 职称 课程

教师 讲

课程 n


单位
单位

电话
m
返回 593
4,全局 E-R模型设计
?局部 E-R模型设计完成之后, 下一步就是集成
各局部 E-R模型, 形成全局 E-R模型, 即视图的
集成 。 视图集成的方法有两种,
① 多元集成法, 一次性将多个局部 E-R图合并为一个
全局 E-R图, 如图 6.18( a) 所示 。
② 二元集成法, 首先集成两个重要的局部视图, 以后
用累加的方法逐步将一个新的视图集成进来, 如图
6.18( b) 所示 。 在实际应用中, 可以根据系统复杂
性选择这两种方案 。 一般采用逐步集成的方法, 如果
局部视图比较简单, 可以采用多元集成法 。 一般情况
下, 采用二元集成法, 即每次只综合两个视图, 这样
可降低难度 。 无论使用哪一种方法, 视图集成均分成
两个步骤, 如图 6.19所示 。
① 合并, 消除各局部 E-R图之间的冲突, 生成初步 E-R图 。
② 优化, 消除不必要的冗余, 生成基本 E-R图 。
返回 594
图 6.18 局部视图合并成全局视图
(a) 多元集成法
局部 E- R图 1 … 局部 E- R图 2 局部 E- R图 n
初步 E- R图
基本 E- R图
局部 E- R图 1 局部 E- R图 2
合并 E- R图 12 局部 E- R图 3

初步 E- R图
基本 E- R图
(b) 二元集成法
返回 595
图 6.19 视图集成
局部E-R图
合并
( 消除冲突

修改与重构
( 消除不必
要的冗余 )
集成视图
基本E-R图
初步E-R图 分析 规范化理论
返回 596
(1) 合并局部 E-R图, 生成初步 E-R图
? 这个步骤将所有的局部 E-R图综合成全局概念结构 。
? 全局概念结构它不仅要支持所有的局部 E-R模型, 而且
必须合理地表示一个完整, 一致的数据库概念结构 。
? 由于各个局部应用不同, 通常由不同的设计人员进行
局部 E-R图设计, 因此, 各局部 E-R图不可避免地会有
许多不一致的的地方, 我们称之为 冲突 。
? 合并局部 E-R图时并不能简单地将各个 E-R图画到一起,
而必须消除各个局部 E-R图中的不一致, 使合并后的
全局概念结构不仅支持所有的局部 E-R模型, 而且必
须是一个能为全系统中所有用户共同理解和接受的完
整的概念模型 。
? 合并局部 E-R图的关键就是合理消除各局部 E-R图中的
冲突 。
返回 597
?E-R图中的冲突有三种:属性冲突, 命名
冲突和结构冲突 。
① 属性冲突
?属性冲突又分为属性值域冲突和属性的取值单
位冲突 。
a.属性值域冲突, 即属性值的类型, 取值范围或取
值集合不同 。 比如学号, 有些部门将其定义为数值
型, 而有些部门将其定义为字符型 。 又如年龄, 有
的可能用出生年月表示, 有的则用整数表示 。
b.属性的取值单位冲突 。 比如零件的重量, 有的以
公斤为单位, 有的以斤为单位, 有的则以克为单位 。
?属性冲突属于用户业务上的约定, 必须与用户
协商后解决 。
返回 598
② 命名冲突
? 命名不一致可能发生在实体名, 属性名或联系名之间,
其中属性的命名冲突更为常见 。
? 一般表现为同名异义或异名同义 ( 实体, 属性, 联系
名 ) 。
a.同名异义, 即同一名字的对象在不同的部门中具有不同的
意义 。
比如,, 单位, 在某些部门表示为人员所在的部门, 而在
某些部门可能表示物品的重量, 长度等属性 。
b.异名同义, 即同一意义的对象在不同的部门中具有不同的
名称 。
比如, 对于, 房间, 这个名称, 在教务管理部门中对应着
为教室, 而在后勤管理部门对应为学生宿舍 。
? 命名冲突的解决方法同属性冲突, 需要与各部门协商,
讨论后加以解决 。
返回 599
③ 结构冲突
a.同一对象在不同应用中有不同的抽象, 可能为实体,
也可能为属性 。 例如, 教师的职称在某一局部应用中
被当作实体, 而在另一局部应用中被当作属性 。
这类冲突在解决时, 就是使同一对象在不同应用中具有相同的
抽象, 或把实体转换为属性, 或把属性转换为实体 。 但都要符
合 6.3.3中所介绍的准则 。
b.同一实体在不同应用中属性组成不同, 可能是属性
个数或属性次序不同 。
解决办法是, 合并后实体的属性组成为各局部 E-R图中的同名实
体属性的并集, 然后再适当调整属性的次序 。
c.同一联系在不同应用中呈现不同的类型 。 比如 E1与
E2在某一应用中可能是一对一联系, 而在另一应用中
可能是一对多或多对多联系, 也可能是在 E1,E2,E3
三者之间有联系 。
这种情况应该根据应用的语义对实体联系的类型进行综合或调
整。
返回 600
?下面以教务管理系统中的两个局部 E-R图为例,
来说明如何消除各局部 E-R图之间的冲突, 进
行局部 E-R模型的合并, 从而生成初步 E-R图 。
?首先, 这两个局部 E-R图中存在着命名冲突, 学生
选课局部E-R图中的实体, 系, 与教师任课局部
E-R图中的实体, 单位,, 都是指, 系,, 即所
谓的异名同义, 合并后统一改为, 系,, 这样属性
,名称, 和, 单位, 即可统一为, 系名, 。
?其次, 还存在着结构冲突, 实体, 系, 和实体, 课
程, 在两个不同应用中的属性组成不同, 合并后这
两个实体的属性组成为原来局部 E-R图中的同名实
体属性的并集 。 解决上述冲突后, 合并两个局部 E-
R图, 生成如图 6.20所示的初步的全局 E-R图 。
返回 601
图 6.20 教务管理系统的初步 E- R图
m
n
1 系


教师


学生






课程
m
m
n
m
1
m
1
学号 姓名 性别 年龄
平均成绩
成绩
教师

课程号 课程

教师

姓名 性别 职称 系名 电话
返回 602
(2) 消除不必要的冗余, 生成基本 E-R图
? 所谓冗余, 在这里指冗余的数据和实体之间冗余的联
系 。 冗余的数据是指可由基本的数据导出的数据, 冗
余的联系是由其他的联系导出的联系 。 在上面消除冲
突合并后得到的初步 E—R图中, 可能存在冗余的数据
或冗余的联系 。 冗余的存在容易破坏数据库的完整性,
给数据库的维护增加困难, 应该消除 。 我们把消除了
冗余的初步 E-R图称为基本 E-R图 。
? 通常采用分析的方法消除冗余 。 数据字典是分析冗余
数据的依据, 还可以通过数据流图分析出冗余的联系 。
? 如在图 6.20所示的初步 E-R图中,, 课程, 实体中的属
性, 教师号, 可由, 讲授, 这个教师与课程之间的联
系导出, 而学生的平均成绩可由, 选修, 联系中的属
性, 成绩, 中计算出来, 所以, 课程, 实体中的, 教
师号, 与, 学生, 实体中的, 平均成绩, 均属于冗余
数据 。
返回 603
? 另外,, 系, 和, 课程, 之间的联系, 开课,, 可以
由, 系, 和, 教师, 之间的, 属于, 联系与, 教师,
和, 课程, 之间的, 讲授, 联系推导出来, 所以, 开
课, 属于冗余联系 。
? 这样, 图 6.20的初步 E-R图在消除冗余数据和冗余联系
后, 便可得到基本的 E-R模型, 如图 6.21所示 。
? 最终得到的基本 E-R模型是企业的概念模型, 它代表
了用户的数据要求, 是沟通, 要求, 和, 设计, 的桥
梁 。 它决定数据库的总体逻辑结构, 是成功建立数据
库的关键 。 如果设计不好, 就不能充分发挥数据库的
功能, 无法满足用户的处理要求 。
? 因此, 用户和数据库人员必须对这一模型反复讨论,
在用户确认这一模型已正确无误的反映了他们的要求
后, 才能进入下一阶段的设计工作 。
返回 604
图 6.21 教务管理系统的基本 E- R图
n
1 系


教师


学生




课程
m
m
n
m
1
m
学号 姓名 性别 年龄 成绩 课程号 课程名
教师号 姓名 性别 职称 系名 电话
返回 605
6.4.1 逻辑结构设计的任务和步骤
? 概念结构设计阶段得到的 E-R模型是用户的模型, 它独
立于任何一种数据模型, 独立于任何一个具体的 DBMS。
为了建立用户所要求的数据库, 需要把上述概念模型
转换为某个具体的 DBMS所支持的数据模型 。 数据库逻
辑设计的任务是将概念结构转换成特定 DBMS所支持的
数据模型的过程 。 从此开始便进入了, 实现设计, 阶
段, 需要考虑到具体的 DBMS的性能, 具体的数据模型
特点 。
? 从 E-R图所表示的概念模型可以转换成任何一种具体
的 DBMS所支持的数据模型, 如网状模型, 层次模型
和关系模型 。 这里只讨论关系数据库的逻辑设计问题,
所以只介绍 E-R图如何向关系模型进行转换 。
6.4 逻辑结构设计
返回 606
?一般的逻辑设计分为以下三步 ( 如图 6.22所
示 ),
(1) 初始关系模式设计;
(2) 关系模式规范化;
(3) 模式的评价与改进 。
返回 607
图 6.22 关系数据库的逻辑设计
概念结构设计
初始关系模式设计
关系模式规范化
模式评价
是否修正
以 DBMS语法描述
物理设计
模式修正


返回 608
6.4.2 初始关系模式设计
1,转换原则
? 概念设计中得到的 E-R图是由实体, 属性和联系组成的,
而关系数据库逻辑设计的结果是一组关系模式的集合 。
所以将 E-R图转换为关系模型实际上就是将实体, 属性
和联系转换成关系模式 。 在转换中要遵循以下原则,
(1) 一个实体转换为一个关系模式, 实体的属性就是关系的
属性, 实体的键就是关系的键 。
(2) 一个联系转换为一个关系模式, 与该联系相连的各实体
的键以及联系的属性均转换为该关系的属性 。 该关系的键有
三种情况,
① 如果联系为 1:1,则每个实体的键都是关系的候选键;
② 如果联系为 1,n, 则 n端实体的键是关系的键;
③ 如果联系为 n, m,则各实体键的组合是关系的键 。
返回 609
2,具体做法
(1) 把每一个实体转换为一个关系
?首先分析各实体的属性, 从中确定其主键, 然
后分别用关系模式表示 。 例如, 以图 6.21的 E-
R模型为例, 四个实体分别转换成四个关系模
式,
? 学生 ( 学号, 姓名, 性别, 年龄 )
? 课程 ( 课程号, 课程名 )
? 教师 ( 教师号, 姓名, 性别, 职称 )
? 系 ( 系名, 电话 )
?其中, 有下划线者表示是主键 。
返回 610
(2) 把每一个联系转换为关系模式
?由联系转换得到的关系模式的属性集中, 包含
两个发生联系的实体中的主键以及联系本身的
属性, 其关系键的确定与联系的类型有关 。
?例如, 还以图 6.21的 E-R模型为例, 四个联系
也分别转换成四个关系模式,
?属于 ( 教师号, 系名 )
?讲授 ( 教师号, 课程号 )
?选修 ( 学号, 课程号, 成绩 )
?拥有 ( 系名, 学号 )
返回 611
(3) 特殊情况的处理
?三个或三个以上实体间的一个多元联系在转换
为一个关系模式时, 与该多元联系相连的各实
体的主键及联系本身的属性均转换成为关系的
属性, 转换后所得到的关系的主键为各实体键
的组合 。
?例如, 图 6.23表示供应商, 项目和零件三个实
体之间的多对多联系, 如果已知三个实体的主
键分别为, 供应商号,,, 项目号, 与, 零件
号,, 则它们之间的联系, 供应, 可转换为关
系模式, 其中供应商号, 项目号, 零件号为此
关系的组合关系键 。
?供应 ( 供应商号, 项目号, 零件号, 数量 )
返回 612
供应商
供应 数量
零件 项目
m
n n
图 6.23 多个实体之间的联系
返回 613
6.4.3 关系模式规范化
? 应用规范化理论对上述产生的关系的逻辑模式进行初
步优化, 以减少乃至消除关系模式中存在的各种异常,
改善完整性, 一致性和存储效率 。
? 规范化理论是数据库逻辑设计的指南和工具, 规范化
过程可分为两个步骤:确定规范式级别, 实施规范化
处理 。
1,确定范式级别
?考查关系模式的函数依赖关系, 确定范式等级, 逐一分析各
关系模式, 考查是否存在部分函数依赖, 传递函数依赖等,
确定它们分别属于第几范式 。
2,实施规范化处理
?确定范式级别后, 利用第 4章的规范化理论, 逐一考察各个关
系模式, 根据应用要求, 判断它们是否满足规范要求, 可用
已经介绍过的规范化方法和理论将关系模式规范化 。
返回 614
?综合以上数据库的设计过程, 规范化理论在数
据库设计中有如下几方面的应用,
(1) 在需求分析阶段, 用数据依赖概念分析和表示
各个数据项之间的联系 。
(2) 在概念结构设计阶段, 以规范化理论为指导,
确定关系键, 消除初步 E-R图中冗余的联系 。
(3) 在逻辑结构设计阶段, 从 E-R图向数据模型转
换过程中, 用模式合并与分解方法达到规范化级别 。
返回 615
6.4.4 模式评价与改进
1,模式评价
? 关系模式的规范化不是目的而是手段, 数据库设计的
目的是最终满足应用需求 。 因此, 为了进一步提高数
据库应用系统的性能, 还应该对规范化后产生的关系
模式进行评价, 改进, 经过反复多次的尝试和比较,
最后得到优化的关系模式 。
? 模式评价的目的是检查所设计的数据库模式是否满足
用户的功能要求, 效率, 确定加以改进的部分 。 模式
评价包括功能评价和性能评价 。
? (1) 功能评价
?功能评价指对照需求分析的结果, 检查规范化后的关系模式
集合是否支持用户所有的应用要求 。 关系模式必须包括用户
可能访问的所有属性 。 在涉及多个关系模式的应用中, 应确
保联接后不丢失信息 。 如果发现有的应用不被支持, 或不完
全被支持, 则应该改进关系模式 。 发生这种问题的原因可能
是在逻辑设计阶段, 也可能是在需求分析或概念设计阶段 。
是哪个阶段的问题就返回到哪个阶段去, 因此有可能对前两
个阶段再进行评审, 解决存在的问题 。
返回 616
? 在功能评价的过程中,可能会发现冗余的关系模式或属性,这时应
对它们加以区分,搞清楚它们是为未来发展预留的,还是某种错误
造成的,比如名字混淆。如果属于错误处置,进行改正即可,而如
果这种冗余来源于前两个设计阶段,则也要返回重新进行评审。
(2) 性能评价
? 对于目前得到的数据库模式, 由于缺乏物理设计所提
供的数量测量标准和相应的评价手段, 所以性能评价
是比较困难的, 只能对实际性能进行估计, 包括逻辑
记录的存取数, 传送量以及物理设计算法的模型等 。
? 美国密执安大学的 T.Teorey和 J.Fry于 1980年提出的逻
辑记录访问 ( Logical Record Access,LRA) 方法是
一种常用的模式性能评价方法 。 LRA方法对网状模型和
层次模型较为实用, 对于关系模型的查询也能起一定
的估算作用 。
? 有关 LRA方法本书不详细介绍, 读者可以参考有关书
籍 。
返回 617
2,模式改进
?根据模式评价的结果, 对已生成的模式进行改
进 。
?如果因为需求分析, 概念设计的疏漏导致某些应用
不能得到支持, 则应该增加新的关系模式或属性 。
?如果因为性能考虑而要求改进, 则可采用合并或分
解的方法 。
(1) 合并
?如果有若干个关系模式具有相同的主键, 并且
对这些关系模式的处理主要是查询操作, 而且
经常是多关系的查询, 那么可对这些关系模式
按照组合使用频率进行合并 。
?这样便可以减少联接操作而提高查询效率 。
返回 618
(2) 分解
?为了提高数据操作的效率和存储空间的利用率,
最常用和最重要的模式优化方法就是分解, 根
据应用的不同要求, 可以对关系模式进行垂直
分解和水平分解 。
?水平分解 是把关系的元组分为若干子集合, 定
义每个子集合为一个子关系 。
?对于经常进行大量数据的分类条件查询的关系,
可进行水平分解, 这样可以减少应用系统每次
查询需要访问的记录数, 从而提高了查询性能 。
返回 619
?例如, 有学生关系 ( 学号, 姓名, 类别 …… ), 其
中类别包括大专生, 本科生和研究生 。 如果多数查
询一次只涉及其中的一类学生, 就应该把整个学生
关系水平分割为大专生, 本科生和研究生三个关系 。
?垂直分解 是把关系模式的属性分解为若干子集
合, 形成若干子关系模式 。 垂直分解的原则是
把经常一起使用的属性分解出来, 形成一个子
关系模式 。
?例如, 有教师关系 ( 教师号, 姓名, 性别, 年龄,
职称, 工资, 岗位津贴, 住址, 电话 ), 如果经常
查询的仅是前六项, 而后三项很少使用, 则可以将
教师关系进行垂直分割, 得到两个教师关系,
教师关系 1( 教师号, 姓名, 性别, 年龄, 职称, 工资 )
教师关系 2( 教师号, 岗位津贴, 住址, 电话 )
?这样, 便减少了查询的数据传递量, 提高了查
询速度 。
返回 620
? 垂直分解可以提高某些事务的效率, 但也有可能使另
一些事务不得不执行连接操作, 从而降低了效率 。 因
此是否要进行垂直分解要看分解后的所有事务的总效
率是否得到了提高 。 垂直分解要保证分解后的关系具
有无损连接性和函数依赖保持性 。 相关的分解算法已
经在第 4章进行了详细介绍 。
? 经过多次的模式评价和模式改进之后, 最终的数据库
模式得以确定 。 逻辑设计阶段的结果是全局逻辑数据
库结构 。 对于关系数据库系统来说, 就是一组符合一
定规范的关系模式组成的关系数据库模型 。
? 数据库系统的数据物理独立性特点消除了由于物理存
储改变而引起的对应程序的修改 。 标准的 DBMS例行
程序应适用于所有的访问, 查询和更新事务的优化应
当在系统软件一级上实现 。 这样, 逻辑数据库确定之
后, 就可以开始进行应用程序设计了 。
返回 621
?数据库最终要存储在物理设备上 。 对于给定的
逻辑数据模型, 选取一个最适合应用环境的物
理结构的过程, 称为数据库物理设计 。 物理设
计的任务是为了有效地实现逻辑模式, 确定所
采取的存储策略 。 此阶段是以逻辑设计的结果
作为输入, 结合具体 DBMS的特点与存储设备特
性进行设计, 选定数据库在物理设备上的存储
结构和存取方法 。
?数据库的物理设计可分为两步,
(1) 确定物理结构, 在关系数据库中主要指存取方
法和存储结构;
(2)评价物理结构, 评价的重点是时间和空间效率 。
6.5 数据库物理设计
返回 622
6.5.1 确定物理结构
? 设计人员必须深入了解给定的 DBMS的功能, DBMS提供
的环境和工具, 硬件环境,特别是存储设备的特征 。 另
一方面也要了解应用环境的具体要求, 如各种应用的
数据量, 处理频率和响应时间等 。 只有, 知己知彼,
才能设计出较好的物理结构 。
1,存储记录结构的设计
? 在物理结构中, 数据的基本存取单位是存储记录 。 有了逻辑记录结
构以后, 就可以设计存储记录结构, 一个存储记录可以和一个或多
个逻辑记录相对应 。 存储记录结构包括记录的组成, 数据项的类型
和长度, 以及逻辑记录到存储记录的映射 。 某一类型的所有存储记
录的集合称为, 文件,, 文件的存储记录可以是定长的, 也可以是
变长的 。
? 文件组织或文件结构是组成文件的存储记录的表示法 。 文件结构应
该表示文件格式, 逻辑次序, 物理次序, 访问路径, 物理设备的分
配 。 物理数据库就是指数据库中实际存储记录的格式, 逻辑次序和
物理次序, 访问路径, 物理设备的分配 。
? 决定存储结构的主要因素包括存取时间, 存储空间和维护代价三个
方面 。 设计时应当根据实际情况对这三个方面进行综合权衡 。 一般
DBMS也提供一定的灵活性可供选择, 包括聚簇和索引 。
返回 623
(1) 聚簇 ( Cluster)
? 聚簇就是为了提高查询速度, 把在一个 ( 或一组 ) 属
性上具有相同值的元组集中地存放在一个物理块中 。
如果存放不下, 可以存放在相邻的物理块中 。 其中,
这个 ( 或这组 ) 属性称为聚簇码 。
? 为什么要使用聚簇呢? 聚簇有两个作用,
① 使用聚簇以后, 聚簇码相同的元组集中在一起了, 因而聚簇值
不必在每个元组中重复存储, 只要在一组中存储一次即可, 因
此可以节省存储空间 。
② 聚簇功能可以大大提高按聚簇码进行查询的效率 。 例如, 假设
要查询学生关系中计算机系的学生名单, 设计算机系有 300名学
生 。 在极端情况下, 这些学生的记录会分布在 300个不同的物理
块中, 这时如果要查询计算机系的学生, 就需要做 300次的 I/O
操作, 这将影响系统查询的性能 。 如果按照系别建立聚簇, 使
同一个系的学生记录集中存放, 则每做一次 I/O操作, 就可以获
得多个满足查询条件和记录, 从而显著地减少了访问磁盘的次
数 。
返回 624
(2) 索引
? 存储记录是属性值的集合, 主关系键可以惟一确定一
个记录, 而其他属性的一个具体值不能惟一确定是哪
个记录 。 在主关系键上应该建立惟一索引, 这样不但
可以提高查询速度, 还能避免关系键重复值的录入,
确保了数据的完整性 。
? 在数据库中, 用户访问的最小单位是属性 。 如果对某
些非主属性的检索很频繁, 可以考虑建立这些属性的
索引文件 。 索引文件对存储记录重新进行内部链接,
从逻辑上改变了记录的存储位置, 从而改变了访问数
据的入口点 。 关系中数据越多索引的优越性也就越明
显 。
? 建立多个索引文件可以缩短存取时间, 但是增加了索
引文件所占用的存储空间以及维护的开销 。 因此, 应
该根据实际需要综合考虑 。
返回 625
2,访问方法的设计
? 访问方法是为存储在物理设备 ( 通常指辅存 ) 上的数据提
供存储和检索能力的方法 。 一个访问方法包括存储结构和
检索机构两个部分 。 存储结构限定了可能访问的路径和存
储记录;检索机构定义了每个应用的访问路径, 但不涉及
存储结构的设计和设备分配 。
? 存储记录是属性的集合, 属性是数据项类型, 可用作主键
或辅助键 。 主键惟一地确定了一个记录 。 辅助键是用作记
录索引的属性, 可能并不惟一确定某一个记录 。
? 访问路径的设计分成主访问路径与辅访问路径的设计 。 主
访问路径与初始记录的装入有关, 通常是用主键来检索的 。
首先利用这种方法设计各个文件, 使其能最有效地处理主
要的应用 。 一个物理数据库很可能有几套主访问路径 。 辅
访问路径是通过辅助键的索引对存储记录重新进行内部链
接, 从而改变访问数据的入口点 。 用辅助索引可以缩短访
问时间, 但增加了辅存空间和索引维护的开销 。 设计者应
根据具体情况作出权衡 。
返回 626
3,数据存放位置的设计
?为了提高系统性能, 应该根据应用情况将数据
的易变部分, 稳定部分, 经常存取部分和存取
频率较低部分分开存放 。
?例如, 目前许多计算机都有多个磁盘, 因此可
以将表和索引分别存放在不同的磁盘上, 在查
询时, 由于两个磁盘驱动器并行工作, 可以提
高物理读写的速度 。
?在多用户环境下, 可能将日志文件和数据库对
象 ( 表, 索引等 ) 放在不同的磁盘上, 以加快
存取速度 。 另外, 数据库的数据备份, 日志文
件备份等, 只在数据库发生故障进行恢复时才
使用, 而且数据量很大, 可以存放在磁带上,
以改进整个系统的性能 。
返回 627
4,系统配置的设计
? DBMS产品一般都提供了一些系统配置变量, 存储分配
参数, 供设计人员和 DBA对数据库进行物理优化 。 系统
为这些变量设定了初始值, 但是这些值不一定适合每
一种应用环境, 在物理设计阶段, 要根据实际情况重
新对这些变量赋值, 以满足新的要求 。
? 系统配置变量和参数很多, 例如, 同时使用数据库的
用户数, 同时打开的数据库对象数, 内存分配参数,
缓冲区分配参数 ( 使用的缓冲区长度, 个数 ), 存储
分配参数, 数据库的大小, 时间片的大小, 锁的数目
等, 这些参数值影响存取时间和存储空间的分配, 在
物理设计时要根据应用环境确定这些参数值, 以使系
统的性能达到最优 。
返回 628
6.5.2 评价物理结构
?和前面几个设计阶段一样,在确定了数据库的
物理结构之后,要进行评价,重点是时间和空
间的效率。
?如果评价结果满足设计要求,则可进行数据库
实施。
?实际上,往往需要经过反复测试才能优化物理
设计。
返回 629
?数据库实施是指根据逻辑设计和物理设计的结
果, 在计算机上建立起实际的数据库结构, 装
入数据, 进行测试和试运行的过程 。
?数据库实施主要包括以下工作,
?建立实际数据库结构;
?装入数据;
?应用程序编码与调试;
?数据库试运行;
?整理文档 。
6.6 数据库实施
返回 630
6.6.1 建立实际数据库结构
? DBMS提供的数据定义语言 ( DDL) 可以定义数据库结构 。
可使用第 3章所讲的 SQL定义语句中的 CREATE TABLE语
句定义所需的基本表, 使用 CREATE VIEW语句定义视
图 。
6.6.2 装入数据
? 装入数据又称为数据库加载 ( Loading), 是数据库实
施阶段的主要工作 。 在数据库结构建立好之后, 就可
以向数据库中加载数据了 。
? 由于数据库的数据量一般都很大, 它们分散于一个企
业 ( 或组织 ) 中各个部门的数据文件, 报表或多种形
式的单据中, 它们存在着大量的重复, 并且其格式和
结构一般都不符合数据库的要求, 必须把这些数据收
集起来加以整理, 去掉冗余并转换成数据库所规定的
格式, 这样处理之后才能装入数据库 。 因此, 需要耗
费大量的人力, 物力, 是一种非常单调乏味而又意义
重大的工作 。
返回 631
? 由于应用环境和数据来源的差异, 所以不可能存在普
遍通用的转换规则, 现有的 DBMS并不提供通用的数据
转换软件来完成这一工作 。
? 对于一般的小型系统, 装入数据量较少, 可以采用人
工方法来完成 。
? 首先将需要装入的数据从各个部门的数据文件中筛选出来, 转换成
符合数据库要求的数据格式,
? 然后输入到计算机中,
? 最后进行数据校验, 检查输入的数据是否有误 。
? 但是, 人工方法不仅效率低, 而且容易产生差错 。 对于数
据量较大的系统, 应该由计算机来完成这一工作 。 通常是
设计一个数据输入子系统, 其主要功能是从大量的原始数
据文件中筛选, 分类, 综合和转换数据库所需的数据, 把
它们加工成数据库所要求的结构形式, 最后装入数据库中,
同时还要采用多种检验技术检查输入数据的正确性 。
? 为了保证装入数据库中数据的正确无误, 必须高度重视数
据的校验工作 。 在输入子系统的设计中应该考虑多种数据
检验技术, 在数据转换过程中应使用不同的方法进行多次
检验, 确认正确后方可入库 。
返回 632
?如果在数据库设计时, 原来的数据库系统仍在
使用, 则数据的转换工作是将原来老系统中的
数据转换成新系统中的数据结构 。 同时还要转
换原来的应用程序, 使之能在新系统下有效地
运行 。
?数据的转换, 分类和综合常常需要多次才能完
成, 因而输入子系统的设计和实施是很复杂的,
需要编写许多应用程序, 由于这一工作需要耗
费较多的时间, 为了保证数据能够及时入库,
应该在数据库物理设计的同时编制数据输入子
系统, 而不能等物理设计完成后才开始 。
返回 633
6.6.3 应用程序编码与调试
? 数据库应用程序的设计属于一般的程序设计范畴, 但
数据库应用程序有自己的一些特点 。 例如, 大量使用
屏幕显示控制语句, 形式多样的输出报表, 重视数据
的有效性和完整性检查, 有灵活的交互功能 。
? 为了加快应用系统的开发速度, 一般选择第四代语言
开发环境, 利用自动生成技术和软件复用技术, 在程
序设计编写中往往采用工具 ( CASE) 软件来帮助编写
程序和文档, 如目前普遍使用的 PowerBuilder、
Delphi以及由北京航空航天大学研制的 863/CMIS支持
的数据库开发工具 OpenTools等 。
? 数据库结构建立好之后, 就可以开始编制与调试数据
库的应用程序, 这时由于数据入库尚未完成, 调试程
序时可以先使用模拟数据 。
返回 634
6.6.4 数据库试运行
? 应用程序编写完成, 并有了一小部分数据装入后, 应
该按照系统支持的各种应用分别试验应用程序在数据
库上的操作情况, 这就是数据库的试运行阶段, 或者
称为联合调试阶段 。 在这一阶段要完成两方面的工作 。
(1) 功能测试 。 实际运行应用程序, 测试它们能否完成各种
预定的功能 。
(2) 性能测试 。 测量系统的性能指标, 分析系统是否符合设
计目标 。
? 系统的试运行对于系统设计的性能检验和评价是很重
要的, 因为有些参数的最佳值只有在试运行后才能找
到 。 如果测试的结果不符合设计目标, 则应返回到设
计阶段, 重新修改设计和编写程序, 有时甚至需要返
回到逻辑设计阶段, 调整逻辑结构 。
返回 635
? 重新设计物理结构甚至逻辑结构, 会导致数据重新入
库 。 由于数据装入的工作量很大, 所以可分期分批的
组织数据装入, 先输入小批量数据做调试用, 待试运
行基本合格后, 再大批量输入数据, 逐步增加数据量,
逐步完成运行评价 。
? 数据库的实施和调试不是几天就能完成的, 需要有一
定的时间 。 在此期间由于系统还不稳定, 随时可能发
生硬件或软件故障, 加之数据库刚刚建立, 操作人员
对系统还不熟悉, 对其规律缺乏了解, 容易发生操作
错误, 这些故障和错误很可能破坏数据库中的数据,
这种破坏很可能在数据库中引起连锁反应, 破坏整个
数据库 。
? 因此必须做好数据库的转储和恢复工作, 要求设计人
员熟悉 DBMS的转储和恢复功能, 并根据调试方式和
特点首先加以实施, 尽量减少对数据库的破坏, 并简
化故障恢复 。
返回 636
6.6.5 整理文档
?在程序的编码调试和试运行中,应该将发现的
问题和解决方法记录下来,将它们整理存档作
为资料,供以后正式运行和改进时参考。
?全部的调试工作完成之后,应该编写应用系统
的技术说明书和使用说明书,在正式运行时随
系统一起交给用户。
?完整的文件资料是应用系统的重要组成部分,
但这一点常被忽视。必须强调这一工作的重要
性,引起用户与设计人员的充分注意。
返回 637
? 数据库试运行结果符合设计目标后, 数据库就投入正
式运行, 进入运行和维护阶段 。 数据库系统投入正式
运行, 标志着数据库应用开发工作的基本结束, 但并
不意味着设计过程己经结束 。
? 由于应用环境不断发生变化, 用户的需求和处理方法
不断发展, 数据库在运行过程中的存储结构也会不断
变化, 从而必须修改和扩充相应的应用程序 。
? 数据库运行和维护阶段的主要任务包括以下三项内容,
(1) 维护数据库的安全性与完整性;
(2) 监测并改善数据库性能;
(3) 重新组织和构造数据库 。
6.7 数据库运行和维护
返回 638
6.7.1 维护数据库的安全性与完整性
? 按照设计阶段提供的安全规范和故障恢复规范, DBA要
经常检查系统的安全是否受到侵犯, 根据用户的实际
需要授予用户不同的操作权限 。
? 数据库在运行过程中, 由于应用环境发生变化, 对安
全性的要求可能发生变化, DBA要根据实际情况及时调
整相应的授权和密码, 以保证数据库的安全性 。
? 同样数据库的完整性约束条件也可能会随应用环境的
改变而改变, 这时 DBA也要对其进行调整, 以满足用户
的要求 。
? 另外, 为了确保系统在发生故障时, 能够及时地进行
恢复, DBA要针对不同的应用要求定制不同的转储计划,
定期对数据库和日志文件进行备份, 以使数据库在发
生故障后恢复到某种一致性状态, 保证数据库的完整
性 。
返回 639
6.7.2 监测并改善数据库性能
?目前许多 DBMS产品都提供了监测系统性能参数
的工具, DBA可以利用系统提供的这些工具,
经常对数据库的存储空间状况及响应时间进行
分析评价;
?结合用户的反应情况确定改进措施;及时改正
运行中发现的错误;
?按用户的要求对数据库的现有功能进行适当的
扩充 。
?但要注意在增加新功能时应保证原有功能和性
能不受损害 。
返回 640
6.7.3 重新组织和构造数据库
? 数据库建立后, 除了数据本身是动态变化以外, 随着
应用环境的变化, 数据库本身也必须变化以适应应用
要求 。
? 数据库运行一段时间后, 由于记录的不断增加, 删除
和修改, 会改变数据库的物理存储结构, 使数据库的
物理特性受到破坏, 从而降低数据库存储空间的利用
率和数据的存取效率, 使数据库的性能下降 。 因此,
需要对数据库进行重新组织, 即重新安排数据的存储
位置, 回收垃圾, 减少指针链, 改进数据库的响应时
间和空间利用率, 提高系统性能 。 这与操作系统对
,磁盘碎片, 的处理的概念相类似 。
? 数据库的重组只是使数据库的物理存储结构发生变化,
而数据库的逻辑结构不变, 所以根据数据库的三级模
式, 可以知道数据库重组对系统功能没有影响, 只是
为了提高系统的性能 。
返回 641
? 数据库应用环境的变化可能导致数据库的逻辑结构发
生变化, 比如要增加新的实体, 增加某些实体的属性,
这样实体之间的联系发生了变化, 这样使原有的数据
库设计不能满足新的要求, 必须对原来的数据库重新
构造, 适当调整数据库的模式和内模式, 比如要增加
新的数据项, 增加或删除索引, 修改完整性约束条件
等 。
? DBMS一般都提供了重新组织和构造数据库的应用程序,
以帮助 DBA完成数据库的重组和重构工作 。
? 只要数据库系统在运行, 就需要不断地进行修改, 调
整和维护 。 一旦应用变化太大, 数据库重新组织也无
济于事, 这就表明数据库应用系统的生命周期结束,
应该建立新系统, 重新设计数据库 。 从头开始数据库
设计工作, 标志着一个新的数据库应用系统生命周期
的开始 。
返回 642
小 结
? 本章介绍了数据库设计的六个阶段, 包括:系统需求
分析, 概念结构设计, 逻辑结构设计, 物理设计, 数
据库实施, 数据库运行与维护 。 对于每一阶段, 都分
别详细讨论了其相应的任务, 方法和步骤 。
? 需求分析是整个设计过程的基础, 需求分析做得不好,
可能会导致整个数据库设计返工重做 。
? 将需求分析所得到的用户需求抽象为信息结构即概念
模型的过程就是概念结构设计, 概念结构设计是整个
数据库设计的关键所在, 这一过程包括设计局部 E-R
图, 综合成初步 E-R图, E-R图的优化 。
返回 643
小 结
? 将独立于 DBMS的概念模型转化为相应的数据模型, 这
是逻辑结构设计所要完成的任务 。 一般的逻辑设计分
为三步:初始关系模式设计, 关系模式规范化, 模式
的评价与改进 。
? 物理设计就是为给定的逻辑模型选取一个适合应用环
境的物理结构, 物理设计包括确定物理结构和评价物
理结构两步 。
? 根据逻辑设计和物理设计的结果, 在计算机上建立起
实际的数据库结构, 装入数据, 进行应用程序的设计,
并试运行整个数据库系统, 这是数据库实施阶段的任
务 。
? 数据库设计的最后阶段是数据库的运行与维护, 包括
维护数据库的安全性与完整性, 监测并改善数据库性
能, 必要时需要进行数据库的重新组织和构造 。
返回 644
第 7章 SQL Server 2000
数据库管理系统
返回 645
关于 SQL Server
?SQL Server 是一个 关系数据库 管理系统。
?它最初是由 Microsoft,Sybase和 Ashton-Tate三
家公司联合开发的,于 1988年推出了第一个 OS/2
版本。
?后来,Ashton-Tate公司退出了 SQL Server的开发。
?而在 Windows NT推出后,Microsoft与 Sybase在
SQL Server的开发上就分道扬镳了,
?Microsoft将 SQL Server 移植到 Windows NT系统上,
专注于开发推广 SQL Server的 Windows NT版本;
?Sybase 则较专注于 SQL Server在 UNIX操作系统上
的应用。
?我们介绍的是 Microsoft SQL Server 。
返回 646
? SQL Server 2000是 Microsoft公司推出的 SQL
Server数据库管理系统的最新版本。
?该版本继承了 SQL Server 7.0版本的优点,同
时又比它增加了许多更先进的功能,
?具有 使用方便, 可伸缩性好 与相关软件 集成程度高
等优点。
?可跨越从运行 Microsoft Windows 98的膝上型电脑
到运行 Microsoft Windows 2000的大型多处理器的
服务器等多种平台使用。
?SQL Server 2000包括 4个常见版本,
返回 647
( 1) 企业版 ( Enterprise Edition)
? 支持所有的 SQL Server 2000 特性,可作为大型 Web 站点、
企业 OLTP(联机事务处理)以及数据仓库系统等的产品数据
库服务器。
( 2) 标准版 ( Standard Edition)
? 用于小型的工作组或部门。
( 3) 个人版 ( Personal Edition)
? 用于单机系统或客户机。
( 4) 开发者版 ( Developer Edition)
? 用于程序员开发应用程序,这些程序需要 SQL Server 2000
作为数据存储设备。
?此外,SQL Server 2000 还有 Desktop Engine(桌
面引擎)和 Windows CE 版,用户可以根据实际情况选
择所要安装的 SQL Server 2000 版本。
返回 648
7.1 SQL Server 2000的新特性
7.1.1 数据库增强
1,支持扩展标示语言 XML( Extensible Markup Language)
SQL Server 2000 对 XML 的支持表现在以下几个方面,
? 可以通过 URL( Uniform Resource Locator)访问 SQL Server
? 支持 XML-Data 模式
? 可检索编写 XML 数据
? SQL Server 2000 OLE DB 增加了对 XML 文档的支持
2,新的数据类型
? SQL Server 2000 中增加了 3 种新的数据类型,BIGINT、
SQL_VARIANT和 TABLE。
3,数据行中的 Text类型数据
? SQL Server 2000 中可以将 TEXT 和 IMAGE 类型的数据直接存放
到表的数据行中,而不是存放到不同的数据页中,这就减少了用
于存储 TEXT 和 IMAGE 类型的空间并相应减少了磁盘处理这类数
据的 I/O 数量。
返回 649
4,用户自定义函数
? SQL Server 2000 扩展了 Transact-SQL语言的可编程性,用户
可以创建自己的 Transact-SQL函数。用户自定义函数可以返回一
个数量值或表。
5,索引增强
? 可以在 计算列 上创建索引,这是一个很大的改进。
6,全文检索增强
? 全文检索中增加了改变跟踪和图形过滤的功能,其中,图形过
滤功能允许对存储在 IMAGE类型列中的文档数据进行查询和创建
索引。
7,索引化视图
? 索引化视图允许在 视图上 创建索引,这就大大提高了需要频繁
进行连接查询的程序的性能。
8,分布式查询增强
? SQL Server 2000 引入了 OPENROWSET()的函数,它可以指定在
分布式查询中的一个特定的连接信息,分布式查询优化器的功能
有了进一步的提高,授予了 OLE DB 数据源更多的 SQL 操作权。
9,触发器类型
? 创建触发器时可以通过 FOR 子句来指定触发器类型为 INSTEAD
OF 型或 AFTER 型,不同类型的触发器执行的时机不同。
返回 650
10,级联参考完整性约束
? 级联参考完整性约束可以控制在删除或更新有外键约束的
数据时所采取的操作,这种控制是通过在 CREATE TABLE
或 ALTER TABLE 命令中的 REFERENCES 子句中加入 ON
DELETE 或 ON UPDATE 子句来实现的。
11,Collation 增进
? SQL Server 2000 用 Collation 来替代 Code pages 和
Sort Orders,它比以前的版本提供了更多对 Collation
的支持,并引入了一个基于 Windows Collations 的新的
Collation集合,可以指定数据库级或列级的 Collation。
返回 651
7.1.2 联合数据库服务器
SQL Server 2000 支持分布式的分区视图,可
以跨越多个服务器水平地分割表。
1,多个 SQL Server 实例
? SQL Server 2000 支持在同一计算机上同时运行多个关系
数据库实例,每个实例有其独立的系统和用户数据库集合,
应用程序采用与连接不同计算机上的 SQL Server 实例大
致相同的方式连接同一计算机上的各个实例。
2,Failover 群集增强
? 对 Failover 群集的管理有了较大的改善,可以方便地安
装、配置和管理一个 SQL Server 2000的 Failover 群集。
3,网络库( Net-Library)增强
? 简化了客户机配置并支持同一计算机上的多实例连接。
4,Kerberos 和安全授权
? SQL Server 2000 使用 Kerberos 来支持客户机和服务器
之间相互的身份验证,使用 Kerberos 和授权来支持复合
认证以及 SQL Server 注册。
返回 652
5,备份( Backup)和还原( Restore)增强
? SQL Server 2000 引入了一个更容易理解的模型来指定备
份和还原的选项,同时还支持使用事务日志标识来还原工
作到指定点或进行数据库的部分还原。
6,对公用操作的可伸缩性增强
? 增强的公用操作包括快速差异备份并行的数据库一致性校
验和并行扫描。
7,复制增强
? SQL Server 2000 改进并增强了合并复制、快照复制和事
务复制等功能,并在复制中增加了可变化的订阅功能,因
而实施、监视和管理复制变得更加容易。
8,数据转换服务增强
( 1)支持键和约束。
( 2) DTS 支持键和约束可以使用数据导入导出向导
从源表向目标表移动主键、外键和约束。
返回 653
( 3)新的定制任务
? SQL Server 2000 DTS Designer 和 DTS 对象模型提供了新的自
定义任务功能从而可以创建执行任务的包或设置基于实时环境属
性的变量,包括从或向 Internet 以及 FTP 站点导入数据、发送
数据、以异步方式运行包、创建互相发送消息的包、创建执行其
它包的包以及在同一事务中包含多个包执行。
( 4)将 DTS 包保存在 VB 文件中
? 将 DTS 包保存到 Microsoft? Visual Basic 文件中,可以允许
将通过 DTS 导入向导,DTS导出向导或 DTS Designer 创建的包与
Visual Basic 程序结合在一起或被需要引用 DTS 对象模型组件
的 Visual Basic 开发者用作原型。
9,SQL Server Analysis Services
? SQL Server 7.0 中的 OLAP( Online Analytical Processing)
服务转变为 SQL Server 2000 中的分析服务( Analysis
Services),分析服务还包括了新的数据挖掘功能。
10,SQL Server Meta Data Services
? SQL Server 7.0 中的贮藏室( Repository)部分在 SQL Server
2000 中转化为元数据服务( Meta Data Services)。
返回 654
7.2 SQL Server 2000的主要组件
? SQL Server 2000 提供了一整套的 管理工具 和 实用程序,
使用这些工具和程序,可以设置和管理 SQL Server 进行数
据库管理和备份,并保证数据的安全和一致。
? 下面,对这些组件做一个简单的介绍。
1,企业管理器 ( Enterprise Manager)
? 企业管理器是 SQL Server 中最重要的管理工具, 在使用 SQL
Server的过程中大部分的时间都是和它打交道 。
? 通过企业管理器可以管理所有的数据库系统工作和服务器工作,
也可以调用其它的管理开发工具 。
2,查询分析器 ( Query Analyzer)
? 查询分析器用于执行 Transaction-SQL 命令等 SQL 脚本程序, 以
查询分析或处理数据库中的数据, 这是一个非常实用的工具, 对
掌握 SQL 语言, 理解 SQL Server 的工作有很大帮助 。
? 使用查询分析器的熟练程度是衡量一个 SQL Server 用户水平的
标准 。
返回 655
3,服务管理器 ( Service Manager)
? 服务管理器用于启动, 暂停或停止 SQL Server 的 4种服
务:,
? DTC( Distributed Transaction Coordinator 分布式事务协调器 )
? MSSQL Server OLAP service
? SQL Server
? SQL Server Agent
4,客户端网络实用工具 ( Client Network Utility)
? 客户端网络实用工具用于配置客户端的连接, 测定网络库
的版本信息以及设定本地数据库的相关选项 。
5,服务器网络实用工具 ( Server Network Utility)
? 服务器网络实用工具用于配置服务器端的连接, 测定网络
库的版本信息 。
6,导入和导出数据 ( Import and Export Data)
? 导入和导出数据采用 DTS Import/Export 向导来完成,
此 向 导 包 含 了 所 有 的 DTS ( Data Transformation
Services 数据转换服务 ) 工具提供了在 OLE DB数据源之
间复制数据的最简捷的方法 。
返回 656
7,在 IIS中配置 SQL XML支持 ( Configure SQL XML
Support in IIS)
? IIS( Internet Information Services 因特网信息服
务 ), 此工具可以在运行 IIS的计算机上定义, 注册虚拟
目录, 并在虚拟目录和 SQL Server 实例之间创建关联 。
8,事件探查器 ( Profiler)
? 事件探查器的功能是监视 SQL Server 数据库系统引擎事
件, 主要用于监听 SQL Server 系统的运行性能 。
9,联机丛书 ( Books Online)
? SQL Server 2000 提供了大量的联机文档, 用户可以便捷
地查询到许多很有价值的信息 。
? 一个优秀的 SQL Server 管理员必然是使用联机文档的高
手 。
?另外, 在安装 SQL Server 2000 的同时, 安装了
SQL Server的升级向导
? 在, 开始, 菜 单 的, 程序, 项中, 将 鼠 标 移 到
,Microsoft SQL Server—版本切换, 上即可看到 SQL
Server 升级向导 。
? SQL Server 升级向导用于将一个 6.5 版本的 SQL Server
的设置和数据库复制升级到本机上安装的 SQL Server
2000 中 。
返回 657
7.3 Transact-SQL程序设计
?在 Transact-SQL 语言中标准的 SQL 语句畅通
无阻。
?Transact-SQL 也有类似于 SQL 语言的分类不
过做了许多扩充。
?在第 3章中,我们曾介绍了标准 SQL语言的语法
及其基本使用方法,在此只介绍 Transact-SQL
语言中的其它部分。
7.3.1 变量
7.3.2 流程控制命令
7.3.3 其它命令
7.3.4 常用函数
返回 658
7.3.1 变量
Transact-SQL 中可以使用两种变量,局部变量 和 全局变量 。
1,局部变量
?局部变量是用户可自定义的变量,它的作用范围仅在程序内
部。
?在程序中通常用来储存从表中查询到的数据,或当作程序执
行过程中暂存变量使用。
?局部变量必须以 @ 开头,而且必须先用 DECLARE 命令说明后
才可使用。其说明形式如下,
DECLARE @变量名 变量类型 [,@变量名变量类型 … ]
?在 Transact-SQL 中不能像在一般的程序语言中一样使用, 变
量 =变量值, 来给变量赋值,必须使用 SELECT 或 SET 命令来
设定变量的值。其语法如下,
SELECT @局部变量 = 变量值
SET @局部变量量 = 变量值
【 例 】 声明一个长度为 8 个字符的变量 id,并赋值。
declare @id char( 8)
select @id =?10010001?
返回 659
2,全局变量
?全局变量是 SQL Server 系统内部使用 的变量,其作用范围并
不局限于某一程序,而是任何程序均可随时调用。
?全局变量通常存储一些 SQL Server 的配置设定值和效能统计
数据。用户可在程序中用全局变量来测试系统的设定值或
Transact-SQL 命令执行后的状态值。
?全局变量不是由用户的程序定义的,它们是在服务器级定义
的,只能使用预先说明及定义的全局变量。
?引用全局变量时必须以, @@”开头。
?局部变量的名称不能与全局变量的名称相同,否则会在应用
中出错。
3,注释符
在 Transact-SQL 中可使用两类注释符,
1,ANSI 标准的注释符, --”用于 单行 注释。
2.与 C 语言相同的程序注释符号,即, /*…… */”,/* 用于
注释文字的开头,*/用于注释文字的结尾,可在程序中标识
多行 文字为注释。
返回 660
7.3.2 流程控制命令
Transact-SQL 语言使用的流程控制命令与常见的程序设
计语言类似,主要有以下几种控制命令。
7.3.2.1 BEGIN… END
其语法如下,
BEGIN
<命令行或程序块块 >
END
? BEGIN… END 用来设定一个 程序块,将在 BEGIN… END
内的所有程序视为一个单元执行。
? BEGIN… END 经常在 条件语句 (如 IF… ELSE)中使用。
? 在 BEGIN… END 中可 嵌套 另外的 BEGIN… END 来定义另
一程序块。
返回 661
7.3.2.2 IF … ELSE
其语法如下,
IF <条件表达式式 >
<命令行或程序块块 >
[ELSE [条件表达式式 ]
<命令行或程序块块 >]
其中,
?<条件表达式 >可以是各种表达式的组合,但表达式的值
必须是逻辑值, 真, 或, 假, 。
?ELSE 子句是可选的,最简单的 IF 语句没有 ELSE 子句部
分。
?IF… ELSE 用来判断当某一条件成立时执行某段程序,条
件不成立时执行另一段程序。
?如果不使用程序块,IF 或 ELSE 只能执行一条命令。
?IF ELSE 可以进行嵌套,在 Transact-SQL 中最多可嵌套
32 级。
返回 662
【 例 】 从 SC数据表中求出学号为 S1同学的平均成
绩,如果此平均成绩大于或等于 60分,则输出
,pass”信息。
if (select avg(score) from sc where sno='S1'
group by sno)>=60
begin
print 'pass'
end
返回 663
7.3.2.3 CASE
CASE 命令有两种语句格式,
格式 1,
CASE <运算式 >
WHEN <运算式 > THEN <运算式 >

WHEN <运算式 > THEN <运算式 >
[ELSE <运算式 >]
END
? 该语句的执行过程是,
?将 CASE后面表达式的值与各 WHEN子句中的表达式的值进行比
较,
?如果二者相等,则返回 THEN后的表达式的值,然后跳出 CASE
语句,否则返回 ELSE子句中的表达式的值。
?ELSE子句是可选项。当 CASE语句中不包含 ELSE子句时,如果
所有比较失败时,CASE语句将返回 NULL。
返回 664
【 例 】 从学生表 S中,选取 SNO,SEX,如果 SEX为
,男, 则输出, M”,如果为, 女, 输出, F”。
SELECT SNO,
SEX=
CASE sex
WHEN '男 ' THEN 'M'
WHEN '女 ' THEN 'F'
END
FROM S
返回 665
格式 2,
CASE
WHEN <条件表达式 > THEN <运算式 >

WHEN <条件表达式 > THEN <运算式 >
[ELSE <运算式 >]
END
?该语句的执行过程是,
?首先测试 WHEN后的表达式的值
?如果其值为真,则返回 THEN后面的表达式的值,否
则测试下一个 WHEN子句中的表达式的值
?如果所有 WHEN子句后的表达式的值都为假,则返回
ELSE后的表达式的值
?如果在 CASE语句中没有 ELSE子句,则 CASE表达式返
回 NULL。
返回 666
? 注,CASE 命令可以嵌套到 SQL 命令中。
【 例 】 从 SC表中查询所有同学选课成绩情况,凡成绩为
空者输出, 未考,,小于 60分输出, 不及格,, 60分
至 70分输出, 及格,, 70分至 90分输出, 良好,,大
于或等于 90分时输出, 优秀, 。
SELECT SNO,CNO,
SCORE=
CASE
WHEN SCORE IS NULL THEN '未考 '
WHEN SCORE<60 THEN '不及格 '
WHEN SCORE>=60 AND SCORE<70 THEN '及格 '
WHEN SCORE>=70 AND SCORE<90 THEN '良好 '
WHEN SCORE>=90 THEN '优秀 '
END
FROM SC
返回 667
7.3.2.4 WHILE… CONTINUE… BREAK
其语法如下,
WHILE <条件表达式 >
BEGIN
<命令行或程序块 >
[BREAK]
[CONTINUE]
[命令行或程序块 ]
END
? WHILE 命令在设定的条件成立时,会重复执行命令行
或程序块。
? CONTINUE 命令可以让程序跳过 CONTINUE 命令之后的
语句,回到 WHILE 循环的第一行,继续进行下一次循
环。
? BREAK 命令则让程序完全跳出循环,结束 WHILE 命令
的执行。
? WHILE 语句也可以嵌套。
返回 668
如,以下程序计算 1- 100之间所有能被 3整除的数的个数
及总和。
DECLARE @S SMALLINT,@I SMALLINT,@NUMS SMALLINT
SET @S=0
SET @I=1
SET @NUMS=0
WHILE (@I<=100)
BEGIN
IF (@I%3=0)
BEGIN
SET @S=@S+@I
SET @NUMS=@NUMS+1
END
SET @I=@I+1
END
PRINT @S
PRINT @NUMS
返回 669
7.3.2.5 WAITFOR
其语法如下,
WAITFOR {DELAY <?时间 ’ > | TIME <?时间 ’ >
| ERROREXIT | PROCESSEXIT | MIRROREXIT}
? WAITFOR 命令用来暂时停止程序执行,直到所设定的
等待时间已过或所设定的时间已到才继续往下执行。
? 其中 ‘ 时间 ’ 必须为 DATETIME 类型的数据,但不能包
括日期。
? 各关键字含义如下,
1,DELAY,用来设定等待的时间,最多可达 24 小时
2,TIME,用来设定等待结束的时间点
3,ERROREXIT,直到处理非正常中断
4,PROCESSEXIT,直到处理正常或非正常中断
5,MIRROREXI,直到镜像设备失败
返回 670
【 例 】 等待 1 小时 2 分零 3 秒后才执行 SELECT
语句。
waitfor delay ?01:02:03?
select * from employee
返回 671
7.3.2.6 GOTO
语法如下,
GOTO 标识符
?GOTO 命令用来改变程序执行的流程,使程序
跳到标有标识符的指定的程序行再继续往下执
行。
?作为跳转目标的标识符可为数字与字符的组合。
但必须以,,, 结尾。
?在 GOTO 命令行,标识符后不必跟,,,
返回 672
如,求 1+ 2+ 3+ … + 10的总和。
DECLARE @S SMALLINT,@I SMALLINT
SET @I=1
SET @S=0
BEG,
IF (@I<=10)
BEGIN
SET @S=@S+@I
SET @I=@I+1
GOTO BEG
END
PRINT @S
返回 673
7.3.2.7 RETURN
语法如下,
RETURN ( [整数值 ])
? RETURN 命令用于结束当前
程序的执行,返回到上一个
调用它的程序或其它程序。
? 在括号内可指定一个返回值。
? 如果没有指定返回值,SQL
Server 系统会根据程序执
行的结果返回一个内定值,
如,
0 程序执行成功
-1 找不到对象
-2 数据类型错误
-3 死锁
-4 违反权限原则
-5 语法错误
-6 用户造成的一般错误
-7 资源错误如磁盘空间不足
-8 非致命的内部错误
-9 已达到系统的极限
-10 -11 致命的内部不一致性错误
-12 表或指针破坏
-13 数据库破坏
-14 硬件错误
?如果运行过程产生了多个错误,SQL Server 系统将返
回绝对值最大的数值;
?如果此时用户定义了返回值,则以返回用户定义的值。
RETURN 语句 不能返回 NULL值。
返回 674
7.3.3 其它命令
1,BACKUP
?BACKUP 命令用于将数据库内容或其事务处理日志
备份 到存储介质上(软盘、硬盘、磁带等)。
2,CHECKPOINT
?CHECKPOINT 命令用于将当前工作的数据库中被更
改过的数据页或日志页从数据缓冲器中 强制写入硬
盘 。
3,DBCC
?DBCC( Database Base Consistency Checker 数据
库一致性检查程序)命令用于验证数据库完整性、
查找错误、分析系统使用情况等。
?DBCC 命令后必须加上子命令,系统才知道要做什
么。
? 如,DBCC CHECKALLOC 命令检查目前数据库内所有数据页
的分配和使用情况。
返回 675
4,DECLARE
?DECLARE 命令用于声明一个或多个局部变量、游标变量或表
变量。
?在用 DECLARE命令声明之后,所有的变量都被赋予初值 NULL。
?需要用 SELECT 或 SET 命令来给变量赋值。
?变量类型可为系统定义的或用户定义的类型,但不能为 TEXT、
NTEXT和 IMAGE类型。 CURSOR 指名变量是局部的游标变量。
?如果变量为字符型,那么在 data_type 表达式中应指明其最
大长度,否则系统认为其长度为 1。如,
declare @x char,@y char( 10)
select @x =?123',@y =?data_type'
print @x
print @y
则运行结果为,
1
data_type
返回 676
5,EXECUTE
?EXECUTE 命令用来执行存储过程。
6,KILL
?KILL 命令用于终止某一过程的执行。
7,PRINT
?PRINT 命令向客户端返回一个用户自定义的信息,
即显示一个字符串、局部变量或全局变量。
?如果变量值不是字符串的话,必须先用数据类型转
换函数 CONVERT() 将其转换为字符串。
8,RAISERROR
?RAISERROR 命令用于在 SQL Server 系统返回错误
信息时,同时返回用户指定的信息。
返回 677
9,READTEXT
READTEXT 命令语法如下,
READTEXT {table.column text_pointer offset size}
[HOLDLOCK]
? READTEXT 命令用于从数据类型为 TEXT,NTEXT 或 IMAGE 的列
中读取数据。
? 命令从偏移位置 offset+1 个字符起读取 size 个字符,如果
size 为 0,则会读取 4KB 的数据。其中,
? text_pointer 是指向存储文本的第一个数据库页的指针,它可以
用 TEXTPTR()函数来获取。
? HOLDLOCK 选项用于锁定所读取的数据直到传输结束,这段时间内
其它用户只能读取数据不能更改数据。
? 如果数据列为汉字,则 offset 值应取 0 或其它偶数,如果用
奇数则会出现乱码。
10,RESTORE
? RESTORE 命令用来将数据库或其事务处理日志备份文件由存
储介质回存到 SQL Server系统中。
返回 678
11,SELECT
SELECT 命令可用于给变量赋值其语法如下,
SELECT {@local_variable = expression } [,...n]
?SELECT 命令可以一次给多个变量赋值。
?当表达式 expression 为列名时,SELECT 命令可利
用其查询功能一次返回多个值,变量中保存的是其
返回的最后一个值。
?如果 SELECT命令没有返回值,则变量值仍为其原来
的值。
?当表达式 expression 是一个子查询时,如果子查
询没有返回值,则变量被设为 NULL。
返回 679
12,SET
SET 命令有两种用法,
( 1)用于给局部变量赋值
?在用 DECLARE 命令声明之后,所有的变量都被赋予
初值 NULL。
?需要用 SET 命令来给变量赋值,但与 SELECT 命令
不同的是 SET 命令一次只能给一个变量赋值。
?不过由于 SET 命令功能更强且更严密,因此,SQL
Server 推荐使用 SET 命令来给变量赋值。
返回 680
( 2)用于设定用户执行 SQL 命令时,SQL
Server 的处理选项设定。
?有以下几种设定方式,
?SET:选项 ON
?SET:选项 OFF
?SET:选项值
返回 681
13,SHUTDOWN
语法如下,
SHUTDOWN [WITH NOWAIT]
?SHUTDOWN 命令用于停止 SQL Server 的执行。
?当使用 NOWAIT 参数时,SHUTDOWN命令立即停止 SQL
Server,在终止所有的用户过程并对每一现行的事
务发生一个回滚后,退出 SQL Server。
?当没有用 NOWAIT 参数时 SHUTDOWN 命令将按以下步
骤执行,
( 1)终止任何用户登录 SQL Server
( 2)等待尚未完成的 Transact-SQL命令或存储过程执行
完毕
( 3)在每个数据库中执行 CHECKPOINT 命令
( 4)停止 SQL Server 的执行
返回 682
14,WRITETEXT
语法如下,
WRITETEXT {table.column text_pointer} [WITH
LOG] {data}
?WRITETEXT 命令用于向数据类型为 TEXT,NTEXT 或
IMAGE 的列中写入数据。其中,
? text_pointer 是指向存储文本的第一个数据库页的指针,
它可以用 TEXTPTR() 函数来获取。
? WITH LOG选项用于记录所写入的数据。 data 可为文字或
变量,其最大长度为 120KB。
注,WRITETEXT 命令不能作用于 视图 。
?推荐使用 UPDATETEXT 命令来修改 TEXT,NTEXT 和
IMAGE 类型的数据,
? 因为 WRITETEXT 命令将数据列的数据完全替换,而
UPDATETEXT 命令可以只更改数据列的一部分。
返回 683
15,USE
语法如下,
USE {databasename}
?USE 命令用于改变当前使用的数据库为指定的数据
库。
?用户必须是目标数据库的用户成员或目标数据库建
有 GUEST 用户账号时,使用 USE 命令才能成功切
换到目标数据库。
返回 684
7.3.4 常用函数
7.3.4.1 统计函数
在 SQL Server 2000中, 除第 3章中所讲述的统计函数外, 还提供以下函数 。
1,STDEV()
? STDEV 函数返回表达式中所有数据的 标准差 。
? 表达式通常为表的某一数据类型为 NUMERIC 的列,或近似 NUMERIC
类型的列,如 MONEY 类型,但 BIT 类型除外。
? 表达式中的 NULL 值将被忽略。
? 其返回值为 FLOAT类型。
2,STDEVP()
? STDEVP 函数返回 总体标准差 。
3,VAR()
? VAR()函数返回表达式中所有值的 统计变异数 。
4,VARP()
? VARP()函数返回 总体变异数 。
? 2,3,4表达式及返回值类型同 STDEV()函数。
返回 685
7.3.4.2 算术函数
?算术函数可对数据类型为 整型, 浮点型, 实型, 货
币型 和 SMALLMONEY 的列进行操作。
?它的返回值是 6 位小数,如果使用出错,则返回
NULL值,并显示警告信息。
?可以在 SELECT 语句的 SELECT 和 WHERE 子句以及表
达式中使用算术函数。
?Transact-SQL 中的算术函数如表 7.1所示。
返回 686
函数 功能
三角函数
SIN 返回以弧度表示的角的正弦
COS 返回以弧度表示的角的余弦
TAN 返回以弧度表示的角的正切
COT 返回以弧度表示的角的余切
反三角函数
ASIN 返回正弦是 FLOAT 值的以弧度表示的角
ACOS 返回余弦是 FLOAT 值的以弧度表示的角
ATAN 返回正切是 FLOAT 值的以弧度表示的角
角度弧度转换
DEGREES 把弧度转换为角度返
RADIANS 把角度转换为弧度
幂函数
EXP 返回表达式的指数值
LOG 返回表达式的自然对数值
LOG10 返回表达式的以 10 为底的对数值
SQRT 返回表达式的平方根
取近似值函数
CEILING 返回 >=表达式的最小整数
FLOOR 返回 <=表达式的最小整数
ROUND 取整数,小数的第一位上四舍五入
符号函数
ABS 返回表达式的绝对值
SIGN 测试参数的正负号,返回 0,1或 -1,
其它函数
PI 返回值为 ∏,即 3.1415926535897936
RAND 求 0-1间的随机浮点数

7.
1 T
ra
ns
act
-SQL





返回 687
7.3.4.3 字符串函数
? 字符串函数对 二进制数据, 字符串 和 表达式 执行不同
的运算。
? 此类函数作用于 CHAR,VARCHAR,BINARY 和 VARBINARY
数据类型以及可以隐式转换为 CHAR 或 VARCHAR的数据
类型。
? 可以在 SELECT 语句的 SELECT 和 WHERE 子句以及表达
式中使用字符串函数。
? 常用的字符串函数有,
1.字符转换函数
( 1) ASCII()
? ASCII()函数返回字符表达式最左端字符的 ASCII 码值。
?在 ASCII 函数中,纯数字的字符串可不用, ‘’, 括起来,
但含其它字符的字符串必须用, ‘’, 括起来使用,否则会
出错。
返回 688
( 2) CHAR()
? CHAR()函数用于将 ASCII 码转换为字符。
? 如果没有输入 0 ~ 255 之间的 ASCII 码值,CHAR()函数会返回一个
NULL 值。
( 3) LOWER()
? LOWER()函数把字符串全部转换为 小写 。
( 4) UPPER()
? UPPER()函数把字符串全部转换为 大写 。
( 5) STR()
? STR()函数把 数值型 数据转换为 字符型 数据。
其语法如下,
STR( <float _expression>[ length[ <decimal>]])
? 自变量 length 和 decimal 必须是非负值。
? length 指定返回的字符串的长度。
? decimal 指定返回的小数位数。
? 如果没有指定长度,缺省的 length 值为 10, decimal 缺省值为 0 。
? 小数位数大于 decimal 值时,STR()函数将其下一位四舍五入。
? 指定长度应大于或等于数字的符号位数 +小数点前的位数 +小数点位数 +小
数点后的位数。
? 如果 <float _expression>小数点前的位数超过了指定的长度,则返回指
定长度的 ‘ *’ 。
返回 689
2.去空格函数
( 1) LTRIM()
? LTRIM()函数把字符串 头部 的空格去掉。
( 2) RTRIM()
? RTRIM()函数把字符串 尾部 的空格去掉。
?在许多情况下,往往需要得到头部和尾部都没有空
格字符的字符串,这时可将上两个函数嵌套使用。
返回 690
3.取子串函数
( 1) LEFT()
? LEFT()函数返回部分字符串。其语法如下,
LEFT( <character_expression>,<integer_expression>)
? LEFT()函数返回的子串是从字符串最左边起到第 integer_expression
个字符的部分。
? 若 integer_expression 为负值,则返回 NULL 值。
( 2) RIGHT()
? RIGHT()函数返回部分字符串。其语法如下,
RIGHT( <character_expression>,<integer_expression>)
? RIGHT()函数返回的子串是从字符串右边第 integer_expression 个字
符起到最后一个字符的部分。
? 若 integer_expression 为负值,则返回 NULL 值。
( 3) SUBSTRING
? SUBSTRING()函数返回部分字符串。其语法如下,
SUBSTRING (<expression>,<starting_ position>,length)
? SUBSTRING()函数返回的子串是从字符串左边第 starting_ position
个字符起 length个字符的部分。
? 其中表达式可以是字符串或二进制串或含字段名的表达式。
? SUBSTRING()函数不能用于 TEXT 和 IMAGE 数据类型。
返回 691
4.字符串比较函数
( 1) CHARINDEX()
? CHARINDEX()函数返回字符串中某个指定的子串出现的开始位
置。其语法如下,
CHARINDEX ( <?substring_expression?>,<expression>)
? 其中,substring _expression 是所要查找的字符表达式,
? expression 可为字符串也可为列名表达式。
? 如果没有发现子串,则返回 0 值。
? 此函数不能用于 TEXT 和 IMAGE 数据类型。
( 2) PATINDEX()
? PATINDEX()函数返回字符串中某个指定的子串出现的开始位
置。其语法如下,
PATINDEX ( <?%substring _expression%?>,<column_ name>)
? 其中子串表达式前后必须有百分号, %”,否则返回值为 0。
? 与 CHARINDEX()函数不同的是,PATINDEX()函数的子串中可
以使用通配符,且此函数可用于 CHAR,VARCHAR和 TEXT 数据类型。
返回 692
( 3) SOUNDEX()
? SOUNDEX()函数返回一个四位字符码。其语法如下,
SOUNDEX ( <character _expression>)
? SOUNDEX()函数将 character _expression 转换为 4 个
字符的声音码。
? 其中第一个码为原字符串的第一个字符,第二到第四个字
符则为数字,是该字符串的声音字母所对应的数字,但是
忽略了除首字母外的串中的所有元音字母。
? SOUNDEX()函数可用来查找声音相似的字符串。
? 但 SOUNDEX()函数对数字和汉字均只返回 0 值。
返回 693
( 4) DIFFERENCE()
? DIFFERENCE()函数返回由 SOUNDEX 函数返回的两个字符表达
式的值的差异。其语法如下,
DIFFERENCE ( <character_expression1>,
<character_expression2>)
? 值的差异是用 0,1,2,3,4 来表示的,含义如下,
0—— 两个 SOUNDEX()函数返回值的第一个字符不同
1—— 两个 SOUNDEX()函数返回值的第一个字符相同
2—— 两个 SOUNDEX()函数返回值的第一、二个字符相

3—— 两个 SOUNDEX()函数返回值的第一、二、三个字
符相同
4—— 两个 SOUNDEX()函数返回值完全相同
返回 694
5.字符串操作函数
( 1) QUOTENAME()
? QUOTENAME()函数返回被特定字符括起来的字符串。其语法如
下,
QUOTENAME ( <?character_expression?>[,quote_ character])
? 其中,quote_ character 标明括字符串所用的字符,如,‘”,
,(,,, [”等,缺省值为, [ ]”。
( 2) REPLICATE()
? REPLICATE()函数返回一个重复 character_expression 指定
次数的字符串。其语法如下,
REPLICATE ( character_expression,integer_expression)
? 如果 integer_expression 值为负值,则 REPLICATE 函数返回
NULL 串。
( 3) REVERSE()
? REVERSE()函数将指定的字符串的字符排列顺序颠倒。其语法
如下,
REVERSE ( <character_expression>)
? 其中,character_expression 可以是字符串常数或一个列的值。
返回 695
( 4) REPLACE()
? REPLACE()函数返回被替换了指定子串的字符串。其语
法如下,
REPLACE ( <string_expression1>,
<string_expression2>,<string_expression3>)
? REPLACE()函数用 string_expression3 替换在
string_expression1 中的子串 string_expression2。
( 5) SPACE()
? SPACE()函数返回一个有指定长度的空白字符串。其语
法如下,
SPACE ( <integer_expression>)
? 如果 integer_expression 值为负值,则 SPACE 函数返回
NULL 串。
返回 696
( 6) STUFF()
? STUFF()函数用另一子串替换字符串指定位置长度的子
串。其语法如下,
STUFF( <character_expression1>,<start_
position>,<length>,
<character_expression2>)
? 如果起始位置为负或长度值为负,或者起始位置大于
character_expression1 的长度,则 STUFF()函数返回
NULL 值。
? 如果 length 长度大于 character_expression1 的长度,
则 character_expression1 只保留首字符。
返回 697
7.3.4.4 数据类型转换函数
? 在一般情况下,SQL Server 会自动完成数据类型的转
换。
? 例如,可以直接将字符数据类型或表达式与 DATATIME
数据类型或表达式比较;当表达式中用了 INTEGER、
SMALLINT或 TINYINT 时,SQL Server 也可将 INTEGER
数据类型或表达式转换为 SMALLINT数据类型或表达式,
这称为 隐式转换 。
? 如果不能确定 SQL Server 是否能完成隐式转换或者使
用了不能隐式转换的其它数据类型,就需要使用数据
类型转换函数做显式转换了。
? 此类函数有两个,
1,CAST()
? CAST()函数语法如下,
CAST ( <expression> AS <data_ type>[ length ])
返回 698
2,CONVERT()
? CONVERT 函数语法如下,
CONVERT ( <data_ type>[ length ],<expression> [,style])
? data_ type 为 SQL Server 系统定义的数据类型,用户自定义的数据类
型不能在此使用。
? length 用于指定数据的长度缺省值为 30。
? 把 CHAR 或 VARCHAR 类型转换为诸如 INT 或 SAMLLINT 这样的 INTEGER 类
型,结果必须是带正号( +)或负号( -)的数值。
? TEXT 类型到 CHAR 或 VARCHAR 类型的转换最多为 8000 个字符,即 CHAR
或 VARCHAR数据类型是最大长度。
? IMAGE 类型存储的数据转换到 BINARY 或 VARBINARY 类型,最多为 8000
个字符。
? 把整数值转换为 MONEY 或 SMALLMONEY 类型,按定义的国家的货币单位来
处理,如人民币、美元、英镑等。
? BIT 类型的转换把非零值转换为 1,并仍以 BIT 类型存储。
? 试图转换到不同长度的数据类型,会截短转换值并在转换值后显示, +”,
以标识发生了这种截断。
? 用 CONVERT()函数的 style 选项能以不同的格式显示日期和时间。
? style 是将 DATATIME 和 SMALLDATETIME 数据转换为字符串时所选用的由
SQL Server 系统提供的转换样式编号,不同的样式编号有不同的输出格
式,如表 7.2所示。
返回 699
表 7.2 DATATIME 和 SMALLDATETIME 类型数据的转换格式
style1 style2 标准 输出格式
0 或 100 缺省 mon dd yyyy hh:mi Am/Pm
1 101 USA mm/dd/yy
2 102 ANSI yy.mm.dd
3 103 UK/French dd/mm/yy
4 104 German dd.mm.yy
5 105 Italian dd-mm-yy
6 106 dd mon yy
7 107 mon dd yy
8 108 hh:mi:ss
9 109 mon dd yyyy hh:mi:sss Am/Pm
10 110 USA mm=dd-yy
11 111 Japan yy/mm/dd
12 112 ISO yymmdd
13 113 Europe dd mon yyyy hh:mi:ss:mmm( 24h)
14 114 hh:mi:ss:mmm( 24h)
20 120 ODBC1 yyyy-mm-dd hh:mi:ss( 24h)
21 121 ODBC2 yyyy-mm-dd hh:mi:ss:mmm( 24h)
返回 700
7.3.4.5 日期函数
? 日期函数用来操作 DATETIME 和 SMALLDATETIME 类型的
数据,执行算术运算。
? 与其它函数一样,可以在 SELECT 语句的 SELECT 和
WHERE 子句以及表达式中使用日期函数。
1,DAY( <date_expression>)
?DAY()函数返回 date_expression 中的日期值。
2,MONTH( <date_expression>)
?MONTH()函数返回 date_expression 中的月份值。
?与 DAY()函数不同的是,MONTH()函数的参数为整数时,
一律返回整数值 1,即 SQL Server 认为其是 1900 年 1 月。
3,YEAR( <date_expression>)
?YEAR()函数返回 date_expression 中的年份值。
? 在使用日期函数时,其日期值应在 1753 年到 9999 年
之间,这是 SQL Server 系统所能识别的日期范围,否
则会出现错误。
返回 701
4,DATEADD()
DATEADD()函数语法如下,
DATEADD( <datepart> <number> <date>)
?DATEADD()函数返回指定日期 date 加上指定的额
外日期间隔 number 产生的新日期。
?参数, datepart”在日期函数中经常被使用,它用来
指定构成日期类型数据的各组件,如年、季、月、
日、星期等。其取值如表 7.3所示。
返回 702
表 7.3 日期函数中 datepart 参数的取值
datepart 缩写 取值
year yy,yyyy 1753 ~ 9999
quarter qq,q 1 ~ 4
month mm,m 1 ~ 12
day of year dy,y 1 ~ 366
day dd,d 1 ~ 31
week wk,ww 1 ~ 54
weekday dw 1 ~ 7
hour hh 0 ~ 23
minute mi,n 0 ~ 59
second ss,s 0 ~ 59
millisecond ms 0 ~ 999
返回 703
5,DATEDIFF()
DATEDIFF()函数语法如下,
DATEDIFF( <datepart>,<date1>,<date2>)
?DATEDIFF()函数返回两个指定日期在 datepart
方面的不同之处,即 date2 超过 date1的差距值,
其结果值是一个带有正负号的整数值针。
?对不同的 datepart,DATEDIFF()函数所允许的最
大差距值不一样,如,
? datepart 为 second 时 DATEDIFF 函数所允许的最大差距
值为 68 年;
? datepart 为 millisecond 时,DATEDIFF() 函数所允许
的最大差距值为 24 天 20 小时 30 分 23 秒 647 毫秒。
返回 704
6,DATENAME()
DATENAME()函数语法如下,
DATENAME( <datepart>,<date>)
?DATENAME()函数以字符串的形式返回日期的指定
部分此部分,由 datepart 来指定。
7,DATEPART()
DATEPART()函数语法如下,
DATEPART( <datepart>,<date>)
?DATEPART()函数以整数值的形式返回日期的指定
部分,此部分由 datepart 来指定。
?DATEPART( dd,date)等同于 DAY( date)
?DATEPART( mm,date)等同于 MONTH( date)
?DATEPART( yy,date)等同于 YEAR( date)
返回 705
8,GETDATE()
GETDATE()函数语法如下,
GETDATE()
?GETDATE()函数以 DATETIME 的缺省格式返回系统
当前的日期和时间,它常作为其它函数或命令的参
数使用。
返回 706
7.3.4.6 TEXT 和 IMAGE 函数
1,TEXTPTR()
TEXTPTR()函数语法如下,
TEXTPTR( <column>)
?TEXTPTR()函数返回一个指向存储文本的第一个数据库页的
指针。
?其返回值是一个 VARBINARY( 16)类型的二进制字符串。
?如果数据类型为 TEXT,NTEXT或 IMAGE的列没有赋予初值,则
TEXTPTR()函数返回一个 NULL 指针。
2,TEXTVALID()
TEXTVALID()函数语法如下,
TEXTVALID( <'table.column'>,<text_ pointer>)
?TEXTVALID()函数用于检查指定的文本指针是否有效。
?如果有效,则返回 1;无效则返回 0。
?如果列未赋予初值,则返回 NULL 值。
返回 707
7.3.4.7 用户自定义函数
?从 SQL Server 2000 开始,用户可以自定义函数了在
SQL Server 2000 中用户自定义函数是作为一个 数据
库对象 来管理的。
?可以使用企业管理器或 Transact-SQL 命令来创建、
修改、删除。
返回 708
7.4 企业管理器 ( Enterprise Manager )
?企业管理器的界面是一个标准的 Windows界面,
由标题栏、菜单栏、工具栏、树窗口和任务对
象窗口板(又称任务板)组成。
?企业管理器的菜单栏分为两层,
?上一层是主菜单栏,下一层是控制台菜单栏。
?主菜单栏 在程序运行的过程中是基本保持不变的。
?控制台菜单栏 中的菜单则是动态的,随着所进行操
作的不同而显示不同的菜单内容。
?企业管理器的 工具栏 也是动态的,会随着所进
行操作的不同而增加或减少图标。
返回 709
? 在 Enterprise Manager 中提供了工具可以帮助用户产
生对象的 SQL 语言脚本。
? 生成对象的 SQL 脚本 方法如下,
1.在 Enterprise Manager 中选择要生成 SQL 脚本的对象,单击
右键,从快捷菜单中的, 所有任务, 子菜单中选择, 生成 SQL
脚本, 菜单项。
2.在, 生成 SQL脚本, 对话框中设置选项后,单击, 预览, 按钮
将会弹出, 生成 SQL脚本预览, 对话框,可以点击, 复制, 按
钮即可将脚本语句复制到剪贴板中;也可选择, 确定, 按钮
并指定脚本文件名和存放位置。
? 由 Enterprise Manager 产生的 SQL 脚本是一个后缀名
为,sql 的文件,它实际上是一个文本文件( Text
File),可以在 Enterprise Manager 或其它文件编辑
器中浏览或修改。
? 必要时可以生成所有数据库对象的 SQL 脚本,将其作
为对数据库的备份,当数据库损坏时可以在 Query
Analyzer 中运行此 SQL 脚本来重建数据库。
返回 710
7.5 查询分析器( Query Analyzer)
?查询分析器分为两个窗口,
?左侧窗口为, 对象浏览器, 窗口,其中,
?, 对象, 选项卡中显示了连接到 SQL Server服务器所包含
的数据库以及数据库对象。
?, 模板, 选项卡中则显示了查询分析器所包含的各种
Transact-SQL语句模板,可以使用这些模板方便地创建自
己的 SQL语句。
?右侧窗口为 SQL语句的 输入窗口
? 输入 SQL语句或者打开一个 SQL脚本文件后,可以单击工具
栏上的, 执行查询, 按钮 来执行 SQL语句。
? 执行完成后,将在右侧窗口的下部显示执行结果或 SQL语
句出错信息。
返回 711
7.6 管理数据库
7.6.1 系统数据库
? SQL Server 2000 有四个系统数据库,Master,Model、
Msdb,Tempdb。
? 这些系统数据库的文件存储在 Microsoft SQL Server
默认安装目录的 MSSQL子目录的 Data 文件夹中。
1,Master 数据库
? Master 数据库记录了一个 SQL Server 系统的所有 系
统信息,这些系统信息主要有,
( 1)所有的登录信息
( 2)系统设置信息
( 3) SQL Server 初始化信息
( 4)系统中其它系统数据库和用户数据库的相关信息,包括其
主文件的存放位置等
返回 712
2,Model 数据库
? Model 数据库是所有用户数据库和 Tempdb 数据库的 创
建模板 。
? 当创建数据库时,系统会将 Model 数据库中的内容复
制到新建的数据库中去。
? 由此可见,利用 Model 数据库的模板特性,通过更改
Model 数据库的设置,并将时常使用的数据库对象复
制到 Model数据库中可以大大简化数据库及其对象的创
建设置工作,为用户节省大量的时间。
? 通常可以将以下内容添加到 Model 数据库中,
( 1)数据库的最小容量
( 2)数据库选项设置
( 3)经常使用的数据库对象,如用户自定义的数据类型、函数
规则、缺省值等
返回 713
3,Msdb 数据库
? SQL Server SQL Server Enterprise Manager 和 SQL
Server Agent 使用 Msdb 数据库来存储计划信息以及
与备份和还原相关的信息,尤其是 SQL Server Agent
需要使用它来执行安排工作和警报记录操作者等操作。
4,Tempdb 数据库
? Tempdb 数据库用作系统的 临时存储空间 。
? 其主要作用有,
( 1)存储用户建立的临时表和临时存储过程
( 2)存储用户说明的全局变量值
( 3)为数据排序创建临时表
( 4)存储用户利用游标说明所筛选出来的数据
? 在 Tempdb 数据库中所做的存储不会被记录,因而在
Tempdb 数据库中的表上进行数据操作比在其它数据库
中要快得多。
返回 714
7.6.2 实例数据库
? SQL Server 2000 有两个实例数据库,pubs 和 Northwind。
? 与系统数据库一样,实例数据库的文件也存储在 Microsoft
SQL Server 默认安装目录的 MSSQL 子目录的 Data 文件夹
中。
? pubs 和 Northwind 数据库可以作为 SQL Server 的学习工
具,SQL Server Books Online中的实例基本上都是基于这
两个数据库来讲解的,其中,
? pubs 实例数据库存储了一个虚构的图书出版公司的基本情况。
? Northwind 实例数据库包含了一个公司的销售数据,此公司名为
Northwind 商人( Northwind Traders),是一个虚构的公司,从事
食品的进出口业务。
? 如果改变了实例数据库的内容或不小心删除了实例数据库
想将其回复到初始状态可以用查询分析器运行安装目录
\MSSQL\Install 中的 Instpubs.sql 或 Instnwnd.sql程序
来重建 pubs 或 Northwind 数据库。
返回 715
7.6.3 创建数据库
7.6.3.1 文件与文件组
?在 SQL Server 中数据库是由 数据库文件 和 事
务日志文件 组成的。
?一个数据库至少应包含一个数据库文件和一个
事物日志文件。
返回 716
1,数据库文件( Database File)
? 数据库文件是存放数据库数据和数据库对象的文件。
? 一个数据库可以有一个或多个数据库文件,一个数据
库文件只属于一个数据库。
? 当有多个数据库文件时有一个文件被定义为主数据库
文件( Primary Database File),扩展名为 mdf,它
用来存储数据库的启动信息和部分或全部数据。
? 一个数据库只能有一个主数据库文件。
? 其它数据库文件被称为次数据库文件( Secondary
Database File),扩展名为 ndf,用来存储主文件没
存储的其它数据。
? 采用多个数据库文件来存储数据的优点体现在,
( 1)数据库文件可以不断扩充而不受操作系统文件大小的限制。
( 2)可以将数据库文件存储在不同的硬盘中,这样可以同时对
几个硬盘做数据存取,提高了数据处理的效率,这对于服务
器型的计算机尤为有用。
返回 717
2,事务日志文件( Transaction Log File)
?事务日志文件是用来记录数据库更新情况的文
件,扩展名为 ldf。
?例如,使用 INSERT,UPDATE,DELETE 等对数
据库进行更改的操作都会记录在此文件中,而
如 SELECT 等对数据库内容不会有影响的操作
则不会记录在案。
?一个数据库可以有一个或多个事务日志文件。
返回 718
?SQL Server 中采用, Write-Ahead(提前写),
方式的事务,即对数据库的修改先写入事务日
志中,再写入数据库。
?其具体操作是,
?系统先将更改操作写入事务日志中。
?再更改存储在计算机缓存中的数据,为了提高执行
效率,此更改不会立即写到硬盘中的数据库,而是
由系统以固定 4 的时间间隔执行 CHECKPOINT 命令,
将更改过的数据批量写入硬盘。
?SQL Server 有个特点,它在执行数据更改时会设
置一个 开始点 和一个 结束点,如果尚未到达结束点
就因某种原因使操作中断,则在 SQL Server 重新
启动时会自动还原已修改的数据使其返回未被修改
的状态。
?由此可见,当数据库破坏时可以用事务日志还原数
据库内容。
返回 719
3,文件组( File Group)
? 文件组 是将多个数据库文件集合起来形成的一个整体,
每个文件组有一个组名。
? 与数据库文件一样,文件组也分 为 主文件组 和 次文件
组 。
? 一个文件 只能存在于 一个文件组 中,一个文件组 也只
能被 一个数据库 使用。
? 主文件组中包含了所有的 系统表 。
? 当建立数据库时,主文件组包括主数据库文件和未指
定组的其它文件。
? 在次文件组中可以指定一个缺省文件组,那么在创建
数据库对象时,
?如果没有指定将其放在哪一个文件组中,就会将它放在缺省
文件组中。
?如果没有指定缺省文件组,则主文件组为缺省文件组。
返回 720
?用 Query Analyzer创建数据库
create database 数据库名
?用 Enterprise Manager 创建数据库
注,
?数据库的名称最长为 128 个字符,且不区分大小写;
?一个服务器在理论上可以管理 32,767 个数据库。
返回 721
7.6.4 查看数据库信息
7.6.4.1 用 Enterprise Manager查看数据库信息
?SQL Server 提供了目录树的浏览方式,使得浏
览数据库信息非常方便、快捷。
?在 Enterprise Manager 窗口中查看数据库信息
的方法如下,
方法 1,
?在 Enterprise Manager 窗口中的左侧目录树窗口中,
展开, 数据库, 文件夹,在某个数据库名称上单击
右键,在出现的快捷菜单中单击, 任务板, 要浏览
的数据库文件夹。
返回 722
方法 2,
?在 Enterprise Manager 窗口中的左侧目录树窗口
中,展开, 数据库, 文件夹,单击某个数据库名称,
然后单击, 查看, 菜单,在其下拉菜单中单击, 任
务板, 。
?操作完成后,在 Enterprise Manager窗口右侧的
,任务板, 窗口中看到数据库的, 常规, 信息、
,表, 信息和, 向导, 信息。
?在打开数据库文件夹目录树后,可以选择各种数据
库对象进行信息浏览。
返回 723
7.6.4.2 用系统存储过程显示数据库信息
? SQL Server 提供了许多很有用的系统存储过程,可以
用它们来得到许多从 Enterprise Manager 界面中所不
易或不能看到的信息。
? 可以把存储过程当作函数或命令来用。
1,用系统存储过程显示数据库结构
?可以使用系统提供的系统存储过程 Sp_helpdb 来显示数据库
结构,其语法如下,
sp_helpdb [[@dbname=] 'name']
?使用 Sp_helpdb 系统存储过程可以显示指定数据库的信息。
?如果不指定 [@dbname=],'name'子句则会显示在
master.dbo.sysdatabases 表中存储的所有数据库信息,命
令执行成功会返回 0,否则返回 1。
如,显示 Northwind 数据库的信息。
exec sp_helpdb Northwind
返回 724
2,用系统存储过程显示文件信息
?可以使用系统提供的系统存储过程 Sp_helpfile 来显
示当前数据库中的文件信息,其语法如下,
sp_helpfile [[@filename =] 'name']
?如果不指定文件名称,则会显示当前数据库中所有的
文件信息。命令执行成功会返回 0,否则返回 1。
如,显示 Northwind数据库中 northwind文件的信
息。
use Northwind
exec sp_helpfile northwind
返回 725
3,用系统存储过程显示文件组信息
?可以使用系统提供的系统存储过程
Sp_helpfilegroup 来显示当前数据库中文件组信息,
其语法如下,
sp_helpfilegroup [[@filegroupname =] 'name']
?如果不指定文件组名称,则会显示当前数据库中所
有的文件组。
?命令执行成功会返回 0。否则返回 1。
如,显示 Northwind数据库中的所有文件组信息。
use Northwind
exec sp_helpfilegroup
返回 726
7.6.5 更改数据库
7.6.5.1 更改文件及其属性
? 可以在 Enterprise Manager 中利用数据库属性设置更
改数据库文件和事务日志文件。
? 也可以用 ALTER DATABASE 命令来更改数据库,ALTER
DATABASE 命令可以增加或删除数据库中的文件也可以
修改文件的属性;应注意的是只有数据库管理员 ( DBA)
或具有 CREATE DATABASE 权限的 数据库所有者 才有权
执行此命令。
如,修改 Northwind数据库中的 Northwind文件增容方式
为一次增加 2MB。
alter database Northwind
modify file
( name = Northwind,
filegrowth = 2mb)
返回 727
7.6.5.2 更改数据库名
?重命名数据库需要使用系统存储过程 Sp_renamedb,
其语法如下,
sp_renamedb [@old_name =] 'old_name',
[@new_name =] 'new_name?
如,假设 study数据库已存在,更改 study数据库
的名称为 Student。
exec sp_renamedb 'study','Student'
返回 728
7.6.6 删除数据库
7.6.6.1 用 Enterprise Manager 删除数据库
?在 Enterprise Manager 中在所要删除的数据库上单击右键,
从快捷菜单中选择, 删除, 选项即可删除数据库
?也可以选择数据库文件夹或图标后从工具栏中选择 图标来
删除数据库
?系统会提示确认是否要删除数据库
?删除数据库一定要慎重。因为删除数据库后,与此数据库有
关联的数据库文件和事务日志文件都会被删除,存储在系统
数据库中的关于该数据库的所有信息也会被删除。
7.6.6.2 用 DROP DATABASE 命令删除数据库
?DROP DATABASE 命令可以从 SQL Server 中一次删除一个或几
个数据库。数据库所有者 DBO 和数据库管理员 DBA 才有权执
行此命令。
如,删除数据库 study。
drop database study
返回 729
7.6.7 压缩数据库
?数据库在使用一段时间后时常会出现因数据删
除而造成数据库中 空闲空间太多 的情况,这时
就需要减少分配给数据库文件和事务日志文件
的磁盘空间,以免浪费磁盘空间。
?当数据库中没有数据时,可以修改数据库文件
属性,直接改变其占用空间;
?但当数据库中有数据时这样做会破坏数据库中
的数据,因此需要使用压缩的方式来缩减数据
库空间;
?对数据库可以进行 自动压缩,也可以进行 人工
压缩 。
返回 730
7.6.7.1 自动压缩数据库
?在 Enterprise Manager 中左侧窗口中,右健单击
某个数据库名称,在出现的快捷菜单中,单击, 属
性, 菜单项,出现, 数据库属性, 对话框,单击对
话框中的, 选项, 选项卡,在本页中选择, 自动收
缩, 选项,让系统自动压缩数据库。
7.6.7.2 人工压缩数据库
人工压缩数据库有以下两种方式,
1.用 Enterprise Manager 压缩数据库
?在 Enterprise Manager 中在所要压缩的数据库上
单击右键,从快捷菜单中的, 所有任务, 中选择
,收缩数据库, 选项,并进行相应的配置。
返回 731
2,用 Transact-SQL 命令压缩数据库
?可以使用 DBCC SHRINKDATABASE 和 DBCC
SHRINKFILE 命令来压缩数据库。其中,
? DBCC SHRINKDATABASE 命令对 数据库 进行压缩;
? DBCC SHRINKFILE 命令对数据库中指定的 文件 进行压缩。
( 1) DBCC SHRINKDATABASE命令
如,压缩数据库 study的未使用空间为数据库大
小的 20%。
dbcc shrinkdatabase (study,20)
( 2) DBCC SHRINKFILE
如,压缩数据库 study中的数据库文件 Study的大
小到 1MB。
use study
dbcc shrinkfile (Study,1)
返回 732
7.7 管理数据表
7.7.1 用 Enterprise Manager创建数据库表
7.7.2 修改表
7.7.2.1 用 Enterprise Manager 修改数据表的结构
7.7.2.2 用存储过程 Sp_rename 修改表名和列名
如,更改 Study表的列 s_no 名称为 stu_no。
exec sp_rename 'Study.[s_no]','stu_no','column?
如,更改 study 表的名称为 Student。
exec sp_rename 'study','Student'
返回 733
7.7.3 查看表
7.7.3.1 查看表的属性
7.7.3.2 查看数据表中的数据
? 在 Enterprise Manager 中,用右键单击要查看数据的表,
从快捷菜单中选择, 打开表,,再选择其子菜单中的, 返
回所有行, 。
7.7.3.3 用系统存储过程 Sp_help 查看表的信息
? Sp_help 存储过程可以提供指定的数据库对象的信息和系
统或用户定义的数据类型的信息。
如,显示当前数据库中所有对象的信息 。
exec sp_help
如,显示表 Student的信息 。
exec sp_help Student
返回 734
7.8 用 Enterprise Manager管理数据
7.8.1 添加数据
7.8.2 删除数据
7.8.3 修改数据
返回 735
7.9 SQL Server的帐号和存取权限
?数据的 安全性 是指保护数据以防止因不合理的
使用而造成数据的泄密和破坏,这就要采取一
定的安全保护措施。
?在数据库管理系统中,用 检查口令 等手段来检
查用户身份,通过检查的用户才能进入数据库
系统中。
?当用户对数据库执行操作时,系统自动检查用
户是否有权限执行这些操作。
返回 736
7.9.1 SQL Server的验证模式
? 为了实现安全性, SQL Server对用户的访问进行两个阶
段的检验,
( 1) 验证阶段 ( Authentication),
?用户在 SQL Server上获得对任何数据库的访问权限之前, 必须
登录到 SQL Server上, 并且被认为是合法的 。
?SQL Server或者 Windows NT/2000对用户进行验证 。
?如果验证通过, 用户就可以连接到 SQL Server上, 否则, 服务
器将拒绝用户登录 。 从而保证了系统安全 。
( 2) 许可确认阶段 ( Permission Validation),
?用户验证通过后, 登录到 SQL Server上, 系统检查用户是否有
访问服务器上数据的权限 。
? 在验证阶段,系统是对用户登录进行验证。
? SQL Server和 Windows NT/2000是结合在一起的,因此
产生了两种验证模式,Windows验证模式 和 混合验证模
式 。
返回 737
7.9.1.1 Windows验证模式
? 在该验证模式下, SQL Server检测当前使用的
Windows用户帐号, 并在 Syslogins表中查找该帐号,
以确定该帐号是否有权登录 。
? 在这种方式下, 用户不必提供密码或者登录名让 SQL
Server验证 。
Windows验证模式下主要有以下优点,
1,数据库管理员的工作可以集中在管理数据库上面, 而不是管
理用户帐户 。 对用户帐户的管理可以交给 Windows NT/2000去
完成 。
2,Window NT/2000有着更强的用户帐户管理工具 。 可以设置帐
户锁定, 密码期限等 。 如果不是通过定制来扩展 SQL Server,
SQL Server是不具备这些功能的 。
3,Windows NT/2000的 组策略 支持多个用户同时被授权访问
SQL Server。
返回 738
?但是, 应该注意的是, 要在客户和服务器间建
立连接, 使用该验证模式时, 必须满足以下两
个条件中的一个,
1,客户端的用户必须有合法的服务器上的 Windows
NT/2000帐户, 服务器能够在自己的域中或者信任
域中验证该用户 。
2,服务器启动了 Guest帐户, 但是该方法会带来安全
上的隐患, 因而不是一个好的方法 。
返回 739
7.9.1.2 混合验证模式
? 混合验证模式允许以 SQL Server验证或者 Windows验
证模式来进行验证 。
? 使用哪个模式取决于在最初的通信时使用的网络库 。
?如果一个用户使用的是 TCP/IP Sockets进行登录验证, 则将使
用 SQL Server验证模式;
?如果用户使用命名管道, 则登录时将使用 Windows验证模式 。
? 这种模式能更好地适应用户的各种环境 。 但是对于
Windows 9X系列 的操作系统, 只能使用 SQL Server验
证模式 。
? SQL Server验证模式下,处理登录的过程为:用户在
输入登录名和密码后,SQL Server在系统注册表中检
测输入的登录名和密码。如果输入的登录名存在,而
且密码也正确,就可以登录到 SQL Server上。
返回 740
混合验证模式具有以下优点,
1,创建了 Windows NT/2000之上的另外一个安全层次 。
2,支持更大范围的用户, 如非 Windows NT客户, Novell网络等 。
3,一个应用程序可以使用单个的 SQL Server登录和口令 。
? 由此可以看出,
?验证模式的选择通常与网络验证的模型和客户与服务器间的
通信协议有关。
?如果网络主要是 Windows NT/2000网,则用户登录到 Windows
NT/2000时已经得到了确认,因此,使用 Windows验证模式将
减轻系统的工作负担;
?但是,如果网络主要是 Novell网络或者对等网,则使用 SPX协
议和 SQL Server验证模式将是很方便的。因为,这种情况下,
只需创建 SQL Server登录帐户,而不用创建 Windows NT/2000
帐户。
返回 741
7.9.1.3 设置验证模式
? 在第一次安装 SQL Server,或者使用 SQL Server连接
其他服务器的时候, 需要指定验证模式 。
? 对于已经指定验证模式的 SQL Server服务器, 在 SQL
Server中还可以进行修改 。 操作步骤如下,
1.打开企业管理器,展开, 服务器组, 文件夹,在其中的某个
服务器上单击右键,在弹出的快捷菜单上选择, 编辑 SQL
Server注册属性, 菜单命令,这时打开, 已注册的 SQL Server
属性, 对话框。
2.在对话框中设置验证模式后,单击“确定”按钮即可。
? 但要注意:修改验证模式后,必须首先停止 SQL
Server服务,然后重新启动 SQL Server,才能使新的
设置生效。
返回 742
7.9.2 帐号和角色
? 在 SQL Server中, 帐号有两种,
?一种是 登录服务器 的登录帐号 ( login name)
?另外一种是 使用数据库 的用户帐号 ( user name) 。
? 登录帐号是指能登录到 SQL Server的帐号, 属于服务器的
层面, 它本身并不能让用户访问服务器中的数据库, 而登
录者要使用服务器中的数据库时, 必须要有用户帐号才能
够存取数据库 。
? 就如同公司门口先刷卡进入 ( 登录服务器 ), 然后再拿钥
匙打开自己的办公室 ( 进入数据库 ) 一样 。
? 用户名 要在特定的数据库内创建,并关联一个 登录名 (当
一个用户创建时,必须关联一个登录名)。
? 用户定义的信息存放在服务器的每个数据库的 sysusers表中,
用户没有密码同它相关联。
? 通过授权给用户来指定用户可以访问的数据库对象的权限。
返回 743
7.9.2.1 服务器的登录帐号
1,查看登录帐号
方法 1:使用企业管理器
?在安装 SQL Server后,系统默认创建 三个 登录帐号。
?进入企业管理器,展开, SQL Server组,,找到所
要连接的 SQL Server服务器,展开该服务器对应的
文件夹,再展开, 安全性, 文件夹,单击, 登录,
选项,即可看到系统创建的 默认登录帐号 及已建立
的其他登录帐号。
返回 744
?其中,BUILTIN\Administrators, 域名
\Administrator,sa是默认的登录帐号, 它们
的含义如下,
( 1 ) BUILTIN\Administrators,凡是 Windows NT
Server/2000中 Administrators组 的帐号都允许登录
SQL Server。
( 2 ) 域名 \Administrator, 允 许 NT Server 的
Administrator帐号登录 。
( 3) sa,超级管理员帐号, 允许 SQL Server的系统管
理员登录, 此 SQL Server 的管理员不一定是
Windows NT Server/2000的管理员 ( 但通常是 ) 。
方法 2:使用存储过程
?使用 sp_helplogins可查看登录帐号 。 格式是,
exec sp_helplogins
返回 745
2,创建一个登录帐号
? 在此介绍两种创建方法,
?一种是利用 SQL Server的 企业管理器 。
?一种是利用 SQL Server提供的 存储过程 。
? 方法 1,
( 1) 在 SQL Server的企业管理器下, 展开, SQL Server组, 文件
夹, 找到需要建立登录帐号的服务器并展开其文件夹, 再展
开, 安全性, 文件夹, 在, 登录, 选项上右击鼠标, 在出现
的快捷菜单中单击, 新建登录, 菜单命令, 打开, SQL Server
登录属性, 对话框 。
( 2) 在, 名称, 文本框中输入要创建的登录帐号名称, 如:
,StudyAdm”,在, 身份验证, 选项组中, 单击, SQL Server
身份验证, 单选钮, 并输入密码, 然后在, 默认设置, 选项
组中, 选择数据数据库列表中的某个数据库, 如:, Study”,
表示该登录帐号默认登录到 Study数据库中 。
?( 3)在对话框中,单击, 服务器角色, 标签,打开, 服务器
角色, 选项卡,在此选项卡中,可以设置登录帐号所属的服
务器角色。
返回 746
? 角色 ( role) 是一组用户所构成的组, 可分为 服务器角色 与 数据库角色 。
? 以下先介绍服务器角色, 数据库角色放在后面讲解 。
? 服务器角色 是负责管理与维护 SQL Server的组, 一般只会指定需要管理
服务器的登录帐号属于服务器角色 。
? SQL Server在安装过程中定义 几个固定的服务器角色, 其具体权限如下,
① sysadmin:全称为 System Administrators,可以在 SQL Server中执行任何活
动 。
② serveradmin:全称为 Server Administrators,可以设置服务器范围的配置
选项, 关闭服务器 。
③ setupadmin:全称为 Setup Administrators,可以管理链接服务器和启动过
程 。
④ securityadmin:全称为 Security Administrators,可以管理登录和创建数
据库的权限, 还可以读取错误日志和更改密码 。
⑤ processadmin:全称为 Process Administrators,可以管理在 SQL Server中
运行的进程 。
⑥ dbcreator:全称为 Database Creators,可以创建, 更改和除去数据库 。
⑦ diskadmin:全称为 Disk Administrators,可以管理磁盘文件 。
⑧ bulkadmin:全称为 Bulk Insert Administrators,可以执行 BULK INSERT
( 大容量插入 ) 语句 。
? 注:属于 Windows NT/2000 Administrators组的帐号, 在 SQL Server中
被自动设置为 sysadmin服务器角色 。
返回 747
( 4) 在对话框中, 单击, 数据库访问, 标签,
打开, 数据库访问, 选项卡 。 在此选项卡中可
选择登录帐号可以访问的数据库, 即选中所需
要的数据库左面的复选框 。
( 5) 设置完毕后, 单击, 确定, 按钮, 即可完
成该登录帐号的创建 。
( 6) 在步骤 ( 2) 中, 如果选择, Windows身份
验证, 单选钮, 则, 名称, 文本框后面的按钮
被激活, 单击可打开选择 Windows用户的对话
框 。 从该对话框中可选择 Windows系统的用户
作为 SQL Server的登录帐号 。
返回 748
方法 2,
? 利用 SQL Server提供的存储过程 sp_addlogin创建登录
帐号 。 格式是,
EXEC sp_addlogin ‘ 登录帐号名称 ’,?密码 ’,?默认数据库名 ’,
?使用的语言 ’
注,
( 1) 使用的语言如果指定为 NULL,则表示使用系统默认语言 。
( 2) 此存储过程只是添加了一个登录帐号, 该帐号只能登录到
SQL Server,并不对某特定数据库具有存取权限, 所以, 还需
要利用 sp_adduser存储过程将此登录帐号加入到指定数据库中
才行 。
EXEC sp_addlogin 'Mike','m1934','study',NULL
? 此语句建立了一个名称为 Mike的登录帐号 。
USE study
EXEC sp_adduser 'Mike?
? 此语句将 Mike登录帐号加入到数据库 study中 。
返回 749
3,更改登录帐号属性
( 1) 进入企业管理器, 展开, SQL Server组,, 找到所要连接的
SQL Server服务器, 展开该服务器对应的文件夹, 再展开, 安
全性, 文件夹, 单击, 登录, 选项, 在企业管理器的右侧窗格
中即可看到系统创建的默认登录帐号及已建立的其他登录帐号 。
?在需要更改属性的帐号上单击右键, 在出现的快捷菜单中, 单
击, 属性, 菜单项, 即可打开登录帐号的属性对话框, 在该对
话框中可以更改有关该帐号的密码, 服务器角色, 访问的数据
库等, 该对话框中各项的含义如同创建登录帐号时的含义相同,
在此不再重复 。
( 2) 使用存储过程 sp_password可改变登录帐号的密码 。 格式是,
EXEC sp_password ?旧密码 ’,?新密码 ’,?登录帐号名称 ’
EXEC sp_password ?m1934?,?mike1934?,?Mike?
? 此语句将 Mike帐号的密码由原来的 m1934改为
mike1934。
返回 750
( 3) 使用存储过程 sp_addsrvrolemember可以将登录帐
号加入服务器的角色中 。 格式是,
EXEC sp_addsrvrolemember ?登录帐号 ’,?服务器角色名称 ’
EXEC sp_addsrvrolemember ?Mike?,?dbcreator?
?此语句是将登录帐号 Mike加入到 dbcreator服
务器角色中。
返回 751
4,删除登录帐号
? 方法 1:使用企业管理器
?进入企业管理器, 展开, SQL Server组,, 找到所要连接的
SQL Server服务器, 展开该服务器对应的文件夹, 再展开, 安
全性, 文件夹, 单击, 登录, 选项, 在企业管理器的右侧窗
格中即可看到系统创建的默认登录帐号及已建立的其他登录
帐号 。
?在需要更改属性的帐号上单击右键, 在出现的快捷菜单中,
单击, 删除, 菜单项, 此时会打开一个提示对话框, 单击
,是, 按钮确定删除 。
? 方法 2:使用存储过程
?使用存储过程 sp_droplogin可删除某一登录帐号 。 格式是,
USE 数据库
EXEC sp_droplogin ?登录帐号 ’
USE study
EXEC sp_droplogin ?Mike?
? 该语句可从数据库 Study中删除 Mike登录帐号。
返回 752
7.9.2.2 数据库的用户
? 一个 SQL Server的登录帐号只有成为该数据库的用户
时, 对该数据库才有访问权限 。
? 在安装 SQL Server后, 默认数据库如,master、
tempdb,msdb等包含两个用户,dbo和 guest。
? 任何一个登录帐号都可以通过 guest用户帐号来存取相
应的数据库 。
? 但是当新建一个数据库时, 默认只有 dbo用户帐号而没
有 guest用户帐号 。
? 每个登录帐号在一个数据库中只能有一个用户帐号,
但每个登录帐号可以在不同的数据库中各有一个用户
帐号。
? 如果在新建登录帐号过程中,指定对某个数据库具有
存取权限,则在该数据库中将自动创建一个与该登录
帐号同名的用户帐号。
返回 753
注,
( 1) master和 tempdb数据库中的 guest用户帐号
不能删除, 而其他数据库中的 guest用户帐号可
以删除 。
?因为 master数据库中记录了所有的系统信息, 每个
登录的用户若没有特别指定数据库, 默认都是使用
master数据库 。
?而 tempdb数据库是临时使用的数据库, 所有与服务
器连接的数据都会存储在该处, 因此也必须提供
guest用户帐号 。
( 2)登录帐号具有对某个数据库的访问权限,
并不表示该登录帐号对该数据库具有存取的权
限。如果要对数据库的对象进行插入、更新等
操作,还需要设置用户帐号的权限。
返回 754
1,查看数据库的用户
方法 1:使用企业管理器
?在企业管理器中, 展开 SQL Server组及其服务器, 在, 数据库,
文件夹中, 展开某数据库如,Study的文件夹, 单击, 用户,
选项, 则可在企业管理器的右窗格中显示出目前该数据库中
所有的用户 。
方法 2:利用存储过程
格式是,
USE 数据库名
EXEC sp_helpuser
USE Study
EXEC sp_helpuser
? 可列出目前 Study数据库中所有的数据库用户帐户。
返回 755
2,创建数据库的用户
方法 1:使用企业管理器
( 1) 在企业管理器中, 展开 SQL Server组及其服务器,
在, 数据库, 文件夹中, 展开某一数据库如,Study
的文件夹, 然后在, 用户, 选项上单击鼠标右键,
在弹出的快捷菜单中选择, 新建数据库用户, 命令,
打开新建用户对话框 。
( 2) 单击, 登录名, 下拉列表框右端的下拉箭头,
选择, ZHANGSAN”登录帐号, 此时, 用户名, 文
本框中自动显示为, ZHANGSAN” 。
? 可以更改, 用户名, 文本框中的用户名, 也可以在, 数据
库角色成员, 列表框中选择新建用户应该属于的数据库角
色 。
( 3) 设置完毕后, 单击, 确定, 按钮, 即可在 Study
数据库中创建一个新的用户帐号 。 如果不想创建用
户帐号, 单击, 取消, 按钮即可 。
返回 756
方法 2:使用存储过程
格式是,
USE 数据库名
EXEC sp_adduser ?登录帐号 ’,?用户帐号 ’,?所属的数据库角色 ’
USE Study
EXEC sp_adduser ?ZHANGSAN?,?ZHANGSAN?,?db_owner?
?该语句的功能是向 Study数据库中,添加一个
名称为 ZHANGSAN的用户帐号。
返回 757
3,设置数据库用户帐号的权限
?在创建数据库用户帐号对话框中, 当新建一个
新的用户帐号时,, 登录名, 右侧的, 权限,
按钮是灰色的, 表示不能在创建数据库用户帐
号的同时设置其权限 。
?但可以在创建后通过其属性对话框来设置其权
限, 步骤如下,
( 1)在企业管理器的右窗格中的用户帐号上单击鼠
标右键,然后选择, 属性, 命令,打开, 数据库用
户属性, 对话框。
返回 758
( 2)在, 数据库用户属性, 对话框中,单击, 权限, 按钮,打开权
限设置对话框。在此对话框中,可以设置用户对数据库对象所具
有的权限。
? 在, 对象, 列中, 显示了数据库中所有的对象, 而, 所有者, 列则
显示了相应对象的所有者 。 其后的 6列则是对数据库对象的操作, 具
体含义如下,
? SELECT:对表或者视图的查询
? INSERT:在表或者视图中插入记录
? UPDATE:对表或者视图中的数据修改
? DELETE:删除表或者视图中的数据
? EXEC:执行存储过程
? DRI,Declarative Referential Integrity,可对表的外键加上限制,
以达成表的参照完整性。
? 对某个数据库对象而言,如果选中对应的复选框,则表示具有对
该对象进行相应操作的权限。
? 每个复选框具有 3种状态。
? 空白时表示未指定权限,或权限还原到未设置状态;
? 当打, √, 时表示具有该权限;
? 当打, ╳, 时,表示不具有该权限。
返回 759
( 3)如果要设置对表或者视图的某一字段进行操作的权
限,可在列表中选择表或者视图对象,然后单击, 列,
按钮,可打开, 列权限, 对话框。使用该对话框即可
进行相应权限的设置。
4,删除数据库用户帐号
方法 1:使用企业管理器
?在企业管理器中, 展开 SQL Server组及其服务器, 在, 数据库,
文件夹中, 展开某一数据库如,Study的文件夹, 然后在, 用
户, 选项上单击鼠标右键, 在弹出的快捷菜单中选择, 删除,
菜单命令 。
方法 2:使用存储过程
格式是,
USE 数据库名
EXEC sp_dropuser ?用户帐号 ’
USE Study
EXEC sp_dropuser ?ZHANGSAN?
? 该语句表示从数据库 Study中删除 ZHANGSAN用户帐号。
返回 760
7.9.2.3 数据库角色
? 角色 是一个强大的工具, 可以将用户集中到一个单元
中, 然后对该单元应用权限 。
? 对一个角色授予, 拒绝或废除的权限也适用于该角色
的任何成员 。
? 可以建立一个角色来代表单位中一类工作人员所执行
的工作, 然后给这个角色授予适当的权限 。
? 和登录帐号类似, 用户帐号也可以分成组, 称为 数据
库角色 ( Database Roles) 。
? 数据库角色应用于单个数据库 。 在 SQL Server中, 数
据库角色可分为两种,
?标准角色,由数据库成员所组成的组, 此成员可以是用户或
者其他的数据库角色 。
?应用程序角色,用来控制应用程序存取数据库的, 本身并不
包括任何成员 。
返回 761
1,标准角色
?在创建一个数据库时, 系统默认创建 10个 固定的标准角
色 。
?在企业管理器中, 展开 SQL Server组及其服务器, 在
,数据库, 文件夹中, 展开某一数据库如,Study的文件
夹, 然后单击, 角色, 选项, 这时可在企业管理器的右
侧窗格中显示出默认的 10个标准角色 。
? public角色是最基本的数据库角色 。
? db_owner:在数据库中有全部权限 。
? db_accessadmin:可以添加或删除用户 ID。
? db_securityadmin:可以管理全部权限, 对象所有权, 角色和角色
成员资格 。
? db_ddladmin:可以发出 ALL DDL,但不能发出 GRANT( 授
权 ), REVOKE或 DENY语句 。
? db_backupoperator:可以发出 DBCC,CHECKPOINT和 BACKUP
语句 。
? db_datareader:可以选择数据库内任何用户表中的所有数据 。
? db_datawriter:可以更改数据库内任何用户表中的所有数据 。
? db_denydatareader:不能选择数据库内任何用户表中的任何数据 。
? db_denydatawriter:不能更改数据库内任何用户表中的任何数据 。
返回 762
( 1) 查看角色的属性,
下面以 Study数据库中的 db_owner角色为例说明,
① 在企业管理器中,展开 SQL Server组及其服务器,
在, 数据库, 文件夹中,展开某一数据库如,Study
的文件夹,然后单击, 角色, 选项,这时可在企业
管理器的右侧窗格中显示出该数据库的所有角色。
② 在右侧窗格中,用鼠标右键单击, db_owner”角色,
在出现的快捷菜单中,单击, 属性, 菜单命令,则
打开, 数据库角色属性, 对话框 。
? 此对话框中列出了目前包括在该角色中的数据库用户帐号,
如:对于本例包括 abc和 dbo两个用户帐号 。
? 默认每个数据库的 db_owner中一定包括 dbo用户, dbo是默
认就存在的用户, 就是指数据库的创建者 。
? 在此对话框中, 单击, 添加, 按钮可为该角色添加一个用
户, 单击, 删除, 按钮, 可从角色中删除被选中的用户,
但是 dbo是不能被删除的 。
返回 763
( 2) 创建新的角色
方法 1:使用企业管理器
?在企业管理器中, 展开 SQL Server组及其服务器
?在, 数据库, 文件夹中, 展开某一数据库如,Study的文件夹
?然后在, 角色, 选项上单击鼠标右键, 在弹出的快捷菜单中
选择, 新建数据库角色, 菜单命令
?则出现, 数据库角色属性 ―― 新建角色, 对话框
?在该对话框中, 名称, 文本框中输入角色的名称
?在, 数据库角色类型, 中选择角色的类型为标准角色
?单击, 添加, 按钮可向角色中添加成员
?设置完成后, 单击, 确定, 按钮 。
方法 2:使用存储过程 其格式是,
USE 数据库名
EXEC sp_addrole ?角色名 ’,?拥有者 ’
USE Study
EXEC sp_addrole ?Myrole?,?dbo?
? 在 Study数据库中创建一名称为 Myrole的角色。
返回 764
( 3) 删除角色
方法 1:使用企业管理器
?在企业管理器中, 展开 SQL Server组及其服务器
?在, 数据库, 文件夹中, 展开某一数据库如,Study的文件夹
?然后单击, 角色, 选项, 这时在企业管理器的右侧窗格中会
显示出目前所有的角色
?在某一角色上单击鼠标右键, 在弹出的快捷菜单中选择, 删
除, 菜单命令即可 。
方法 2:使用存储过程
格式是,
USE 数据库名
EXEC sp_droprole ?角色名 ’
USE Study
EXEC sp_droprole ?Myrole?
? 删除数据库 Study中的 Myrole角色。
返回 765
2,应用程序角色
?在我们编写数据库的应用程序时, 可以自己定义应用程序角
色, 让应用程序的操作者能用我们写的程序来存取 SQL Server
的数据 。
?也就是说, 应用程序的操作者本身并不需要在 SQL Server上有
登录帐号以及用户帐号, 仍然可以存取数据库 ( 但只能通过
我们写的应用程序来操作 ), 如此可以避免操作者自行登录
SQL Server。
( 1) 应用程序角色的创建
?使用企业管理器创建应用程序角色的过程与标准角色的创建
过程基本相同, 就是在, 数据库角色属性 ―― 新建角色, 对
话框中, 选择, 应用程序角色, 即可 。
? 当用存储过程创建应用程序角色时, 应使用以下格式,
USE 数据库名
EXEC sp_setapprole ?应用程序角色名 ’,?密码 ’
USE Study
EXEC sp_setapprole ?approle?,?11111?
? 此语句表示在 Study数据库创建一个名称为 approle的应用程序角
色,密码为 11111。
返回 766
3,public数据库角色
?public数据库角色是每个数据库最基本的数据库角
色,每个用户可以不属于其他 9个固定数据库角色,
但是至少会属于 public数据库角色。
?当在数据库中添加新用户帐号时,SQL Server会自
动将新用户帐号加入 public数据库角色中。
返回 767
7.9.2.4 用户和角色的权限问题
用户是否具有对数据库存取的权力, 要看其权限
设置而定, 但是, 它还要受其角色的权限的限
制 。
1,用户权限 继承 角色的权限
?数据库角色中可以包含许多用户, 用户对数据库对
象的存取权限也继承自该角色 。
? 假设用户 User1属于角色 Role1,角色 Role1已经取得了对表
Table1的 SELECT权限, 则用户 User1也自动取得对表
Table1的 SELECT权限 。
? 如果 Role1对 Table1没有 INSERT权限, 而 User1取得了对表
Table1的 INSERT权限, 则 User1最终也取得对表 Table1的
INSERT权限 。
?而拒绝是优先的, 只要 Role1和 User1中的之一拒绝,
则该权限就是拒绝的 。
返回 768
2,用户分属不同角色
?如果一个用户分属于不同的数据库角色
? 如:用户 User1既属于角色 Role1,又属于角色 Role2,则用
户 User1的权限基本上是以 Role1和 Role2的并集为准。
?但是只要有一个拒绝,则用户 User1的权限就是拒绝

返回 769
7.10 索引
7.10.1 建索引
? 在 SQL Server中,除了使用 SQL创建索引外,还可用
Enterprise Manager 创建索引,在 Enterprise
Manager 中创建索引有两种方法,
1.用索引创建 向导 创建索引
?在 Enterprise Manager的目录树中选择要创建索引的表所在
的数据库名称,单击任务板中的, 向导, 选项卡,出现选择
向导界面,选择, 创建索引, 向导。
2,直接创建索引
?选择要创建索引的表,单击右键,从快捷菜单中选择, 所有
任务, 子菜单中的, 管理索引, 选项,将会出现, 管理索引,
对话框,其中列出了表中已经存在的索引。
?选择, 新建, 按钮,进入, 创建索引, 对话框。在其中输入
要创建的索引的名称,再选择用于创建索引的列,并设置索
引的各种选项,单击,” 按钮,完成索引的创建。
返回 770
7.10.2 查看与修改索引
7.10.2.1 用 Enterprise Manager 查看和修改索引
? 若想在 Enterprise Manager 中查看和修改索引, 其方
法是,
1,在 Enterprise Manager 的左侧窗格中, 展开要为其创建索的
表所在的数据库, 然后单击, 表, 项目 。
2,在 Enterprise Manager 的右侧窗格中, 在要为其创建索引的
表名上面单击右键, 此时出现快捷菜单, 用鼠标指向快捷菜
单中的, 所有任务, 菜单项, 此时, 出现下一级子菜, 从中
单击, 管理索引, 菜单项, 则会出现, 管理索引, 对话框 。
?在此对话框中, 显示了当前表上所建立的各个索引的名称及
有关的索引类型,
? 若想增加新的索引, 则单击, 新建, 按钮;
? 若想修改现有的某个索引, 则可单击该索引, 然后再单击, 编辑,
按钮;
? 若想删除现有的某个索引, 则可先单击它, 然后再单击, 删除,
按钮 。
返回 771
7.10.2.2 用存储过程 Sp_helpindex 查看索引
? Sp_helpindex 存储过程可以返回表的所有索引的信息 。
其语法如下,
sp_helpindex [@objname =] 'name'
? 其中 [,@objname =] 'name'子句指定当前数据库中的表的名称 。
如,查看表 Student的索引 。
exec sp_helpindex Student
7.10.2.3 用存储过程 Sp_rename 更改索引名称
? sp_rename 存储过程可以更改索引的名称 。 其语法如
下,
sp_rename ?数据表名,原索引名 ’,?新索引名 ’
如,更改 Student表中的索引 s_no 名称为 stu_no。
exec sp_rename 'Student.[s_no]','stu_no','index'
返回 772
7.10.3 删除索引
7.10.3.1 用 Enterprise Manager 删除索引
?在 Enterprise Manager 中可以从, 索引管理,
对话框或表的属性对话框中选择要删除的索引,
再选择, 删除, 按钮来删除索引 。
7.10.3.2 用 DROP INDEX 命令删除索引
?DROP INDEX 命令可以删除一个或多个当前数
据库中的索引 。 其语法如下,
DROP INDEX 'tablename.indexname' [,...n]
? DROP INDEX 命令不能删除由 CREATE TABLE 或 ALTER
TABLE 命令创建的 PRIMARY KEY 或 UNIQUE 约束索引, 也
不能删除系统表中的索引 。
如,删除表 Student中的索引 s_no。
drop index Student.s_no_index
返回 773
7.11 数据完整性
7.11.1 数据完整性概述
? 数据完整性 ( Data Integrity) 是指数据的 精确性 和 可
靠性 。
? 它是应防止数据库中存在不符合语义规定的数据和防
止因错误信息的输入输出造成无效操作或错误信息而
提出的 。
? 数据完整性分为四类,
?实体完整性 ( Entity Integrity)
?域完整性 ( Domain Integrity)
?参照完整性 ( Referential Integrity)
?用户定义的完整性 ( User-defined Integrity) 。
? SQL Server 提供了一些 工具来 帮助用户实现数据完整
性,其中最主要的是 规则, 默认, 约束 和 触发器 。
返回 774
7.11.2 规则
? 规则( Rule) 就是数据库中对存储在表的列或用户自
定义数据类型中的值的规定和限制。
? 规则是单独存储的独立的 数据库对象 。
? 规则与其作用的表或用户自定义数据类型是 相互独立
的,即表或用户自定义对象的删除、修改不会对与之
相连的规则产生影响。
? 规则和约束可以同时使用,表的列可以有一个规则及
多个 CHECK 约束。
? 规则与 CHECK 约束 很相似。
? 相比之下,使用在 ALTER TABLE 或 CREATE
TABLE 命令中的 CHECK 约束是更标准的限制列值的
方法,但 CHECK 约束不能直接作用于用户自定义数
据类型。
返回 775
7.11.2.1 创建规则
1,用 CREATE RULE 命令创建规则
? CREATE RULE 命令用于在当前数据库中创建规则, 其
语法如下,
CREATE RULE rule_name AS condition_expression
其中,
? rule_name 是规则的名称
? condition_expression 子句是规则的定义, 它可以是能用
于 WHERE 条件子句中的任何表达式, 可包含算术运算符, 关
系运算符和谓词 ( 如 IN,LIKE,BETWEEN 等 ) 。
? condition_expression 子句中的表达式必须以字符 @ 开头
如,创建学生年龄规则 。
create rule age_rule
as @age >= 18 and @age <= 50
返回 776
2,用 Enterprise Manager 创建规则
?在 Enterprise Manager 的左侧窗格中,展开要创
建规则的数据库(如,Study)目录。
?在数据库的对象, 规则, 上面单击右键,此时出现
一快捷菜单,从快捷菜单中单击, 新建规则, 菜单
项,则会弹出, 规则属性, 对话框。
?在此对话框中的, 名称, 对应的文本框中输入要创
建的规则的名称(如,age_rule),在, 文本, 对
应的文本框中输入规则的内容(即约束的条件)。
?在输入完规则名称和规则的内容之后,单击, 确定,
按钮即完成规则的创建。
返回 777
7.11.2.2 查看规则
1,用 Enterprise Manager 查看规则
?在 Enterprise Manager 的左侧窗格中, 展开要创
建规则的数据库 ( 如,Study) 目录, 在数据库的
对象, 规则, 上面单击, 即可在其右边的任务板中
看到规则的大部分信息, 包括规则的名称, 所有者
和创建时间等 。
?要查看规则的内容, 方法是, 选择要查看的规则,
单击右键, 从快捷菜单中选择, 属性, 选项, 即会
出现, 规则属性, 对话框, 可以从中编辑规则的表
达式 。
?如果要修改规则的名称可以通过 Sp_rename 系统存
储过程进行,也可以直接用右键单击要修改的规则,
从快捷菜单中选择, 重命名, 菜单项,进行名称修
改。
返回 778
2,用存储过程 Sp_helptext 查看规则
?使用 Sp_helptext 存储过程可以查看规则的细
节, 其语法如下,
sp_helptext [@objname =] 'name'
? 其中, [@objname =] ?name?子句指明对象的名称
? 用 Sp_helptext 存储过程查看的对象可以是当前数据库中
的规则, 默认, 触发器, 视图或未加密的存储过程 。
如,查看名称为, age_rule”的规则内容 。
EXEC sp_helptext 'age_rule'
返回 779
7.11.2.3 规则的绑定与松绑
?创建规则后,规则仅仅只是一个存在于数据库
中的对象,并未发生作用。
?需要将规则与数据库表或用户自定义对象联系
起来,才能达到创建规则的目的。
?联系的方法称为, 绑定, 。
?所谓 绑定 就是指定规则作用于哪个表的哪一列
或哪个用户自定义数据类型。
?表的一列或一个用户自定义数据类型只能与一
个规则相绑定,而一个规则可以绑定多对象,
这正是规则的魅力所在。
?解除规则与对象的绑定称为, 松绑, 。
返回 780
1,用存储过程 Sp_bindrule 绑定规则
? 存储过程 Sp_bindrule 可以绑定一个规则到表的一个
列或一个用户自定义数据类型上 。 其语法如下,
sp_bindrule [@rulename =] 'rule',
[@objname =] 'object_name'
[,'futureonly']
各参数说明如下,
( 1) [@rulename =] 'rule'
? 指定规则名称 。
( 2) [@objname =] 'object_name'
? 指定规则绑定的对象 。
( 3) 'futureonly?
? 此选项仅在绑定规则到用户自定义数据类型上时才可以使用 。
? 当指定此选项时, 仅以后使用此用户自定义数据类型的列会应用
新规则, 而当前已经使用此数据类型的列则不受影响 。
返回 781
如,绑定规则 age_rule 到 s表的字段 age。
EXEC sp_bindrule 'age_rule','s.age'
注,规则对已经输入表中的数据不起作用 。
? 规则所指定的数据类型必须与所绑定的对象的数据类
型一致, 且规则不能绑定一个数据类型为 TEXT,IMAGE
或 TIMESTAMP 的列 。
? 与表的列绑定的规则优先于与用户自定义数据类型绑
定的列 。 因此, 如果表的列的数据类型与规则 A 绑定,
同时列又与规则 B 绑定, 则以规则 B 为列的规则 。
? 可以直接用一个新的规则来绑定列或用户自定义数据
类型, 而不需要先将其原来绑定的的规则解除, 系统
会将旧规则覆盖 。
返回 782
2,用存储过程 Sp_unbindrule 解除规则的绑定
?存储过程 Sp_unbindrule 可解除规则与列或用
户自定义数据类型的绑定, 其语法如下,
sp_unbindrule [@objname =] 'object_name'
[,'futureonly']
其中,
?‘ futureonly?选项同绑定时一样, 仅用于用户自定
义数据类型, 它指定现有的用此用户自定义数据类
型定义的列仍然保持与此规则的绑定 。
?如果不指定此项, 所有由此用户自定义数据类型定
义的列也将随之解除与此规则的绑定 。
如,要解除已绑定到 s表的字段 age的规则 age_rule。
EXEC sp_unbindrule 's.age'
返回 783
3,用 Enterprise Manager 管理规则的绑定
?在 Enterprise Manager 的左侧窗格中,展开相应
的数据库(如,Study)目录
?在数据库的对象, 规则, 上面单击,即可在其右边
的任务板中看到已创建的规则名称
?在相应的规则名称上面单击右键,从快捷菜单中选
择, 属性, 选项
?会出现, 规则属性, 对话框,该对话框中的, 绑定
UDTs”按钮用于将规则绑定到用户自定义数据类型,
,绑定列, 按钮用于将规则绑定到表的列。
返回 784
?在, 规则属性, 对话框中,单击, 绑定 UDTs”按钮,
则出现, 绑定规则到用户自定义数据类型, 的对话
框,单击, 绑定列, 按钮则出现, 绑定规则到表的
列, 的对话框
?在该对话框中, 在, 表, 所对应的下拉列表中, 选
择相应的数据表 ( 如:数据表 S), 在, 未绑定的
列, 列表中单击要绑定到的某个列 ( 如,AGE),
然后单击, 添加, 按钮, 将该列添加到, 绑定列,
中, 最后单击, 确定, 按钮, 这时规则就被绑定到
所选定的列上了 。
返回 785
7.11.2.4 删除规则
1,用 Enterprise Manager 删除规则
?在 Enterprise Manager 的左侧窗格中, 展开相应的数据库
( 如,Study) 目录
?在数据库的对象, 规则, 上面单击, 即可在其右边的任务板
中看到已创建的规则名称
?在相应的规则名称上面单击右键, 从快捷菜单中选择, 删除,
菜单项
?会出现, 除去对象, 对话框, 在该对话框中单击, 全部移去,
按钮 。
2,使用 DROP RULE命令删除规则
? 使用 DROP RULE 命令删除当前数据库中的一个或多个
规则 。 其语法如下,
DROP RULE {rule_name} [,...n]
? 注:在删除一个规则前必须先将与其绑定的对象解除
绑定
如,删除 age_rule规则,可执行以下命令,
DROP RULE age_rule
返回 786
7.11.3 默认
? 默认 ( Default) 是往用户输入记录时没有指定具体数
据的列中自动插入的数据 。
? 默认对象与 ALTER TABLE 或 CREATE TABLE 命令操作表
时用 DEFAULT 选项指定的默认功能相似, 但默认对象
可以用于多个列或用户自定义数据类型, 它的管理与
应用同规则有许多相似之处 。
? 表的一列或一个用户自定义数据类型也只能与一个默
认相绑定 。
7.11.3.1 创建默认
1,用 CREATE DEFAULT 命令创建默认
CREATE DEFAULT 命令用于在当前数据库中创建默认对象, 其语法如下,
CREATE DEFAULT default_name AS constant_expression
其中
?default_name是要创建的默认的名称
?constant_expression 子句是默认的定义, 该子句可以是数
学表达式或函数, 也可以包含表的列名或其它数据库对象 。
返回 787
如,创建出生日期默认 birthday_defa。
CREATE DEFAULT birthday_defa
as '1978-1-1'
?这样,当用户在输入记录数据时,未提供字段
birthday的值时,系统将自动默认其值为
,1978-1-1”。
返回 788
2,用 Enterprise Manager 创建默认
?在 Enterprise Manager 的左侧窗格中,展开相应
的数据库(如,Study)目录
?在数据库的对象, 默认, 上面单击右键,从出现的
快捷菜单中选择, 新建默认, 菜单项
?即会弹出, 默认属性, 对话框,在该对话框中的
,名称, 文本框中输入要创建的默认的名称(如:
birthday_defa),在, 值, 文本框中输入默认的

?单击, 确定, 按钮,即完成默认的创建
返回 789
7.11.3.2 查看和修默认
1,用 Enterprise Manager 查看默认
?在 Enterprise Manager 的左侧窗格中, 展开相应的数据库
( 如,Study) 目录
?在数据库的对象, 默认, 上面单击, 这时在右侧窗格中的任
务板中即可看到已建立的各个默认的信息
?在某个默认的名称上面单击右键, 从快捷菜单中选择, 属性,
菜单项, 即会出现, 默认属性, 对话框, 可以从中编辑默认
的值 。
? 修改默认名称的方法与修改规则名称的方法相同, 可
以用 SP_RENAME存储过程修改, 也可以在企业管理器的
任务板窗口中直接修改 。
2,用存储过程 SP_HELPTEXT 查看默认
使用 SP_HELPTEXT存储过程可以查看默认的细节 。
如,查看默认 birthday_defa。
EXEC SP_HELPTEXT birthday_defa
返回 790
7.11.3.3 默认的绑定与松绑
? 创建默认后, 默认仅仅只是一个存在于数据库中的对象, 并未发
生作用 。
? 同规则一样, 需要将默认与数据库表或用户自定义对象 绑定 。
1,用 Enterprise Manager 管理默认的绑定
?在 Enterprise Manager 的左侧窗格中,展开相应的数据库
(如,Study)目录
?在数据库的对象, 默认, 上面单击,这时在右侧窗格中的任
务板中即可看到已建立的各个默认的信息
?在某个默认的名称上面单击右键,从快捷菜单中选择, 属性,
菜单项,即会出现, 默认属性, 对话框
?对话框中的, 绑定 UDT”按钮用于将默认绑定到用户自定义数据
类型,,绑定列, 按钮用于将默认绑定到某个数据表的列。
?单击, 绑定 UDT”按钮,则出现, 绑定默认到用户自定义数据类
型, 的对话框;单击, 绑定列, 按钮,则出现, 绑定默认到
表的列, 的对话框。
?用它们来管理默认与表的列以及用户自定义数据类型之间的
绑定非常方便。
?此方法与绑定规则到用户自定义类型和表的列的方法完全一
致。
返回 791
2,用存储过程 Sp_binddefault 绑定默认
? 存储过程 Sp_bindefault 可以绑定一个默认到表的一
个列或一个用户自定义数据类型上 。 其语法如下,
SP_BINDEFAULT [@defname =] 'default',
[@objname =] 'object_name'
[,'futureonly']
其中,
?‘ futureonly?选项仅在绑定默认到用户自定义数据类型上时
才可以使用 。
?当指定此选项时, 仅以后使用此用户自定义数据类型的列会
应用新默认, 而当前已经使用此数据类型的列则不受影响 。
如,绑定默认 birthday_defa到数据表 s的 birthday列上 。
EXEC SP_BINDEFAULT birthday_defa,'s.[birthday]'
返回 792
3,用存储过程 Sp_unbindefault 解除默认的绑定
? 存储过程 SP_UNBINDEFAULT 可以解除默认与表的列或
用户自定义数据类型的绑定, 其语法如下,
SP_UNBINDEFAULT [@objname =] 'object_name'
[,'futureonly']
其中,
?‘ futureonly?选项同绑定时一样, 仅用于用户自定义数据类
型它指定现有的用此用户自定义数据类型定义的列仍然保持
与此默认的绑定 。
?如果不指定此项, 所有由此用户自定义数据类型定义的列也
将随之解除与此默认的绑定 。
如,解除默认 birthday_defa与表 s的 birthday列的绑定 。
EXEC SP_UNBINDEFAULT 's.[birthday]'
注,
?如果列同时绑定了一个规则和一个默认那么默认应该符合规
则的规定。
?不能绑定默认到一个用 CREATE TABLE 或 ALTER TABLE 命令创
建或修改表时用 DEFAULT 选项指定了的默认的列上。
返回 793
7.11.3.4 删除默认
1,用 Enterprise Manager 删除默认
?在 Enterprise Manager 的左侧窗格中, 展开相应的数据库
( 如,Study) 目录
?在数据库的对象, 默认, 上面单击, 这时在右侧窗格的任务
板中即可看到已建立的各个默认的信息
?在某个默认的名称上面单击右键, 从快捷菜单中选择, 删除,
菜单项, 即会出会出现, 除去对象, 对话框, 在该对话框中
单击, 全部移去, 按钮 。
2,使用 DROP DEFAULT命令删除认
使用 DROP DEFAULT 命令删除当前数据库中的一个或多个
默认 。 其语法如下,
DROP DEFAULT {default_name} [,...n]
如,删除学生生日默认 birthday_defa。
DROP DEFAULT birthday_defa
? 在删除一个默认前必须先将与其绑定的对象解除绑定
返回 794
7.12 数据查询
? 数据库是为更方便有效地管理信息而存在的, 人们希望数
据库可以随时提供所需要的数据信息 。
? 因此, 对用户来说, 数据查询 是数据库最重要的功能 。
? 在数据库中数据查询是通过 SELECT 语句 来完成的 。 SELECT
语句可以从数据库中按用户要求检索数据, 并将查询结果
以表格的形式返回 。
? 关于 SELECT语句的使用以及各种查询情况已在第 3章中详细
介绍过, 在此只介绍将查询结果存储到数据表中的变量中
的情况 。
? 在某些时候, 我们需要在程序中使用查询的结果, 如在编
写存储过程或触发器时, 这时就需要将查询结果存储到变
量中去 。
如,查询学号为 's1'的学生的学号与姓名, 并存储到变
量@ sno和 @sn中 。
DECLARE @sno varchar(10) DECLARE @sn varchar(10)
SELECT @sno = sno,@sn = sn FROM s WHERE sno = 's1'
返回 795
7.13 存储过程和触发器
?在大型数据库系统中,存储过程和触发器具有
很重要的作用。
?无论是存储过程还是触发器,都是 SQL 语句 和
流程控制语句 的集合。
?就本质而言,触发器也是一种存储过程。
?存储过程在运算时生成执行方式,所以,以后
对其再运行时其执行速度很快。
?SQL Server 2000 不仅提供了 用户自定义存储
过程 的功能,而且也提供了许多可作为工具使
用的 系统存储过程 。
返回 796
7.13.1 存储过程概述
?存储过程 ( Stored Procedure) 是一组为了完
成特定功能的 SQL 语句集, 经编译后存储在数
据库中 。
?用户通过指定存储过程的名字并给出参数 ( 如
果该存储过程带有参数 ) 来执行它 。
?在 SQL Server 的系列版本中存储过程分为两
类,
?系统提供的存储过程
?用户自定义存储过程
返回 797
? 系统过程 主要存储在 master 数据库中并以 sp_为前缀,
并且系统存储过程主要是从系统表中获取信息,从而
为系统管理员管理 SQL Server 提供支持。
? 通过系统存储过程,SQL Server 中的许多管理性或信
息性的活动(如了解数据库对象、数据库信息)都可
以被顺利有效地完成。
? 尽管这些系统存储过程被放在 master 数据库中,但是
仍可以在其它数据库中对其进行调用,在调用时不必
在存储过程名前加上数据库名。
? 而且当创建一个新数据库时,一些系统存储过程会在
新数据库中被自动创建。
? 用户自定义存储过程 是由用户创建并能完成某一特定
功能(如查询用户所需数据信息)的存储过程。
返回 798
7.13.2 创建存储过程
? 在 SQL Server 2000 中创建一个存储过程有两种方法,
?一种是使用 Transaction-SQL命令 Create Procedure,
?另一种是使用图形化管理工具 Enterprise Manager。
?用 Transaction-SQL 创建存储过程是一种较为快速的方法,
?但对于初学者, 使用 Enterprise Manager 更易理解, 更为简
单 。
? 当创建存储过程时, 需要确定存储过程的三个组成部分,
?1,所有的输入参数以及传给调用者的输出参数
?2,被执行的针对数据库的操作语句包括调用其它存储过程的
语句
?3,返回给调用者的状态值以指明调用是成功还是失败
? 利用, 向导,
返回 799
7.13.2.1 用 CREATE PROCEDURE 命令创建存储过程
? 通过运用 Create Procedure 命令能够创建存储过程,
在创建存储过程之前应该考虑到以下几个方面,
1,在一个批处理中 Create Procedure 语句不能与其它 SQL 语句
合并在一起 。
2,数据库所有者具有默认的创建存储过程的权限它可把该权限
传递给其它的用户 。
3,存储过程作为数据库对象其命名必须符合命名规则 。
4,只能在当前数据库中创建属于当前数据库的存储过程 。
如,在 teach数据库中, 创建一个名称为 myproc的存储过
程, 该存储过程的功能是从数据表 s中查询所有男同学
的信息 。
GO
CREATE PROCEDURE myproc AS
SELECT * FROM s WHERE sex = '男 '
GO
返回 800
? 定义具有参数的存储过程 。
如,在 teach数据库中, 创建一个名称为 InsertRecord的
存储过程, 该存储过程的功能是向数据表 s中插入一条
记录, 新记录的值由参数提供 。
USE teach
GO
CREATE PROCEDURE InsertRecord
(
@sno char(6),
@sn char(20),
@age numeric(5),
@sex char(2),
@dept char(10)
)
AS
INSERT INTO s VALUES(@sno,@sn,@sex,@age,@dept)
GO
返回 801
? 定义具有参数默认值的存储过程 。
如,在 teach 数 据 库 中, 创 建 一 个 名 称 为
InsertRecordDefa的存储过程, 该存储过程的功能是
向数据表 s中插入一条记录, 新记录的值由参数提供,
如果未提供系别 dept的值时, 由参数的默认值代替 。
USE teach
GO
CREATE PROCEDURE InsertRecordDefa
(
@sno char(6),
@sn char(20),
@age numeric(5),
@sex char(2),
@dept char(10)='无 '
)
AS
INSERT INTO s VALUES(@sno,@sn,@sex,@age,@dept)
GO
返回 802
? 定义能够返回值的存储过程 。
如,在 teach数据库中, 创建一个名称为 Query_Study的
存储过程, 该存储过程的功能是从数据表 s中根据学号
查询某一同学的姓名和系别 。
USE teach
GO
CREATE PROCEDURE Query_Study
(
@sno char(6),
@sn char(20) OUTPUT,
@dept char(10) OUTPUT
)
AS
SELECT @sn=sn,@dept=dept
FROM s
WHERE sno=@sno
GO
返回 803
7.13.2.2 使用 Enterprise Manager 创建存储过程
1,启动 Enterprise Manager,登录到要使用的服务器 。
2,在 Enterprise Manager的左窗格中, 展开要创建存
储过程的数据库文件夹, 单击, 存储过程, 文件夹,
此时在右窗格中显示该数据库的所有存储过程 。
3,用右键单击, 存储过程, 文件夹, 在弹出的快捷菜
单中选择, 新建存储过程,,此时打开, 新建存储过
程, 对话框 。
4,在, 文本, 编辑框中输入存储过程的正文内容 。
5,单击, 检查语法, 按钮, 检查语法是否正确 。
6,单击, 确定,, 保存 。
7,在右窗格中, 右击该存储过程, 在弹出菜单中选择
,所有任务,,选择, 管理权限, 设置权限 。
返回 804
7.13.3.1 查看存储过程
? 存储过程被创建以后, 它的 名字 存储在系统表
sysobjects 中;
? 它的 源代码 存放在系统表 syscomments 中 。
? 可以通过 SQL Server 提供的系统存储过程来查看关于
用户创建的存储过程信息 。
1,通过 Enterprise Manager 管理工具同样可以查看存
储过程的源代码
( 1) 启动 Enterprise Manager 登录到要使用的服务器 。
( 2) 在 Enterprise Manager的左窗格中, 展开要创建存储过程
的数据库文件夹, 单击, 存储过程, 文件夹, 此时在右窗格
中显示该数据库的所有存储过程 。
( 3) 在右窗格中, 右击要查看源代码的存储过程, 在弹出的菜
单中选择, 属性, 选项, 此时便可看到存储过程的源代码 。
7.13.3 管理存储过程
返回 805
2,使用 sp_helptext 存储过程查看存储过程的源
代码
sp_helptext 存储过程名称
如,查看数据库 Study 中存储过程 myproc 的源代
码 。
Exec sp_helptext myproc
?如果在创建存储过程时使用了 WITH ENCRYPTION
选项, 那么无论是使用 Enterprise Manager 还
是系统存储过程 sp_helptext 都无法查看到存储
过程的源代码 。
返回 806
7.13.3.2 重新命名存储过程
修 改 存 储 过 程 的 名 字 使 用 系 统 存 储 过 程
sp_rename,其命令格式为,
sp_rename 原存储过程名名,新存储过程名
如,将存储过程 myproc修改为 mynewproc。
sp_rename myproc,mynewproc
?另外,通过 Enterprise Manager 也可修改存
储过程的名字,其操作过程与 Windows下修改
文件名字的操作类似。
?即首先选中需修改名字的存储过程
?然后右击鼠标,在弹出菜单中选取, 重命名, 选项
?最后输入新存储过程的名字。
返回 807
7.13.3.3 删除存储过程
删除存储过程使用 drop 命令, drop 命令可将一
个或多个存储过程或者存储过程组从当前数据
库中删除 。 其语法规则为,
DROP PROCEDURE {procedure}} [,… n]
如,将存储过程 mynewproc从数据库中删除 。
drop procedure mynewproc
返回 808
7.13.3.4 执行存储过程
? 执行已创建的存储过程使用 EXECUTE 命令
如,执行数据库 teach中的存储过程 myproc。
EXECUTE myproc
如,执行数据库 teach中的存储过程 InsertRecord。
EXECUTE InsertRecord @sno = ?S1?,@sn = ?王大利 ’,@sex =
?男 ’,@age = 18,@dept= ?计算机系 ’
如,执行数据库 teach中的存储过程 InsertRecordDefa。
EXECUTE InsertRecordDefa @sno = 'S10',@sn = '高平 ',@sex
= '女 ',@age = 18
如,执行数据库 teach中的存储过程 Query_Study。
DECLARE @sn char(20)
DECLARE @dept char(10)
EXECUTE Query_Study 'S10',@sn OUTPUT,@dept OUTPUT
SELECT '姓名 ' =@sn,'系别 '=@dept
返回 809
7.13.4 触发器概述
? 在上面,我们介绍了 一般意义 的存储过程,即用户自
定义的存储过程和系统存储过程。
? 接下来将介绍一种 特殊 的存储过程,即触发器。
? 触发器主要是通过 事件 进行触发而被执行的,而存储
过程可以通过存储过程 名字 而被直接调用。
? 当对某一表进行诸如 UPDATE,NSERT,DELETE 这些操
作时,SQL Server 就会自动执行触发器所定义的 SQL
语句。从而确保对数据的处理必须符合由这些 SQL 语
句所定义的规则。
? 触发器的 主要作用 就是其能够实现由主键和外键所不
能保证的复杂的参照完整性和数据的一致性。
? 除此之外,触发器还有其它许多不同的功能。
返回 810
7.13.5 创建触发器
7.13.5.1 用 CREATE TRIGGER 命令创建触发器
如,下面创建一个触发器, 当向表 s中插入一条记录时,
自动显示表 s中的记录 。
CREATE TRIGGER Change_Display
ON s
FOR INSERT,UPDATE,DELETE
AS
SELECT * FROM s
? 该触发器建立完毕后, 当执行如下操作时将会显示数
据表 s中的全部记录 。
EXECUTE InsertRecordDefa @sno = 'S11',@sn = '张建峰 ',
@age = 17,@sex = '男 '
返回 811
7.13.5.2 用管理工具 Enterprise Manger 创建触发器
1,启动 Enterprise Manager 登录到要使用的服务器 。
2,在 Enterprise Manager的左窗格中, 展开要创建触发器的数
据库文件夹, 单击, 表, 文件夹, 此时在右窗格中显示该数
据库的所有表 。
3,在右窗格中, 右击要创建触发器的数据表, 在弹出的快捷菜
单中, 将鼠标指向, 所有任务,, 在出现的下一级子菜单中
选择, 管理触发器, 菜单项, 此时会出现, 触发器属性, 对
话框 。
4,在, 名称, 下拉框中选择, <新建 >”,在, 文本, 编辑框中输
入触发器的文本命令 。
5,单击, 检查语法, 按钮, 检查语句是否正确 。
6,单击, 应用, 按钮, 在, 名称, 下拉列框中会有新创建的触
发器名字 。
7,单击, 确定, 按钮, 关闭窗口创建成功 。
返回 812
7.13.8 管理触发器
7.13.8.1 使用 Enterprise Manager显示触发器信息
1,启动 Enterprise Manager 登录到要使用的服务器 。
2,在 Enterprise Manager的左窗格中, 展开要创建
触发器的数据库文件夹, 单击, 表, 文件夹, 此时
在右窗格中显示该数据库的所有表 。
3,在右窗格中, 右击要创建触发器的数据表, 在弹
出的快捷菜单中, 将鼠标指向, 所有任务,, 在出
现的下一级子菜单中选择, 管理触发器, 菜单项,
出现, 触发器属性, 对话框 。
4,在, 名称, 下拉框中选择所要查看的触发器的名
称, 在, 文本, 编辑框中显示出该触发器的文本命
令 。
返回 813
7.13.8.2 使用系统存储过程查看触发器
? 系统存储过程 sp_help,sp_helptext 和 sp_depends
分别提供有关触发器的不同信息 。 下面我们将分别对
其进行介绍,
1,sp_help
? 通过该系统过程, 可以了解触发器的一般信息, 如触
发器的名字, 属性, 类型, 创建时间 。
如,要查看我们已经建立的 change_display触发器 。
sp_help 'change_display'
2,sp_helptext
? 通过 sp_helptext 能够查看触发器的正文信息
如,要查看我们已经建立的 change_display触发器的命
令文本 。
sp_helptext 'change_display'
返回 814
3,sp_depends
?通过 sp_depends 能够查看指定触发器所引用
的表或指定的表涉及到的所有触发器 。
?其语法形式如下,
sp_depends ?触发器名字 ’
sp_depends ?表名 ’
如,要查看我们已经建立的 change_display触发
器所涉及的表 。
Exec sp_depends 'change_display'
?注:用户必须在当前数据库中查看触发器的信
息,而且被查看的触发器必须已经被创建。
返回 815
7.13.8.3 修改, 删除触发器
?通过 Enterprise Manager 和系统过程或
Transaction_SQL 命令, 可以修改触发器的名
字和正文 。
1,使用 sp_rename 命令修改触发器的名字
其语法格式为,
sp_rename oldname,newname
? oldname为触发器原来的名称
? newname为触发器的新名称 。
2,通过 Enterprise Manager 修改触发器正文
?通过 Enterprise Manager 修改触发器正文的操作
步骤与查看触发器信息一样。
?修改完触发器后要使用, 检查语法, 选项对语句进
行检查。
3.通过 Alert trigger 命令修改触发器正文
返回 816
4,删除触发器
?用户在使用完触发器后可以将其删除 。
?只有触发器属主才有权删除触发器 。
?删除已创建的触发器有三种方法,
( 1) 用系统命令 DROP TRIGGER 删除指定的触发器,
其语法形式如下,
DROP TRIGGER 触发器名字
( 2) 删除触发器所在的表时, SQL Server 将自动删
除与该表相关的触发器 。
( 3) 按前介绍的方法进入, 触发器属性, 对话框,
在该对话框中选择要删除的触发器, 然后单击, 删
除, 按钮即可 。
返回 817
7.14 视图
7.14.1 创建视图
? SQL SERVER 提供了使用 SQL SERVER Enterprise Manager 和 SQL
命令两种方法来创建视图,关于用 SQL命令创建视图的方法曾在
第 3章介绍过,在此只介绍第一种方法。
? 使用 Enterprise Manager 来创建视图的方法如下,
1,启动 Enterprise Manager,登录到指定的服务器 。
2,打开要创建视图的数据库文件夹, 选中, 视图, 图标, 此时在右面
的窗格中显示当前数据库的所有视图 。 右击, 视图, 图标, 在弹出
菜单中选择, 新建视图, 选项, 打开, 新建视图, 对话框, 在此对
话框中共有四个区, 从上到下依次为表区, 列区, SQL script 区,
数据结果区 。
3,在窗口中, 首先点击, 添加表, 按钮, 打开添加表对话框, 从中
选择所有要包含到视图中的表, 所有已添加的表都将显示到表区中 。
4,在列区中选择将包括在视图的数据列, 这此时相应的 SQL SERVER 脚
本便显示在 SQL script 区 。
5,单击 按钮, 在数据结果区将显示包含在视图中的数据行 。
6,单击 按钮, 在弹出对话框中输入视图名, 单击, 保存, 并输入视
图的名称, 完成视图的创建 。
返回 818
7.14.2 管理视图
7.14.2.1 查看修改视图
在 SQL SERVER 中,通过 Enterprise Manager 查
看和修改视图主要执行以下步骤,
方法 1,
1,启动 Enterprise Manager,登录到指定的服务器 。
2,打开要创建视图的数据库文件夹, 选中, 视图,
图标, 此时在右面的窗格中显示当前数据库的所有
视图 。
3,在右窗格中右键单击要查看的视图, 在弹出菜单
中选择, 属性, 菜单项, 打开, 视图属性, 对话框 。
4,在该对话框内可浏览到该视图的 SQL文本, 也可以
对该视图进行修改, 然后单击, 检查语法, 按钮来
对语句合法性进行检查 。 若要对视图的访问权限进
行设置, 请单击, 权限, 按钮 。
返回 819
方法 2,
1,启动 Enterprise Manager,登录到指定的服务器 。
2,打开要创建视图的数据库文件夹, 选中, 视图,
图标, 此时在右面的窗格中显示当前数据库的所有
视图 。
3,在右窗格中右键单击要查看的视图, 在弹出菜单
中选择, 设计视图, 菜单项, 即可进入到设计视图
的窗口 。
4,在该窗口中可按照创建新视图的方法对原有的视
图进行各种修改, 最后存盘即可 。
返回 820
7.14.2.2 使用存储过程检查视图
在 SQL SERVER 中有三个关键存储过程有助于了解视图信
息, 它们分别为,
1,sp_depends
2,sp_help
3,sp_helptext
? 存储过程 sp_depends 返回系统表中存储的任何信息,
该系统表指出该对象所依赖的对象 。 除视图外, 这个
系统过程可以在任何数据库对象上运行 。 其语法如下,
sp_depends 数据库对象名称
? 系统过程 sp_help 用来返回有关数据库对象的详细信
息, 如果不针对某一特定对象, 则返回数据库中所有
对象信息 。 其语法如下,
sp_help 数据库对象名称
? 系统过程 sp_helptext 检索出视图, 触发器, 存储过
程的文本其 。 语法为,
sp_helptext 视图或触发器或存储过程
返回 821
7.14.2.3 删除视图
除了可以使用第 3章中介绍的使用 SQL命令来删除
视图外, 在 SQL SERVER 中,通过 Enterprise
Manager 也可删除视图, 主要执行以下步骤,
1,启动 Enterprise Manager,登录到指定的服务器 。
2,打开要创建视图的数据库文件夹, 选中, 视图,
图标, 此时在右面的窗格中显示当前数据库的所有
视图 。
3,在右窗格中右键单击要查看的视图, 在弹出菜单
中选择, 删除, 菜单项 。
返回 822
小 结
? 本章主要讲述了利用 SQL Server 2000数据库管理系统
进行数据库管理的方法,本章内容可以说是前面几章
所讲述的理论内容的实践。
? 重点介绍了企业管理器和查询分析器的使用,对数据
库的各种管理功能都可以利用这两个工具完成;
? Transact-SQL是 SQL Server对原有标准 SQL的扩充,可
以帮助我们完成更为强大的数据库操作功能,尤其是
其在存储过程的设计、触发器的设计方面应用更为广
泛。
? 在 SQL Server下, 利用 Transact-SQL,企业管理器或
查询分析器可以完成各种数据库对象, 如:数据库,
数据表, 视图, 存储过程, 触发器, 约束, 默认的管
理 ( 包括创建, 修改, 查看, 删除等 ) 。