求王珊的自考数据库系统原理理

【图文】数据库原理第一章_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
数据库原理第一章
阅读已结束,下载本文到电脑
想免费下载本文?
登录百度文库,专享文档复制特权,积分每天免费拿!
你可能喜欢当前位置: >>
数据库原理讲稿
第一章【教学目的】绪论掌握数据库的作用及数据库、数据库管理系统、数据库系统相关概念 熟悉数据库管理技术的发展过程 掌握数据库体系结构:三级模式/两级映像 掌握数据库系统的组成 【教学手段】 【教学内容】 多媒体讲授数据库技术产生于六十年代末,是数据管理的最新技术,是计算机科学的重要分支 数据库技术是信息系统的核心和基础, 它的出现极大地促进了计算机应用向各行各业的渗透 数据库的建设规模、 数据库信息量的大小和使用频度已成为衡量一个国家信息化程度的重要 标志.1.1数据库系统概述1.1.1 数据库的地位 数据库技术产生于六十年代末,是数据管理的最新技术,是计算机科学的重要分支 数据库技术是信息系统的核心和基础,它的出现极大地促进了计算机应用向各行各业 的渗透。 数据库的建设规模、数据库信息量的大小和使用频度已成为衡量一个国家信息化程度的重 要标志。 从一般企业管理到计算机辅助设计与制造(CAD/CAM) 、计算机集成制造系统(CIMS) 、 办公信息系统(OIS) 、地理信息系统(GIS)等进行应用。1 1.1.2 四个基本概念 1.数据:数据(Data)是数据库中存储的基本对象 数据的定义:描述事物的符号记录 数据的种类:文字、图形、图象、声音 数据的特点:数据与其语义是不可分的 举例: ? 学生档案中的学生记录 (李明,男,1972,江苏,计算机系,1990) ? 数据的形式不能完全表达其内容 ? 数据的解释 ? 语义:学生姓名、性别、出生年月、籍贯、所在系别、入学时间 ? 解释:李明是个大学生,1972 年出生,江苏人,1990 年考入计算机系 2.数据库 (DB):数据库(Database,简称 DB)是长期储存在计算机内、有组织的、可共享 的大量数据集合。 ? 数据库的特征 ? ? ? ? ? 数据按一定的数据模型组织、描述和储存 可为各种用户共享 冗余度较小 数据独立性较高 易扩展3.数据库管理系统(DBMS) 数据库管理系统(Database Management System,简称 DBMS)是位于用户与操作系2 统之间的一层数据管理软件,用户利用 DBMS 可以创建和管理数据库。数据库管理系统功用图 ? 数据库管理系统(DBMS)的功能 ? 数据定义功能。 ? 数据操纵功能。 ? 数据的安全控制。 ? 并发控制。 ? 数据库的建立和维护功能。 4.数据库系统(DBS) 数据库系统(Database System,简称 DBS)是指在计算机系统中引入数据库后的系统构 成。 (在不引起混淆的情况下常常把数据库系统简称为数据库。 ) 构成:由数据库、数据库管理系统(及其开发工具) 、应用系统、数据库管理员(和用户) 构成。 ? DBS = DB + DBMS + APPLICATION + DBA +USER3 DBS 构成 数据库系统应用范例:图书管理信息系统数据库系统应用案例 5.数据、数据库、数据库管理系统、数据库系统四者关系图示1.1.3 数据管理的发展过程(三过程) 1、 手工管理阶段 ? 时期 ? 40 年代中--50 年代中 ? 产生的背景 ? 应用需求 ? 硬件水平 ? 软件水平 ? 处理方式 科学计算 无直接存取存储设备 没有操作系统 批处理4 ? 特点 ? 数据的管理者:应用程序,数据不保存。 ? 数据面向的对象:某一应用程序 ? 数据的共享程度:无共享、冗余度极大 ? 数据的独立性:不独立,完全依赖于程序 ? 数据的结构化:无结构 ? 数据控制能力:应用程序自己控制 2、文件管理系统 ? 时期 ? 50 年代末--60 年代中 ? 产生的背景 ? 应用需求 ? 硬件水平 ? 软件水平 ? 处理方式 ? 特点 ? 数据的管理者:文件系统,数据可长期保存 ? 数据面向的对象:某一应用程序 ? 数据的共享程度:共享性差、冗余度大 ? 数据的结构化:记录内有结构,整体无结构 ? 数据的独立性:独立性差,数据的逻辑结构改变必须修改应用程序 ? 数据控制能力:应用程序自己控制 科学计算、管理 磁盘、磁鼓 有文件系统 联机实时处理、批处理5 3、数据库系统 ? 时期 ? 60 年代末以来 ? 产生的背景 ? 应用背景 ? 硬件背景 ? 软件背景 ? 处理方式 ? 特点 ? 数据的管理者:DBMS ? 数据面向的对象:现实世界 ? 数据的共享程度:共享性高 ? 数据的独立性:高度的物理独立性和一定的 逻辑独立性 ? 数据的结构化:整体结构化 ? 数据控制能力:由 DBMS 统一管理和控制 1.2 数据模型 在数据库中用数据模型这个工具来抽象、 表示和处理现实世界中的数据和信息。 通俗地 讲数据模型就是现实世界的模拟。 ? 数据模型应满足三方面要求 ? 能比较真实地模拟现实世界 ? 容易为人所理解 大规模管理 大容量磁盘 有数据库管理系统 联机实时处理,分布处理,批处理6 ? 便于在计算机上实现 ? 数据模型分成两个不同的层次 (1) 概念层模型 也称信息模型,它是按用户的观点来对数据和信息建模。 主要包括网状模型、层次模型、关系模型等,它是按计算机系统 的观点对数据建模。 ? ? ? 客观对象的抽象过程---两步抽象 现实世界中的客观对象抽象为概念模型; 把概念模型转换为某一 DBMS 支持的数据模型。(2) 组织层数据模型1.2.1 概 念 模 型 ? 概念模型的用途 ? 概念模型用于信息世界的建模 ? 是现实世界到机器世界的一个中间层次 ? 是数据库设计的有力工具 ? 数据库设计人员和用户之间进行交流的语言 ? 对概念模型的基本要求 ? 较强的语义表达能力,能够方便、直接地表达应用中的各种语义知识 ? 简单、清晰、易于用户理解。 1.2.1,1 信息世界中的基本概念7 (1) 实体(Entity) 如:学生、教师、班级 客观存在并可相互区别的事物称为实体。 可以是具体的人、事、物或抽象的概念。 (2) 属性(Attribute) 如: 姓名、年龄 实体所具有的某一特性称为属性。 一个实体可以由若干个属性来刻画。 (3) 码(Key) 如: 学号唯一标识实体的属性或属性集称为码。 (4) 域(Domain) (如 性别的域为‘男’ ‘女’ , ) 属性的取值范围称为该属性的域。 (5) 实体型(Entity Type) 用实体名及其属性名集合来抽象和刻画 同类实体称为实体型(如:学生(学号,姓名,性别,出生年份)为一个实体型。 (6) 实体集(Entity Set) 同型实体的集合称为实体集,如全体学生就是一个实体集。 (7)联系(Relationship) 现实世界中事物内部以及事物之间的联系在信息世界中反映为实体内部的联系和实体之间 的联系。 实体型间联系 两个实体型 一对一联系(1:1)8 三个实体型 一个实体型 ? 一对一联系一对多联系(1:n) 多对多联系(m:n)? 如果对于实体集 A 中的每一个实体,实体集 B 中至多有一个实体与之联系, 反之亦然,则称实体集 A 与实体集 B 具有一对一联系。记为 1:1。 ? 实例 班级与班长之间的联系: 一个班级只有一个正班长 一个班长只在一个班中任职 ? 一对多联系 ? 如果对于实体集 A 中的每一个实体,实体集 B 中有 n 个实体(n≥0)与之联 系,反之,对于实体集 B 中的每一个实体,实体集 A 中至多只有一个实体 与之联系,则称实体集 A 与实体集 B 有一对多联系 记为 1:n ? 实例 班级与学生之间的联系: 一个班级中有若干名学生, 每个学生只在一个班级中学习 ? 多对多联系(m:n) ? 如果对于实体集 A 中的每一个实体,实体集 B 中有 n 个实体(n≥0)与之联系,反 之,对于实体集 B 中的每一个实体,实体集 A 中也有 m 个实体(m≥0)与之联系, 则称实体集 A 与实体 B 具有多对多联系。记为 m:n9 ? 实例 课程与学生之间的联系: 一门课程同时有若干个学生选修 一个学生可以同时选修多门课程 1.2.1.2 概念模型的表示方法 ? 实体-联系方法(E-R 方法) ? 用 E-R 图来描述现实世界的概念模型 ? E-R 方法也称为 E-R 模型 ? 实体 ? 用矩形表示,矩形框内写明实体名。 ? 属性 ? 用椭圆形表示,并用无向边将其与相应的实体连接起来 ? 联系 ? 联系本身:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体 连接起来,同时在无向边旁标上联系的类型(1:1、1:n 或 m:n) ? 联系的属性:联系本身也是一种实体型,也可以有属性。如果一个联系具有 属性,则这些属性也要用无向边与该联系连接起来 例 1-1:E-R 图实例: 某工厂物资管理 E-R 图,涉及的实体有: 仓库: 零件: 供应商: 仓库号、面积、电话号码 零件号、名称、规格、单价、描述 商号、姓名、地址、电话号码、帐号10 项目:项目号、预算、开工日期 职工:职工号、姓名、年龄、职称。 相互间的联系是: 1、一个仓库可以存放多种零件,一种零件可以存放在多个仓库中,因此仓库和零件具有 多对多的联系。用库存量来表示某种零件在某个仓库中的数量。 2、一个仓库有多个职工当仓库保管员,一个职工只能在一个仓库工作,因此仓库和职工 之间是一对多的联系。 3、职工之间具有领导-被领导关系。 4、供应商、项目和零件三者之间具有多对多的联系。即一个供应商可以供给若干项目多 种零件,每个项目可以使用不同供应商供应的零件,每种零件可由不同供应商供给,用供应 量来表示每次供应的数量。设计其物资管理 E-R 图如下:工厂物资管理 E-R 图 【思考与练习】 ? 根据以下信息建 E-R 图11 ? 学生,包括学号,姓名和性别 ? 教师,包括教师编号,姓名和年龄 ? 教材,包括书号,书名和价格 ? 课程,包括课程号和课程名 ? 教师可能教几门课程,使用相同或不同的教材。一门课程可能有多个任课教 师。 ? 教师可以带多个学生,一个学生也有多个教师 ? 学生分成组,小组内一个组长指导多个组员 ? 学生可选修几门课程,每门课程都会有成绩。一门课程有许多学生选修 1.2.3 组织层数据模型 组织层数据模型,是从数据库系统中,数据的组织方式角度来描述信息。1.2.3.1 应用于数据库的三类组织层数据模型 层次模型 / 层次数据库 网状模型 / 网状数据库 关系模型 / 关系数据库 1.2.3.2 组织层数据模型的三要素12 ? 数据结构 ? 数据操作 ? 数据的约束条件 1.3 关 系 模 型 ? 最重要的一种数据模型。也是目前主要采用的数据模型 ? 1970 年由美国 IBM 公司 San Jose 研究室的研究员 E.F.Codd 提出 1.3.1 关系数据模型的数据结构 在用户观点下,关系模型中数据的逻辑结构是一张二维表,它由行和列组成。学生登记表学 号 姓 名 年 龄 性 女 男 女 别 系 名 年 级
95008 王小明 黄大鹏 张文斌 19 20 18 社会学 商品学 法律学 95 95 95 ………………1.3.2 关系模型的基本概念 ? 关系(Relation) 一个关系对应通常说的一张表。 ? 元组(Tuple) 表中的一行即为一个元组。 ? 属性(Attribute) 表中的一列即为一个属性,给每一个属性起一个名称即属性名。 ? 码(Key) 表中的某一个属性或属性组,它可以唯一确定一个元组。13 ? 域(Domain) 属性的取值范围。 ? 分量 元组中的一个属性值。 ? 关系模式 对关系的描述 关系名(属性 1,属性 2,…,属性 n) 例如:学生(学号,姓名,年龄,性别,系,年级) 1.3.3 概念模型向组织层模型的转换设计 ? 实体及实体间的联系的表示方法 ? 实体型:直接用关系模式(表)表示。 ? 属性:用属性名表示。 ? 一对一联系:隐含在实体对应的关系中。 ? 一对多联系:隐含在实体对应的关系中。 ? 多对多联系:直接用关系表示。 例 1 学生、系、系与学生之间的一对多联系: 学生(学号,姓名,年龄,性别,系号,年级) 系 (系号,系名,系主任,办公地点) 例 2 系、系主任、系与系主任间的一对一联系 系 (系号,系名,系主任,办公地点) 系主任(系主任姓名,职称,联系方式) 例 3 学生、课程、学生与课程之间的多对多联系:14 学生(学号,姓名,年龄,性别,系号,年级) 课程(课程号,课程名,学分) 选修(学号,课程号,成绩) ? 关系必须是规范化的,满足一定的规范条件 最基本的规范条件:关系的每一个分量必须是一个不可分的数据项。 1.3.4.关系模型的数据操作(纵) ? 查询、插入、删除、修改 ? 数据操作是集合操作,操作对象和操作结果都是关系,即若干元组的集合 1.3.5 关系模型的完整性约束 ? 数据完整性是指数据库中存在的数据是有意义的或正确的。完整性规则是对关系的 某种约束条件。 ? 实体完整性 ? 参照完整性 ? 用户定义的完整性 1.3.6 典型的关系数据库系统 ? ORACLE (SUN) ? SYBASE ? INFORMIX ? DB/2 ? COBASE ? PBASE ? EasyBase (IBM)15 ? DM/2 ? OpenBase ? SQL SERVER (MS)? ACCESS ? VISUAL FOXPRO 1.4 数据库系统的体系结构 1.4.1 数据库系统的三级模式结构 三级模式结构:外模式(子模式) 、模式模式(逻辑模式)和内模式 。 ? 内模式是整个数据库实际存储的表示 ? 模式是整个数据库实际存储的抽象表示 ? 外模式是概念模式的某一部分的抽象表示用户 11用户 12用户 21用户 22用户 n1 …用户 ni外部模式 1外部模式 2… 外部模式 n 外部模式/概念模式映 像 概念模式/内部模式映 像概念模式内部模式DBDBMS 在三级模式之间提供了二级映象功能,保证了数据库系统中的数据能够具有较16 高的逻辑独立性与物理独立性。【本章小结】①数据库系统是指在计算机系统中引进数据库和数据库管理系统后组成的系统, 一般由数据 库、计算机硬件、计算机软件、数据库系统相关人员 4 部分组成。 ②数据模型是数据库系统的核心和基础, 本章介绍了数据模型的三要素、 概念模型的相关知 识以及 4 种主要的数据模型:层次模型、网状模型、关系模型和面向对象模型,其中关 系模型是当今的主流模型。 ③概念模型的表示方法是 E-R 模型,实体、属性、联系是 E-R 模型中的重要概念。 ④关于数据库系统的体系结构,主要介绍了外模式、模式、内模式这三级模式,外模式/模 式、模式/内模式二级映射保证了数据库系统的逻辑独立性和物理独立性。【课后作业】 1. 数据与信息的概念 2. 数据库、数据管理系统、数据库系统的概念 3.数据库的结构体系【参考书目】1.《数据库系统概论》 2. 《数据库原理与应用》清华大学出版社 高教出版社萨师煊 王珊 主编 施伯乐、丁宝康主编 赵增敏 、朱粹丹编著3.《sql server 2000 实用教程》 电子工业出版社17 4.《数据库系统原理教程》清华大学出版社王珊 、陈红 编著18 第二章【教学目的】关系数据库掌握关系模型的基本概念 掌握关系代数运算【教学手段】 【教学内容】多媒体讲授关系数据模型由 IBM 的研究员 E.F.Codd 博士于 1970 年首先提出,该模型有严格的数 学理论基础,抽象级别比较高,而且数据结构简单清晰,便于理解和使用。 关系数据库是建立在关系数据模型基础上的,它借助于集合代数来处理数据库中的数 据;目前广泛使用并大受欢迎的关系数据库管理系统软件,如 Oracle、Access、DB2、SQL Server、Sybase 等也都建立在关系数据模型基础之上。 2.1 关系模型的基本概念 2.1.1 关系模型的基本术语 ? 关系 关系是一个属性数目相同的元组的集合(即一个关系就是一张二维表,每个关系都有一 个关系名 ) 。姓 李思 李思 姜姗 ? 关系的实例名性 男 女 男别19 给定关系中元组的集合称为该关系的实例 。 ? 属性 二维表中垂直方向的列称为属性。 ? 元组 元组是用来标识实体集中的一个实体,二维表中水平方向的行(除了关系的标题栏 外)称为元组。 ? 元数和基数 关系中属性的个数称为元数,元组的个数称为基数。 ? 分量 元组中的每一个属性值,称为该元组的分量。?2.1.2 关系模型的定义形式 ? 域 ? ? 域是一组具有相同数据类型值的集合,又称为值域。 域中数据的个数称为域的基数。例 2-1:D1={A,B,C,D}。20 D1 为域名,基数为 4。 例 2-2:D={“数据结构”,“操作系统”,“数据库原理”}是课程表 C 中“课程名称”属性的取值 范围,即“课程名称”属性域。 ? 笛卡儿积 给定一组域{D1,D2,…,Dn}(n 表示域的个数) ,则 D1,D2,…,Dn 的笛卡儿积如下: D1×D2×…×Dn={(d1,d2,…,dn)|di∈Di,i=1,2,…,n} 每一个元素 d1, 2, ( d …, n) d 中的每一个值 di 叫做一个分量 ,di∈Di 每一个元素 d1, (d2,…,dn)叫做一个 n 元组,简称元组。Di(i=1,2,…,n)为有限集,Di 的基数用 mi(i=1,2,…,n 表示,则笛卡儿积 D1×D2×…×Dn 的 基数 M 为所有域的基数的累乘之积,即M ?? mii ?1n? 关系 ? 笛卡儿积 D=D1×D2×…×Dn 的任一子集称为定义在域 D1,D2,…,Dn 上的 n 元关系(简称关系) ,记为 R 。可记作: R={&t1,t2,…,tn&|&t1,t2,…,tn&∈D′?D} 其中: (1)子集 D′中的任一元素&t1,t2,…,tn&称为 R 的一个元组。 (2)R 表示关系的名字,n 称为关系的目或度。n 目关系必有 n 个属性。 当 n=1 时,称为单元(目)关系。 当 n=2 时,称为二元(目)关系。 …… 当 n=n 时,称为 n 元关系。21 关系是笛卡儿积的子集,所以关系是一个二维表。 例 2-4:例 2-3 中笛卡儿积的子集,即所有学历为“研究生”的教师构成的集合形成的二 维表,称为 D1×D2×…×Dn 的一个关系。教师 教师男 女研究生 研究生? 关系模式 ? 关系模式可以形式化地表示为:R(U,D,dom,F)R 为关系名; U 为组成该关系的属性名集合; D 为属性组 U 中属性的域; dom 为属性向域的映像集合; F 为属性间的数据依赖的集合。关系模式是对关系的描述,关系是关系模式在某一时刻的状态或内容。 关系模式是静态的、稳定的,而关系是动态的、随时间不断变化的,因为关系操作在不 断地更新着数据库表中的数据。 例 2-5:“选课关系”SC 的关系模式可描述为:SC(Sno,Cno,Score) 。 其中: ? ? 加下划线表示所有属性为关系中的主关系键, D(Sno) 、dom(Sno) :可定义为长度为 6 个字符的字符串;22 ? ? ?D(Cno) 、dom(Cno) :可定义为长度为 6 个字符的字符串; D(Score) 、dom(Score) :可定义为 0~100 的整型数; F: (Sno,Cno)Score,即成绩完全函数依赖于学号和课程号,属性间数据 依赖将在第 4 章中讨论。 关系模式是关系的框架,是对关系结构的描述。2.1.3 关系的性质 ? 关系中不允许出现相同的元组 。 ? 关系中元组的顺序(即行序)可以任意。 ? 关系中属性无序,即列的顺序可以任意交换。 ? 同一属性名下的各个属性值必须来自同一个域,是同一类型的数据。 ? 关系中各个属性必须有不同的名字,而不同的属性可来自同一个域。 ? 关系不允许在表中嵌套表。 2.1.4 关系的键 ? 候选键 “学生关系”中的学号能惟一标识每一个学生 “选课关系”中,只有属性的组合“学号+课程号”才能惟一的区分每一条选课记录 能惟一标识关系中元组的一个属性或属性集,称为候选键(Candidate Key) ? 主关系键 从多个候选键中选择一个作为查询、插入或删除元组的操作变量,被选用的候选键称为 主 关系键。 每个关系必定有且仅有一个主关系键. ? 主关系键具有特性:唯一性、非空性23 主属性:包含在主关系键中的各个属性称为主属性。 非码属性:未包含在任何一个候选关键字中的属性称为非码属性。 全码 :所有属性的组合是关系的候选键。 例 2-6 :假设有教师授课关系 TCS,分别有 3 个属性:教师号(Tno) 、课程号(Cno)和 学生学号(Sno) 。一个教师可以讲授多门课程,一门课程可以由多个教师讲授;同样,一 个学生可以选修多门课程,一门课程可以被多个学生选修。 在这种情况下,Tno、Cno、Sno 三者之间是多对多关系,则属性集(Tno,Cno,Sno) 是关系 TCS 的全码,Tno、Cno、Sno 都是主属性。 ? 外部关系键被参照关系的主码和参照关系的外码必须定义在同一个域上。 2.1.5 关系模型的完整性?实体完整性 主关系键的值不能为空或部分为空例 2-7: 设有学生、课程和选课 3 个关系,关系和选定主码如下: (1)学生(学号,姓名,性别,年龄,籍贯,专业号) ,主关系键为学号。 (2)课程(课程号,课程名,课时,开课学期,课程性质) ,主关系键为课程号。24 (3)选课(学号,课程号,成绩) ,主关系键为(学号,课程号) 。 学生关系中,学号的值不能为空; 选课关系中,主关系键为(学号,课程号) ,所以学号和课程号的值不能同时为空,也 不能部分为空。 ? 参照完整性 若属性(或属性集)F 是参照关系 R 的外部关系键,它与被参照关系 S 的主关系键 K 相对应,则对于 R 中的每个元组在 F 上的值必须取空值或者等于 S 中某个元组的主关键字 值。 参照完整性规则用来定义外部关系键与主关系键之间的引用规则,该规则的实质是不允 许引用不存在的实体。 例 2-8: 学生关系和部门关系如下所示,其中主关系键用下划线表示。 学生(学号,姓名,性别,年龄,籍贯,部门号) 部门(部门号,部门名称) 学生关系引用了部门关系的主关系键部门号。学生关系中的某个属性的取值需要参照 部门关系的属性取值。学生关系中每个元组的部门号属性只能取下面两类值: (1)空值,表示该学生尚未安排部门。 (2)非空值,该值必须是部门关系中某个元组的部门号值,表示学生不可能分配到一个不 存在的部门中。即被参照的部门关系中一定存在一个元组,其主关系键值等于参照关系(学 生关系)中的外部关系键值。 ? 用户自定义完整性25 ? ?针对某一具体关系数据库的约束条件 反映某一具体应用所涉及的数据必须满足的语义要求。例如,学生关系 S 中,Sn 不能为空,选课关系 SC 中定义 Score 在 0~100 之间。 2.2 关系代数? ? ?关系代数是一种抽象的查询语言 关系代数的运算对象与运算结果都是关系 关系代数运算符关系代数的运算按运算符的不同主要分为两类: ? 传统的集合运算: ? 把关系看成元组的集合,以元组作为集合中元素来进行运算,其运算是从关 系的“水平”方向即行的角度进行的。 ? 包括并、差、交和笛卡尔积等运算。? 专门的关系运算: ? 不仅涉及行运算,也涉及列运算,这种运算是为数据库的应用而引进的特殊 运算。 ? 包括选取、投影、连接和除法等运算。26 2.2.1 传统的集合运算 ? 并 ? 设有两个相容可并的关系 R 与 S,则二者的并由属于 R 或 S 的元组组成, 其结果与 R 或 S 仍是相容可并的。可记作:R∪S={t|t∈R∨t∈S}。 ? 差 ? 设有两关系 R 与 S, 则关系 R 与关系 S 的差是由属于 R 而不属于 S 的元组 组成的一个新关系。可记作:R?S={t|t∈R∧t?S}。 ? 交 ? 两个 R 和 S 的交,是由既属于 R 又属于 S 的所有元组组成的一个新关系, 可记作:R∩S={t|t∈R∧t∈S}。? 乘积 ? 两个分别为 m 目和 n 目的关系 R 和 S 的广义笛卡儿积是一个(m+n)列的 元组的集合。 ? 若 R 有 k1 个元组,S 有 k2 个元组,则关系 R 和关系 S 的广义笛卡儿积有27 k1×k2 个元组。可记作:R×S={t|t=&tm,tn&∧tm∈R∧tn∈S}2.2.2 专门的关系运算 专门的关系运算可同时从行和列的角度进行关系运算, 这种运算是为数据库的应用而引进的 特殊运算。 ? 选择 选择又称为限制,是一个单目运算符,即对一个关系进行运算。 ?F(R)={t | t∈R∧F(t)='True} 例 2-15:查询年龄在 18 到 20 岁江苏籍的所有女生。 σBP= '江苏'∧ age&=18∧age&=20∧SEX= '女'(S) ? 投影 投影运算是从关系 R 中选择指定属性列组成新的关系。可记作:ПA(R)={t[A]|t∈R}。 例 2-16:查询学生的姓名和籍贯(即求学生关系 S 在 Sn 和 BP 两个属性上的投影) 。 ПSn,BP(S)或П1,6(S) 例 2-17: 查询教师表中所有教师的姓名。 表示为:ПTn (T)或П2 (T)28 例 2-18: 查询教师表中所有男教师的姓名和职称。 表示为:ПTn,prof (σSex= '男'(T)) 例 2-19: 查询授课表中的所有课程号。 表示为:ПCno (SC) 投影结果如图 2-8 所示。 Cno 102 ? 连接 ? 连接运算(连接也称为θ连接 )是从两个关系的笛卡儿积中选取满足连接条 件的元组。可记作: R∞S={tr⌒ts|tr∈R∧tr∈S∧tr[A]θts[B]} ? 自然连接 ? 自然连接是一种特殊的等值连接,它是在广义笛卡儿积 R×S 中选取同名属 性中符合相等条件的元组,再进行投影,删除重复的同名属性,组成新的关 系。 ? 等值连接与自然连接的区别和联系 ? ? 自然连接是一种特殊的等值连接。 等值连接中不要求相等属性值的属性名相同, 而自然连接要求相等属性值的 属性名必须相同,即两关系只有在同名属性才能进行自然连接。 ? ? 除法 等值连接不去掉重复属性,而自然连接去掉重复属性。29 R÷S = {tr[X] | tr∈R∧Πy(S)?Yx}除法运算同时从行和列的角度进行运算,适合于包含“全部”之类的短语的查询。2.2.3 关系代数运算的应用举例【例 2-22】 查询年龄在 20 岁以下的女学生。 关系表达式为:σSex= '女'∧Age&20(S)。【例 2-23】 查询成绩及格的学生的学号。 关系表达式为:ПSno(σScore&=60(SC))。 【例 2-24】 查询学生“ 姜珊” 所属的部门号。 关系表达式为:ПDno(σSn= '姜珊'(S))。 【例 2-25】 查询河南籍年龄为 18~20 岁的学生姓名。 关系表达式为:ПSn(σDP= '河南'∧Age&=18∧ Age&=20(S))。【例 2-26】 查询课程号为“ 150101” 且成绩高于 80 分的所有学生的姓名。 关系表达式为:ПSn(σCno= ';∧ 或 ПSn(σCno= ';∧Score&80(SC) Score&80(SC)S)。ПSno,Sn(S))。30 【本章小结】 1.关系模型中常用关系操作,关系的操作可以使用关系代数和关系演算进行 。 2.关系代数:传统的集合运算:并、交、差、广义笛卡尔乘积 专门的关系运算:选择、投影、连接 【课后习题】 P59 课后习题一、二、三、四【参考书目】1.《数据库原理与应用教程》 2. 《数据库原理与应用》机械工业出版社 高教出版社何玉洁 主编 施伯乐、丁宝康主编 赵增敏 、朱粹丹编著 王珊 、陈红 编著3.《sql server 2000 实用教程》 电子工业出版社 4.《数据库系统原理教程》 清华大学出版社31 第三讲关系数据库标准语言 SQL【教学目的】 了解 SQL 语言发展史 熟悉关系数据库标准语言 SQL 的主要功能 掌握关系数据库数据定义语言(DDL) 掌握数据库、表、视图、索引、存储过程等的定义及使用 掌握数据库的查询语言(DQL) 掌握关系数据库数据操作语言(DML) 掌握关系数据库数据控制语言(DCL) 【教学手段】 【教学内容】 多媒体讲授结构化查询语言(Structured Query Language,SQL)是一种介于关系代数与关系演 算之间的语言,其功能包括查询、操纵、定义和控制 4 个方面,目前已成为关系数据库的 标准语言。SQL 语言简洁、方便、功能齐全,是目前应用最广的关系数据库语言之一。 3.1 SQL 概述 3.1.1 SQL 语言的发展简史 ? SQL 语言 1974 年被提出,并首先在 IBM 公司研制的 RDB 原型系统 System R 上 实现。 ? 1986 年 10 月,美国国家标准局(ANSI)的 DB 委员会批准 SQL 作为 RDB 语言的美 国标准。同年公布了标准 SQL 文本。 ? 1987 年 6 月,国际标准化组织(ISO)将其采纳为国际标准(称“SQL86”)。 ? 此后出现了“SQL89” “SQL2”(1992)和“SQL3”(1993)。 、32 3.1.2 SQL 语言的主要特点 一体化:数据定义语言 DDL、数据操纵语言 DML、数据控制语言 DCL 高度非过程化 统一的语法结构:自含式语言、嵌入式语言 语言简捷,易学易用:Select、create、drop、 alter、 insert、update、delete、grant、revoke 3.1.3 SQL 语言的主要功能 SQL 语言具有数据查询、数据定义、数据操纵和数据控制四种功能。 (1)数据定义语句(Data Definition Language,DDL) :用于定义关系数据库的模式、外 模式和内模式,以实现对数据库基本表、视图以及索引文件的定义、修改和删除等操作。 (2)数据操纵语句(Data Manipulation Language,DML) :用于完成对数据库表数据的查 询和更新操作。其中,数据更新指对数据进行插入、删除和修改操作。 (3)数据控制语句(Data Control Language,DCL) :用于控制对数据库的访问及服务器 的关闭、启动等操作。最常用的语句有 GRANT、REVOKE 等。 (4) 数据查询 3.1.4 SQL 对关系数据库模式的支持 3.2.1 SQL 的数据类型 1.整数数值类型 (1)INT 每个 INT 类型的数据按 4 个字节存储,其中 1 位表示整数值的正负号,其他 31 位表示 整数值的长度和大小,表示范围为?231~231。 (2)SMALLINT。 每个 SMALLINT 类型的数据占用 2 个字节的存储空间, 其中 1 位表示整数值的正负号,33 其他 15 位表示整数值的长度和大小,表示范围为?215~215。 (3)TINYINT。 每个 TINYINT 类型的数据占用 1 个字节的存储空间,表示范围为 0~255。 (4)BIGINT。 每个 BIGINT 类型的数据占用 8 个字节的存储空间,表示范围为?263~263。 (5)BIT。 BIT 为可以取值为 1、0 或 NULL 的整数数据类型。字符串值 TRUE 和 FALSE 可以转 换为以下 BIT 值:TRUE 转换为 1,FALSE 转换为 0。 2.精确数值类型 DECIMAL[(p[,s)]]和 NUMERIC[(p[,s])]都是固定精度和小数位数(定点数)的数据 类型,使用最大精度时,有效值范围为?1038+1 到 1038?1。NUMERIC 在功能上等价于 DECIMAL。p(精度)是最多可以存储的十进制数字的总位数,包括小数点左边和右边的位 数。该精度必须是从 1 到最大精度 38 之间的值,默认为 18;s(小数位数)是小数点右边 可以存储的十进制数字的最大位数,必须是 0~p 之间的值,仅在指定精度后才可以指定, 默认值为 0。 3.近似浮点数据类型 浮点数据类型用于存储十进制小数。浮点数值的数据在 SQL 中采用上舍入(Round Up)方式进行存储。所谓上舍入是指当(且仅当)要舍入的数是一个非零数时,对其保留 数字部分的最低有效位上的数值加 1,并进行必要的进位。若一个数是上舍入数,其绝对值 不会减少。 (1)REAL (2)FLOAT34 4.货币数据类型 (1) MONEY。MONEY 型数据可以存储?922 337 203 685 477.7 203 685 477.5807 之间的数。 (2)SMALLMONEY。 SMALLMONEY 只能存储?214 748.8.3647 之间的数。 5.日期时间类型 (1)DATETIME。 DATETIME 用两个 4 字节的整数存储。 (2)SMALLDATETIME。 SMALLDATETIME 数据类型的精确度低于 DATETIME,用两个 2 字节的整数存储。 6.字符串类型 字符数据类型是使用最多的数据类型之一,它可以用来存储各种字母、数字符号、特 殊符号。 (1)CHAR (2)NCHAR (3)VARCHAR (4)NVARCHAR 7.二进制数据类型 (1)BINARY (2)VARBINARY。 (3)IMAGE 3.2.2 基本表的定义和维护35 (1)语句格式约定符号 尖括号“& &“中的内容为实际语句; 方括号“[ ]”中的内容为任选项; 大括号“{ }”或分隔符“|”中的内容为必选其中的一项; [,…n]表示前面的项可重复多次。 (2)一般语法规定 SQL 中的数据项分隔符为“,” 其字符串常数的定界符用单引号“'”表示。 , (3)SQL 特殊语法规定 SQL 的关键词一般使用大写字母表示;语句的结束符为“;” 。 1.定义基本表 CREATE TABLE &表名& (&列名& &数据类型& [列级完整性约束条件] [,&表级完整性约束条件&]) 完整性约束的基本语法格式 [CONSTRAINT &约束名& ] &约束类型& 2.完整性约束条件 (1)NULL|NOT NULL 约束 [CONSTRAINT &约束名& ][NULL|NOT NULL] NULL 表示“不知道”、“不确定”或“没有数据”的意思、主键列不允许出现空值 (2) UNIQUE 约束(惟一约束) 指明基本表在某一列或多个列的组合上的取值必须惟一 (3)PRIMARY KEY 约束(主键约束)36 用于定义基本表的主键,起惟一标识作用 PRIMARY KEY 与 UNIQUE 的区别: 一个基本表中只能有一个 PRIMARY KEY,但可多个 UNIQUE 对于指定为 PRIMARY KEY 的一个列或多个列的组合,其中任何一个列都不能出现 NULL 值,而对于 UNIQUE 所约束的惟一键,则允许为 NULL 对于指定为 PRIMARY KEY 的一个列或多个列的组合,其中任何一个列都不能出现 NULL 值,而对于 UNIQUE 所约束的惟一键,则允许为 NULL PRIMARY KEY 用于定义列约束 CONSTRAINT &约束名& PRIMARY KEY PRIMARY KEY 用于定义表约束 [CONSTRAINT &约束名&] PRIMARY KEY (&列名&[{,&列名&}]) (4) CHECK 约束 CHECK 约束用来检查字段值所允许的范围 在建立 CHECK 约束时,需要考虑以下几个因素: 一个表中可以定义多个 CHECK 约束。 每个字段只能定义一个 CHECK 约束。 在多个字段上定义的 CHECK 约束必须为表约束。 当执行 INSERT、UNDATE 语句时 CHECK 约束将验证数据。 [CONSTRAINT &约束名&] CHECK (&条件&) (5)FOREIGN KEY 约束(外键约束) [CONSTRAINT&约束名&] FOREIGN KEY REFERENCES &主表名& (&列名&[{,&列名&}])37 【例 3-1】 创建部门表 D,由部门号(Dno)和部门(Dept)两个属性组成。 CREATE TABLE D (Dno CHAR(10),Dept CHAR(15)); 【例 3-2】建立一个课程表 C,由课程号(Cno) 、课程名(Cn) 、课时数(Ct) 、开课学期 (Term) 、课程性质(Cx)和课程先行课(Cpno)组成,其中课程号不能为空。 CREATE TABLE C (Cno CHAR(8) CONSTRAINT cno_cons NOT NULL, Cn CHAR(20), Ct INT DEFAULT 64, Term CHAR(20) NULL, Cx CHAR(20), Cpno CHAR(8)); 【例 3-3】 建立选课表 SC,由学号(Sno) 、课程号(Cno)和成绩(Score)组成。一个 学生某一门课程的成绩应该是唯一的,即 Sno+Cno 为唯一键。 CREATE TABLE SC (Sno CHAR(8) NOT NULL, Cno CHAR(8) NOT NULL, Score FLOAT(1), UNIQUE (Sno,Cno)); 【例 3-4】 创建部门表 D,由部门号(Dno) 、部门(Dept)两个属性组成,其中部门号为 主关键字,部门名称为唯一键。 CREATE TABLE D38 (Dno CHAR(10) PRIMARY KEY, Dept CHAR(15) UNIQUE); 【例 3-5】 创建学生表 S,由学号(Sno) 、姓名(Sn) 、性别(Sex) 、年龄(Age) 、籍贯 (BP)和部门号(Dno)6 个属性组成,其中学号为主关系键,部门号(Dno)为部门表 D 的外部关系键。 CREATE TABLE S (Sno CHAR(10) PRIMARY KEY, Sn CHAR(12), Sex CHAR(4), Age INT, BP CHAR(20), Dno CHAR(10), FOREIGN KEY (Dno) REFERENCES D(Dno) ); 【例 3-6】 创建教师表 T,由工号(Tno) 、姓名(Tn) 、性别(Sex) 、年龄(Age) 、职称 (Prof)和部门号(Dno)6 个属性组成,其中工号为主关系键,部门号(Dno)为部门表 D 的外部关系键,年龄为空或取 0~120 之间的整数。 CREATE TABLE T (Tno CHAR(10) PRIMARY KEY, Tn CHAR(12), Sex CHAR(4), Age INT, Prof CHAR(20), Dno CHAR(10),39 FOREIGN KEY (Dno) REFERENCES D(Dno), CHECK ((Age IS NULL) OR (Age BETWEEN 0 AND 120))); 3.修改基本表 SQL 语言用 ALTER TABLE 语句修改表的结构,其语法格式如下: ALTER TABLE &表名& [ADD &新列名& &数据类型&[完整性约束&]] [DROP &完整性约束名&] [MODIFY &列名& &数据类型&]; 其中: (1)ADD 子句用于添加新字段或新的完整性约束条件。 (2)DROP 子句用于删除已存在的完整性约束条件。 (3)MODIFY 子句用于修改属性的数据类型。 注意:不论基本表中是否有数据,新增的列一律为空。 【例 3-7】 向学生表 S 中增加出生日期属性(BD) ,其数据类型为日期型。 ALTER TABLE S ADD BD DATE; 【例 3-8】 删除 S 表中 Sno 列必须取唯一值的约束。 ALTER TABLE S DROP UNIQUE(Sno); 【例 3-9】 将学生表 S 中的 Age 属性列的数据类型 改为 SMALLINT。 ALTER TABLE S MODIFY Age SMALLINT; 4.删除基本表 SQL 语言用 DROP TABLE 语句删除表,其语法格式如下: DROP TABLE &表名&40 【例 3-10】 删除学生表 S。 DROP TABLE S; 3.2.3 索引的定义和维护 ? 索引的作用:提高查询速度 ? 1.索引的分类 聚集索引与非聚集索引 聚集索引:排列的结果存储在表中只有一个 非聚集索引:排列的结果不存储在表中可以有多个 唯一索引 :有 UNIQUE,自动建立非聚集的惟一索引有 PRIMARY KEY,自动建立聚集索 引 复合索引:将两个或多个字段组合起来建立的索引,单独的字段允许有重复的值 2.建立索引 CREATE [UNIQUE] [CLUSTERED] INDEX &索引名& ON &表名& (&列名& [次序] [{,&列名&}] [次序]…) 【例 3-11】在学生表 S 的姓名(Sn)列上建立一个聚集索引 Studentname,且表 S 中的记 录按照 Sn 值 的升序存放。 CREATE CLUSTERED INDEX Studentname ON S(sn ASC); 【例 3-12】 为表 SC 在 Sno 和 Cno 上建立一个唯一索引 SCI。 CREATE UNIQUE INDEX SCI ON SC(sno,cno); 3.删除索引 DROP INDEX 数据表名.索引名 【例 3-13】 删除表 S 中的 Studentname 索引。41 DROP INDEX S 3.3 SQL 数据查询 ? SELECT 命令的格式与基本使用 SELECT [ALL|DISTINCT][TOP N [PERCENT][WITH TIES]] 〈列名〉[AS 别名 1] [{, 〈列名〉[ AS 别名 2]}] [INTO 新表名] FROM 〈表名 1 或视图名 1〉 [[AS] 表 1 别名] [{, 〈表名 2 或视图名 2〉 [[AS] 表 2 别名]}] [WHERE〈检索条件〉] [GROUP BY &列名 1&[HAVING &条件表达式&]] [ORDER BY &列名 2&[ASC|DESC]] 3.3.1 单表查询 1.选择表中的若干列 选择列即为关系代数中的投影操作,得到的目标列为表中的部分或全部列。 (1)选择列。 【例 3-14】 查询全体学生的学号与姓名。 SELECT Sno,Sn FROM S; 【例 3-15】 查询全体学生的所有字段信息 SELECT * FROM S; 等价于: SELECT Sno,Sn,Sex,Age,BP,Dno FROM S (2)用 DISTINCT 删除重复的行。42 【例 3-16】 查询选课表 SC 中无重复的学号。 SELECT DISTINCT Sno FROM SC; (3)修改查询结果中的列标题 字段名|表达式|函数名 AS 别名 【例 3-17】 查询全体学生的姓名、出生年份、籍贯,要求用中文表示所有属性。 SELECT Sn AS 姓名, 2010?Age AS 出生年份,BP AS 籍贯 FROM S; 2.选择表中的若干行 表中查询满足条件的行可通过 WHERE 子句来实现。 运算符 =、&、&、&=、&=、!=、&& BETWEEN…AND… 含 义比较大小 确定范围 多重条件。也可以把 AND、ORAND、OR、NOT和 NOT 结合起来,使用圆括号来 组成复杂的表达式IN|NOT IN确定集合 字符匹配。Like 是用于查找与指 定字符串相匹配的字符串,可使 用通配符%与_,一个_只代表 1LIKE|NOT LIKE 个字符,一个%可代表多个字符。 注意:只允许在 Like 子句中使用 通配符43 IS NULL空值(1)表达式比较 【例 3-18】 查询性别为“女”的学生的学号与姓名。 SELECT Cno,Cn FROM WHERE Sex= '女'; 【例 3-19】 查询年龄在 20 岁以下的学生的情况。 SELECT * FROM S WHERE age&20; (2)确定范围 BETWEEN…AND…和 NOT BETWEEN…AND…用来确定查询范围,意指“在…和… 之间”或“不在…和…之间”的数据。 【例 3-20】 查询年龄在 18~20 之间的学生的情况。 SELECT * FROM S WHERE Age BETWEEN 18 AND 20; (3)多重条件查询。 使用逻辑运算符 AND、OR 和 NOT,其优先级由高到低为 NOT、AND、OR,但用户可 以使用括号改变优先级。 【例 3-21】 查询年龄在 18~20 之间的女生的情况。 SELECT * FROM S WHERE (Age BETWEEN 18 AND 20) (4)确定集合。 IN|NOT IN 运算符用于查找列值属于指定集合的元组。 【例 3-22】 查询选修了课程号为“150101”或“150102”的学生的学号、课程号和成绩。 SELECT Sno, Cno, Score FROM SC AND Sex= '女';44 WHERE Cno IN(';, ';); 等价于: SELECT Sno, Cno, Score FROM SC WHERE Cno= '; OR Cno= ';; (5)字符串匹配 当不知道完全精确的值时,用户可以使用 LIKE 或 NOT LIKE 进行部分匹配查询(也称模糊 查询) &属性名& LIKE &字符串常量& 通配符 功能 实例 ab%, ab 后可接任意 % 代表 0 个或多个字符 字符串 a_b, a 与 b 之间可有 1 _(下划线) 代表 1 个字符 个字符 [0~9]: 0~9 之间的字 [] 表示在某一范围的字符 符 [^0~9]:不在 0~9 之 [^] 表示不在某一范围的字符 间的字符 【例 3-23】 查询所有姓“张”的教师的教师号和姓名 SECLECT Tno, Tn (6)涉及空值查询。 某个字段没有值称之为具有空值(NULL) 空值不同于零和空格,它不占任何存储空间 FROM T WHERE Tn LIKE '张%';45 【例 3-24】 查询没有考试成绩的学生的学号和相应的课程号。 SELECT Sno, Cno FRON SC WHERE Score IS NULL;注意:这里的空值条件为 Score IS NULL,不能写成 Score=NULL 3.对查询结果进行排序 使用 ORDER BY 子句即可实现 【例 3-26】 查询所有教师的姓名、性别、年龄、职称,并按照年龄降序排列,年龄相同的 按照职称降序排列 SELECT Tn, Sex,Age,Prof FROM T ORDER BY Age DESC, Prof DESC; 4.使用库函数及统计汇总查询 函 数 名 COUNT([DISTINCT|ALL] *) COUNT([DISTINCT|ALL] &列名&) SUM([DISTINCT|ALL] &列名&) 功 能统计元组数量 统计一列中值的数量 计算一列值的总和(此列必须是数值型) 计算一列值的平均值(此列必须是数值MAX([DISTINCT|ALL] &列名&) 型) AVG([DISTINCT|ALL] &列名&) MIN([DISTINCT|ALL] &列名&) 求一列值中的最大值 求一列值中的最小值【例 3-27】 求学号为“100101”的学生的总分和平均分 SELECT SUM(Score) AS TOTAL, AVG(Score) AS AVG WHERE (Sno= ';); 【例 3-28】 求信电学院学生的总数 SELECT COUNT (Sno) FROM S WHERE DEPT= '信电';46FROM SC 或 SELECT COUNT (*) FROM S WHERE DEPT= '信电';注意:二者的区别是,COUNT(*)统计的是行数,而 COUNT(Sno)统计的是 Sno 具有值(非 空)的行数。本例中 Sno 是主关系键,其值不能为空,所以二者等价。其他情况下,二者 不一定等价。 5.对查询结果进行分组计算 使用 GROUP BY 子句和 HAVING 子句实现。 【例 3-31】 统计教师人数在 2 人以上的职称名称。 SELECT COUNT(*) AS 人数,Prof FROM T GROUP BY Prof HAVING COUNT(*)&1; 【例 3-32】查询选修课程在 3 门以上,并且各门 课程均及格的学生学号和平均成绩,查 询结果按照平均成绩降序输出。 SELECT Sno, AVG(Score)AS 平均成绩 WHERE Score&=60 GROUP BY Sno HAVING COUNT(*)&=3 ORDER BY 2 DESC; 3.3.2 连接查询 连接查询:一个查询需要对多个表进行操作 表之间的连接:连接查询的结果集或结果表 连接字段:数据表之间的联系是通过表的字段值来体现的 连接操作的目的:从多个表中查询数据 表的连接方法 : 表之间满足一定条件的行进行连接时,FROM 子句指明进行连接的表名,WHERE 子 FROM SC47 句指明连接的列名及其连接条件 利用关键字 JOIN 进行连接: 当将 JOIN 关键词放于 FROM 子句中时, 应有关键词 ON 与之对应,以表明连接的条件 JOIN 的分类 INNER JOIN 显示符合条件的记录,此为默认值 为左(外)连接,用于显示符合条件的数据行以及左 LEFT(OUTER)JOIN 边表中不符合条件的数据行,此时右边数据行会以 NULL 来显示 右(外)连接,用于显示符合条件的数据行以及右边 RIGHT(OUTER)JOIN 表 中 不符 合条 件 的数 据行 。 此时 左边 数 据行 会以 NULL 来显示 显示符合条件的数据行以及左边表和右边表中不符合 FULL(OUTER)JOIN 条件的数据行。此时缺乏数据的数据行会以 NULL 来 显示 将一个表的每一个记录和另一表的每个记录匹配成新 CROSS JOIN 的数据行 1.WHERE 连接查询方式 【例 3-33】查询每个学生及其选修课程的情况。 SELECT S.*, SC.* FROM S, SC WHERE S.sno=SC. 采用 JOIN 连接查询的 SQL 语句为: SELECT S.*, SC.* FROM S INNER JOIN SC48 ON S.sno=SC. 注意:连接运算可以使用关系代数中的连接运算 2.JOIN 连接查询方式 SELECT [选取字段|表达式]… FROM &表名& INNER| LEFT OUTER | RIGHT JOIN &表名& ON 连接条件 【例 3-34】 现在有两个表: 和 Sc St (如下所示) 则 INNER、 , LEFT、 RIGHT、 FULL OUTER 连接查询的结果如图 3-13 所示。 (a)SELECT * FROM St INNER JOIN Sc ON St.Snu= Sc.Snu (b)SELECT * FROM St LEFT JOIN Sc ON St.Snu= Sc.Snu (c)SELECT * FROM St RIGHT JOIN Sc ON St.Snu= Sc.Snu (d)SELECT * FROM St FULL JOIN Sc ON St.Snu= Sc.Snu 3.自身连接查询 自身连接是指相互连接的表物理上为同一张表,要为这张表取两个别名以方便操作。 【例 3-35】假设课程表 C 的结构如下, 查询每一门课程的间接先修课 (即先修课的先修课) 。 方法 1: SELECT first.Cno, second.Cpno FROM WHERE first.Cpno=second.C 方法 2: SELECT second ON first.Cpno=second.C first.Cno, second.Cpno FROM C AS first INNER JOIN C AS C AS first, C AS second OUTER | FULL OUTER |CROSS49 4 .外连接 而在外部连接中,参与连接的表有主从之分,以主表的每行数据去匹配从表的数据列。 符合连接条件的数据将直接返回到结果集中,对那些不符合连接条件的列,将被填上 NULL 值后再返回到结果集中。 【例 3-36】 查询所有学生的选课情况(没有选课的学生只输出学生的基本信息) 。 方法一:使用 WHERE 连接。 SELECT S.Sno, Sn, Sex, Age, Dno, SC.Cno, Score FROM S, SC WHERE S.Sno=SC.Sno(*); 方法二:使用 JOIN 连接。 SELECT S.Sno, Sn, Sex, Age, Dno, SC.Cno, Score FROM S LEFT JOIN SC ON S.Sno=SC.S 3.3.3 嵌套查询 在 WHERE 子句中包含一个形如 SELECT-FROM-WHERE 的查询块, 此查询块称为子查询 或嵌套查询。 嵌套查询通常分为不相关子查询和相关子查询两类。 (1)不相关子查询。 子查询的查询条件不依赖于父查询。子查询可以独立运行,并且只执行一次,执行完毕 后将值传递给外部查询。 【例 3-37】 查询选修“150102”号课程的学生姓名。 SELECT Sn FROM S WHERE Sno IN (SELECT Sno FROM SC WHERE Cno = ';);50 (2)相关子查询 子查询的查询条件依赖于父查询。子查询不能独立运行,必须依靠父查询数据,并且外 部查询执行一行,子查询就执行一次。 【例 3-38】 查询每个部门中教师年龄大于本部门学生平均年龄的教师的姓名、部门号和年 龄。 SELECT Tn, Dept, Age FROM T WHERE Age& (SELECT AVG(Age) FROM S WHERE T.Dept = S.Dept); 嵌套查询中最常见的是不相关子查询 1.带有 IN 谓词的子查询 带有 IN 谓词的子查询是指父查询和子查询之间用 IN 进行连接, 判断某个属性列值是否 在子查询的结果中。 【例 3-39】 查询与“王红”职称相同的教师。 本查询可以分成如下两步完成: (1)确定“王红”的职称。 SELECT Prof FROM T WHERE Tn = '王红'; (2)确定与“王红”职称相同的教师。 SELECT Tn FROM T WHERE Prof IN (SELECT Prof FROM T WHERE Tn = '王红') ; 使用复合连接条件查询来实现: SELECT t1.Tn FROM T AS t1,T AS t2 WHERE t1.Prof=t2.prof AND t2.Tn= '王红'; 2.带有比较运算符的子查询51 使用&、&、=、&=、&=、!=或&&等比较运算符。带有比较运算符的子查询是指父查询 和子查询之间用比较运算符进行连接。 【例 3-41】查询与“王红”职称相同的教师。 SELECT T.Tn FROM T WHERE Prof = (SELECT Prof FROM T WHERE Tn = '王红'); 3.带有 ANY 或 ALL 谓词的子查询 当子查询的返回值为一个集合时,除了可以使用 IN 连接词以外,还可以使用 ANY 或 ALL 谓词。注意,使用 ANY 或 ALL 谓词时必须同时使用比较运算符。 表达式 &ANY &ANY &=ANY &=ANY =ANY !=ANY 或&&ANY &ALL &ALL &=ALL &=ALL =ALL !=ALL 或&&ALL 含义 大于子查询中的某个值 小于子查询中的某个值 大于等于子查询中的某个值 小于等于子查询中的某个值 等于子查询中的某个值 不等于子查询中的某个值 大于子查询中的所有值 小于子查询中的所有值 大于等于子查询中的所有值 小于等于子查询中的所有值 等于子查询中的所有值 不等于子查询中的所有值52 【例 3-42】 查询其他部门中比“信电学院”任意一个(其中某一个)学生年龄小的学生的姓 名和年龄。 方法 1: SELECT Sn, Age FROM S WHERE Dept && '信电' AND Age & ANY (SELECT Age FROM S WHERE Dept = '信电'); 方法 2: SELECT Sn, Age FROM S (SELECT MAX(Age)FROM SWHERE dept && '信电' AND Age &WHERE dept = '信电'); 【例 3-43】 查询其他部门中比“信电学院”所有学生年龄都小的学生的姓名和年龄。 方法 1: SELECT Sn, Age FROM S WHERE Dept && '信电' AND Age & ALL(SELECT Age FROM S WHERE Dept = '信电'); 方法 2: SELECT Sn, Age FROM S WHERE Dept && '信电' AND Age & (SELECT MIN(Age)FROM S WHERE Dept = '信电'); 4.带有 EXISTS 谓词的子查询 带有 EXISTS 的子查询不返回任何实际数据,它只得到逻辑值“真”或“假” 。 当子查询的的查询结果集合为非空时,外层的 WHERE 子句返回真值,否则返回假值。53 NOT EXISTS 与此相反。 含有 IN 的查询通常可用 EXISTS 表示,但反过来不一定。 【例 3-44】 查询所有选修了“150102”号课程的学生的姓名和部门号。 SELECT Sn, Dept FROM S WHERE EXISTS (SELECT * FROM SC WHERE Sno=S.Sno AND Cno=';); 【例 3-45】 查询所有选修了全部课程的学生的姓名和部门。 SELECT sn, dept FROM S WHERE NOT EXISTS (SELECT * FROM C WHERE NOT EXISTS (SELECT * FROM SC WHERE Sno=S.Sno AND Cno=C.Cno)); 3.3.4 集合查询 并操作 UNION、 交操作 INTERSECT 和差操作 MINUS。 SQL Server 的 Transact-SQL 语言只提供 UNION 运算符,实现并操作。 1.UNION 操作 使用 UNION 操作符将来自不同查询的数据组合起来,形成一个具有综合信息的查询结 果。 参加合并查询的各子查询的使用的表结构应该相同。 【例 3-46】 查询年龄在 30 岁以上和部门号为“01”的所有教师的情况。 SELECT * FROM T WHERE Age&30 UNION SELECT * FROM T WHERE Dno= '01'; 2.集合差/集合交运算54 EXCEPT 运算符可以实现集合差操作,即从左查询中返回右查询没有找到的所有非重复 值。 INTERSECT 运算符可实现集合交操作,即返回 INTERSECT 操作符左右两边的两个查 询都返回的所有非重复值。 【例 3-47】 查询所有非信电学院的学生。 SELECT * FROM S EXCEPT SELECT Dept= '信电'); 【例 3-48】 查询所有职称为“讲师”的女教师。 方法 1: SELECT * FROM T WHERE Sex= '女' INTERSECT SELECT * FROM T WHERE Prof= '讲师'; 方法 2: SELECT * FROM T WHERE Sex= '女' AND Prof= '讲师'; 3.4 SQL 的数据操作 ? 添加数据( INSERT INTO) ? 修改数据(UPDATE ) ? 删除数据(DELETE ) 3.4.1 插入数据 用 SQL 命令插入数据 INSERT INTO * FROM S WHERE Dno= (SELECT Dno FROM D WHERE55 1.插入单个元组 INSERT INTO &表名&[(&列名 1&[,&列名 2&…])] VALUES(&值&) 【例 3-50】 在学生表 S 中插入一条学生记录(学号:100108,姓名:朱良) 。 INSERT INTO S (Sno, Sn) VALUES(';, '朱良'); 注:必须用逗号将各个数据分开,字符型数据要用单引号括起来。 如果 INTO 子句中没有指定列名,则新添加的记录必须在每个属性列上均有值, 且 VALUES 子句中值的排列顺序要和表中各属性列的排列顺序一致。 2.插入多个元组 INSERT INTO &表名& [(&列名 1&[,&列名 2&…])] 子查询 【例 3-51】 将每一个部门学生的平均年龄存入新表 SAVGA 中(本表包括两个属性列:部 门号(Dno)和平均年龄(Avgage)。 ) CREATE TABLE SAVGA (Dno CHAR(15) Avgage INT); INSERT INTO SAVGA SELECT Dno, AVG (Age) 3.4.2 修改数据 用 SQL 命令修改数据 UPDATE &表名& SET &列名&=&表达式& [,&列名&=&表达式&]… [WHERE &条件&] FROM S GROUP BY D56 1.修改单个或部分元组的值 【例 3-52】 将学生“100107”的年龄改为 22 岁。 UPDATE S SET Age=22 WHERE Sno=';; 2.修改全部元组的值 【例 3-53】 将所有学生的年龄增加 1 岁。 UPDATE S SET Age=Age+1; 3.利用子查询修改部分元组的值 【例 3-54】 将信电学院全体学生的成绩置 0。 UPDATE SC SET Score=0 WHERE Sno IN (SELECT Sno FROM S WHERE Dno= (SELECT Dno FROM D WHERE Dept= '信电') ); 3.4.3 删除数据 DELETE FROM&表名& [WHERE &条件&]1.删除单个或多个元组 【例 3-55】 删除学号为“100107”和“100108”的学生的记录。 DELETE FROM S WHERE Sno='; OR Sno=';;57 2.删除全部元组的值 【例 3-56】 删除所有学生的选课记录。 DELETE FROM SC; 3.带子查询的删除语句 子查询同样也可以嵌套在 DELETE 语句中,用以构造执行删除操作的条件。 【例 3-57】 删除信电学院所有学生的选课记录。 DELETE FROM SC WHERE Sno IN (SELECT Sno FROM S WHERE Dno= (SELECT Dno FROM D WHERE Dept= '信电')); 3.5 视图 视图是虚表,其数据不进行存储,其记录来自基本表,只在数据库中存储其定义 。 3.5.1 建立视图 CREATE VIEW &视图名&[(&视图列表&)] AS &子查询& 【例 3-58】 建立信电学院教师的视图,并要求进行修改和插入操作时仍保持该视图只有信 电学院教师。 CREATE VIEW ITteacher AS SELECT Tno, Tn, Prof FROM TWHERE Dno= (SELECT Dno FROM D WHERE Dept= '信电') WITH CHECK OPTION; 2.多表视图58 建立在多个基本表(视图)上,这样的视图称为多表视图。 【例 3-59】 建立选修了“150102”号课程的所有女生的视图。 CREATE VIEW FStu (Sno, Sn, Sex) AS SELECT S. Sno, Sn, Sex, BP FROM S, SC WHERE Sex='女' AND S. Sno=SC. Sno AND SC. Sno=';; 【例 3-60】 建立信电学院所有职称为“讲师”的教师及所任课程的视图。 CREATE VIEW ITea (Tno, Tn,TC. Cno) AS SELECT ITteacher.Tno, Tn, TC.cno FROM WHERE 3.带表达式的视图 定义视图时可以根据应用的需要, 设置一些派生属性列。 因这些派生属性在基本表中并 不实际存在,所以有时也称它们为虚拟列。带虚拟列的视图称为带表达式的视图。 【例 3-61】 定义一个反映学生出生年份的视图。 CREATE VIEW SBir (Sno, Sn, Sbirth) AS SELECT Sno, Sn, 2010-S.Age FROM S 4.分组视图 使用带有集函数和 GROUP BY 字句的查询来定义的视图称为分组视图。 【例 3-62】 定义一个反映学生的学号及其平均成绩的视图。 CREATE VIEW StuAvg (Sno, Savg) ITteacher, TCITteacher.Tno =TC.Tno AND ITteache.Prof='讲师';59 AS SELECT Sno, AVG (Score) FROM 3.5.2 查询视图 视图定义后,对视图的查询操作如同对基本表的查询操作一样。 【例 3-63】 查找视图 ITteacher 中职称为“教授”的教师号和姓名。 方法 1: SELECT Tno,T 方法 2: SELECT Tno,Tn FROM WHERE 信电')); 3.5.3 删除视图 视图建好后,若删除导出此视图的基本表,该视图也将失效,但一般不会被自动删除。 删除视图通常需要显式地使用 DROP VIEW 语句进行。 DROP VIEW &视图名& 【例 3-64】 删除视图 Itteacher。 DROP VIEW ITteacher 注意:执行该语句后,ITteacher 视图的定义将从数据字典中删除。由 ITteacher 视图导出 的 ITea 视图的定义虽然在数据字典中,但该视图已无法使用,所以也应该删除。 3.5.4 更新视图 由于视图是一张虚表,所以对视图的更新,最终转换成对基本表的更新。 其语法格式如同对基本表的更新操作一样 。 (Prof= '教授' AND T Dno= (SELECT Dno FROM D WHERE Dept= ' FROM ITteacher WHERE(Prof= '教授') SC GROUP BY S60 视图的优点:利于数据保密、简化查询操作、保证数据的逻辑独立性 1.UPDATE 操作 【例 3-65】 将信电学院教师的视图中的工号为“05”的教师的姓名修改为“张宾” 。 方法 1: UPDATE ITteacher SET Tn='张宾' WHERE Tno='05'; 方法 2: UPDATE T SET Tn='张宾' WHERE Tno='05' AND dept='信电'; 2.INSERT 操作 【例 3-66】 向信电学院教师的视图插入一条新记录( , “07” “张平” “副教授” 。 , ) INSERT INTO ITteacher VALUES('07', '张平', '副教授'); DBMS 自动将其转换为对基本表 T 的更新,因为本视图是信电学院教师的视图,所以 系统自动会将部门号“01”放入 VALUES 子句中,更新语句为: INSERT 3.DELETE 操作 【例 3-67】 将向信电学院教师的视图中插入的记录( , “07” “张平” “副教授” 删除。 , ) DELETE FROM ITteacher WHERE Tno='07'; INTO T(Tno, Tn, Prof, Dno) VALUES('07', '张平', '副教授', '01');DBMS 将其转换为对基本表的更新,同理根据例 3-66 要将表达式“Dept='信电'”放入 WHERE 条件表达式中,转换后的更新语句为: DELETE FROM T WHERE Tno= '07' AND Dno= (SELECT Dno FROM D WHERE Dept= '信电')); 3.5.5 视图的作用 1.视图能使用户以多种角度看待同一数据61 2.视图能够简化用户的操作 3.视图为重构数据库提供一定程度逻辑独立性视图可以使应用程序和数据库表在一定程度 上独立。 4.视图能够为机密数据提供安全保护 3.6 SQL 的数据控制 3.6.1 授权 1.SQL 的用户 SQL 中的用户分为两种: SQL 服务器用户 (DBA) 和数据库用户。 中,有 3 种特殊的用户:DBA、DBO 和一般用户。 DBA 对整个系统有操作权限; DBO 对其所建立的数据库具有全部操作权限; 一般用户对给定的数据库只有被授权的操作权限。 2.权限与角色 权限 系统权限 :数据库用户能够对数据库系统进行某种特定的操作的权力 对象权限 :数据库用户在指定的数据库对象上进行某种特定的操作的权力 角色 角色是多种权限的集合 ,当要为某一用户同时授予或收回多项权限时,则可以把这些权 限定义为一个角色 。 3.用户授权 GRANT&权限&|&角色&[,&权限&|&角色&]… [ON 对象类型&&对象名&] TO&用户名&|&角色&|PUBLIC[,&用户名&|&角色&]… 在 SQL Server62 [WITH GRANT OPTION]; 【例 3-68】 把对表 S 的 INSERT 和 UPDATE 权限授予用户 User1 和 User2,并允许他们 将此权限授予其他用户。 GRANT INSERT, UPDATE ON TABLE S TO User1, User2 WITH GRANT OPTION; 3.6.2 回收授权 REVOKE &权限&|&角色&[,&权限&|&角色&]… [ON&对象类型&&对象名&] FROM&用户名&|&角色&|PUBLIC[,&用户名&|&角色&]…; 【例 3-69】 收回所有用户对表 S 的 INSERT 权限。 REVOKE INSERT ON TABLE S FROM PUBLIC; 【例 3-70】 User1 收回用户 User3 修改学生学号的权限。 REVOKE UPDATE(Sno) ON TABLE S FROM User3; 3.7 存储过程 3.7.1 存储过程的概念 存储过程是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中。 3.7.2 创建和执行存储过程 CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ]] [,…n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ]63 AS sql_statement [n] 【例 3-73】 删除教师表 T 中教师号为“01”和“02”的教师,并将授课表 TC 中两位教师授课 课程的教师号和教师姓名设为空。 本例题分成如下两步完成: (1)删除教师表 T 中教师号为“01”和“02”的教师 DELETE T WHERE Tno= '01' OR Tno= '02'; (2)将授课表 TC 中两位教师授课课程的教师号设为空 UPDATE TC SET Tno=NULL, Tn=NULL WHERE 本例也可使用存储过程来实现: CREATE PROC PRC_TEST (@num_a, @ num_b) AS DELETE T WHERE Tno=@num_a OR Tno=@ num_b; UPDATE TC SET Tno=NULL, Tn=NULL WHERE Tno=@num_a OR Tno=@num_a; Tno= '01' OR Tno= '02';执行存储过程:exec PRC_TEST 01, 02; 执行时,它先得到了两个参数:01、02,分别赋值给@num_a、@ num_b,然后按照这两 个参数分步执行封装在存储过程里的两条语句。【本章小结】 1. CREATE\ALTER\DROP 2. SELECT…FROM…WHERE…GROUP BY…ORDER BY 3. INSERT \UPDATE\DELETE 4. GRANT\REVOKE64 5. PROCEDURE\TRIGGER【思考与练习】 1.SQL 语言的主要功能有哪些?请注意区分“型”与“值” 。 2.课后练习四,综合训练【参考书目】1.《数据库原理与应用教程》 2. 《数据库原理与应用》机械工业出版社 高教出版社何玉洁 主编 施伯乐、丁宝康主编 赵增敏 、朱粹丹编著 王珊 、陈红 编著3.《sql server 2000 实用教程》 电子工业出版社 4.《数据库系统原理教程》 清华大学出版社65 第四章关系规范化理论【教学目的】 掌握关系规范化的主要目的 熟悉关系规范化的主要评价标准 掌握函数依赖的定义及分类 掌握范式与规范化方法 掌握关系规范化的原则 【教学手段】 【教学内容】 多媒体讲授关系数据库规范化理论的目的是要设计“好的”RDB 模式。 要设计好的关系模式, 必须是关 系满足一定的约束条件, 此约束形成了规范。 规范化就是低级关系模式通过模式分解转换为 若干高级范式的关系模式集合的过程。 4.1.2 不合理的关系模式存在的数据冗余和异常现象 【例 4-1】 学生选课数据库 SCS(Sno, Sname, Ssex, Sdept, Cno, Cname, Sorce)在此关系模式中填入一部分具体的数据 Sno 101 102 103 Sname 姜 珊 姜 珊 姜 珊 陈 默 陈 默 孙 浩 Ssex 女 女 女 女 女 男 Sdept 信电学院 信电学院 信电学院 管理学院 管理学院 外语学院 Cno C C Cname 离散数学 数据结构 数据库 操作系统 数据库 计算机基础 Score 78 70 85 68 82 7266 该表出现的问题 :数据冗余、插入异常、删除异常、修改异常 (1)数据冗余 当一个学生选修多门课程时,就会导致姓名、性别院名等多次重复存储;每一门课程名 均对选修该门课程的学生重复存储,因而造成数据冗余。 (2)操作异常 ① 插入异常:如果某个学生还没有选课,学生的有关信息就不能插入。同样,没有被学 生选修的课程信息也无法存入数据库。 ② 删除异常 当学生毕业离校时, 要把他们的信息从数据库中删除, 如果此时他们所选修的某些课程 尚无其他年级的学生选修,那么这些课程的基本信息就会丢失,一旦查询所开课程信息时, 就不会出现被删除课程的信息,就会认为该课程没有开过,可实际上不是这种情况。 ③ 修改异常 若某个学生从信电学院转到管理学院, 那么与该学生相关的所有记录都需要逐一修改属 性 Sdept 的值,如有遗漏,就会造成 SCS 中数据的不一致。 结论 SCS 关系模式不是一个好的模式。 “好”的模式: 不会发生插入异常、删除异常、更新异常, 数据冗余应尽可能少 根本原因:属性间存在着数据依赖引起的 解决方法:通过分解关系模式来消除其中不合适的数据依赖 关系模式分解67 SCS(Sno, Sname, Ssex, Sdept, Cno, Cname, Sorce) 下一步:S(Sno, Sname, Ssex, Sdept) C(Cno, Cname) SC(Sno, Cno, Score) 就不会出现上述异常,数据冗余也得到较好控制。 4.2 函数依赖 函数依赖(Functional Dependency)是数据依赖的一种。数据依赖是指一个关系中属 性值之间的相互联系,它是现实世界属性间相互联系的体现,是数据之间的内在性质,是语 义的体现。现在已经提出了多种类型的数据依赖,其中最重要的是函数依赖和多值依赖。函 数依赖是关系规范化的理论基础。 4.2.1 函数依赖的定义 定义 4.1 设 R(U)是一个关系模式,U 是 R 的属性集合,X 和 Y 是 U 的子集,如果对于 R(U)的任意一个可能的关系 r,对于 X 的每一个具体值,Y 都有唯一的具体值与之对应,则 称 X 决定函数 Y,或 Y 函数依赖于 X,记作 X→Y。 例如:姓名→年龄”这个函数依赖只有在没有重名的学生情况下成立。如果有重名的学生,则 “年龄”就不再依赖于“姓名”了。 (1)如果 X→Y,且 Y?X,则称 X→Y 是平凡的函数依赖。 (2)如果 X→Y,但 ,则称 X→Y 是非平凡的函数依赖。(3)如果 X→Y,则称 X 为决定因素(Determinant) ,称 Y 为依赖因素(Dependent) 。 (4)如果 X→Y 且 Y→X,则记作 X←→Y。68 (5)如果 Y 不函数依赖于 X,则记作 X\→Y 。 4.2.2 完全函数依赖和部分函数依赖 定义 4.2 在关系模式 R(U)中,U 是 R 的属性集合,X 和 Y 是 U 的子集。 如果 X→Y,并且对于 X 的任何一个真子集 X′,都有 X′ Y,则称 Y 完全函数依赖(Full Functional Dependency)于 X,记作 X→fY; 如果对X的某个真子集 X′,有 X′→ fY,则称 Y 部分函数依赖(Partial Functional Dependency)于 X,记作 X →pY。 【例 4-2】 在关系 SC(Sno, Cno, Cname, Score)中,因为 Sno\→Score 且 Cno\→ Score, 所以(Sno, Cno) →f Score。而 Cno→Cname,所以(Sno, Cno) → pCname。 4.2.3 传递函数依赖 定义 4.3:在关系模式 R(U)中,U 是 R 的属性集合,X 和 Y 是 U 的子集。如果 X→Y,Y→ Z,且 Y ? X,Y ¢X,则称 Z 传递函数依赖(Transitive Functional Dependency)于 X, 记作 X →传递 Z;否则称 Z 非传递函数依赖于 X。 【例 4-3】 在关系 S(Sno, Sname, Ssex, Sdept, Dean)中, 有函数依赖关系 Sno→ Sname, 由于 Sno→ Sdept,Sdept→Dean,有 Sno→传递 Dean。 4.3 范式和规范化方法 范式(Normal Forms,NF)的概念是 E.F.Codd 在 1971 年提出的。 年, E.F.Codd 提出了 1NF、 2NF 与 3NF。 1974 年, Codd 与 Boyce 又共同提出了 BCNF。 1976 年, Fagin 提出了 4NF, 后来又有人提出了 5NF。 在这些范式中, 最重要的是 3NF 和 BCNF, 它们是进行规范化的主要目标,基本保证了防止冗余问题和异常情况的发生。 关系数据库中的关系必须满足一定的规范化要求, 对于不同的规范化程度可用范式来衡 量。范式是满足一定要求的关系模式的集合,是衡量关系模式规范化程度的标准,满足不同69 程度要求的为不同范式。 目前主要有 6 种范式: ? 第一范式(1NF) ? 第二范式(2NF) ? 第三范式(3NF) ? ? ? BC 范式(BCNF) 第四范式(4NF) 第五范式(5NF)范式的级别越高,条件越严格。满足基本规范化要求的关系模式称为第一范式,简称为 1NF;在第一范式基础上进一步满足一定要求的范式为第二范式,简称为 2NF;其余以此类 推。 各种范式之间存在联系: 1NF?2NF?3NF?BCNF?4NF?5NF 通常把某一关系模式 R 为第 n 范式简记为 R∈nNF。 通过模式分解可以将低级范式的关系模式转换为若干个高级范式的关系模式的集合, 这 个过程称为关系模式的规范化。 4.3.1 第一范式(1NF) 定义 4.4:如果关系模式 R 的每个属性都是不可分解的基本数据项,则称 R 属于第一范式, 记为 R∈1NF。 ? 第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关 系数据库。 ? 但是满足第一范式的关系模式并不一定是一个好的关系模式70 4.3.2 第二范式(2NF) 定义 4.5:如果关系模式 R∈1NF,且每个非主属性都完全函数依赖于主键,则称 R 属于第 二范式,记为 R∈2NF。 由定义可知,如果某个 1NF 的关系的主键只由一个属性组成或关系的全体属性均为主 属性,那么这个关系就是 2NF。如果主键是由多个属性列共同构成的复合主键,并且存在 非主属性对主属性的部分函数依赖,则这个关系就不是 2NF。 【例 4-4】对于关系 S(Sno, Sname, Ssex, Sdept, Dean, Cno, Cname, Sorce), 主键为(Sno, Cno)。由于存在非主属性姓名(Sname) 、性别(Ssex) 、课程名(Cname)部分函数依赖 于(Sno, Cno),因此不属于 2NF。 可以通过模式分解将非 2NF 的关系模式分解为多个满足 2NF 的关系模式。分解步骤如下: (1)首先用组成主键的属性集合的每个子集作为主键构成若干关系,对于关系 S 分解为如 下 3 个子关系: S1(Sno, …),Sno 为主键 S2(Cno, …),Cno 为主键 S3(Sno, Cno, …),(Sno, Cno)为主键 (2)对于每个子关系,将依赖于此主键的属性放置到此关系中,则有: S1(Sno, Sname, Ssex, Sdept, Dean),Sno 为主键 S2(Cno, Cname),Cno 为主键 S3(Sno, Cno, Sorce),(Sno, Cno)为主键 模式分解后,消除了原关系 S 中的部分函数依赖,即 S1、S2、S3 3 个关系模式都不存在 部分函数依赖,S1、S2、S3 都属于 2NF。 分析一下 S1 存在的问题:71 (1)数据冗余。 (2)插入异常。 (3)删除异常。 (4)修改复杂。 由此可见, 满足第二范式的关系模式仍然可能出现数据冗余和操作异常。 这是因为第二 范式没有排除传递函数依赖。因此,还需要对满足第二范式的关系模式进行进一步分解。 4.3.3 第三范式(3NF) 定义 4.6:如果关系模式 R∈2NF,且所有非主属性都不传递函数依赖于任何候选键,则 R∈ 3NF。 【例 4-5】 分解例 4-4 中的关系 S1,使其满足 3NF 的要求。 在关系 S1 中,院长(Dean)传递函数依赖于学号(Sno) ,即 Sno Dean,所以 S1 不 属于 3NF。 将关系 S1(Sno, Sname, Ssex, Sdept, Dean)进一步分解, 消除传递依赖。 分解步骤如下: (1)对于不是候选键的每个决定因素,从关系中删除依赖它的所有属性。 在关系 S1 中,学院(Sdept)不是候选键,但却是决定因素,从关系 S1 中删除依赖 它的属性院长(Dean) ,得到新的关系 S11(Sno, Sname, Ssex, Sdept)。 (2)新建一个关系,该关系中包含原关系中不是候选键的决定因素以及所有依赖该决定因 素的属性, 并将决定因素作为该关系的主键。 对于关系 S1, 新建的关系为 S12(Sdept, Dean), 主键为 Sdept。 关系 S1 分解后消除了传递函数依赖,因此 S11 和 S12 都满足 3NF。 4.3.4 BCNF 定义 4.7:设关系模式 R∈1NF,如果对于 R 的任意一个函数依赖 X→Y,X 必为候选键,则72 R∈BCNF。 ? 等价于:每个决定属性集(因素)都包含(候选)码。 BCNF 的关系模式都具有如下 3 个性质。 (1)所有非主属性都完全函数依赖于每个候选键。 (2)所有主属性都完全函数依赖于每个不包含它的候选键。 (3)没有任何属性完全函数依赖于非候选键的任何一组属性。 若 R∈BCNF ? ? ? ? 所有非主属性对每一个码都是完全函数依赖 所有的主属性对每一个不包含它的码,也是完全函数依赖 没有任何属性完全函数依赖于非码的任何一组属性【例 4-7】 分析关系模式 T(Tno, Tname, Tsex)中,各属性分别代表教师号、教师姓名、性 别。 解:T 只有一个主键 Tno,没有任何属性对 Tno 部分依赖或传递依赖,所以 T∈3NF。同时 Tno 是 T 中唯一的决定因素,所以 T∈BCNF。 【例 4-8】 分析关系模式 STC(S, T, C)中,S 表示学生,T 表示教师,C 表示课程。每一教 师只教一门课。 解:每门课程有若干教师,某一学生选定某门课程,就对应一个固定的教师。由语义可得到 函数依赖:(S,C)→T, (S,T)→C, T→C 该关系模式中,(S,C)和(S,T)都是候选键。 因为没有任何非主属性部分依赖和传递依赖于候选键所以 STC∈3NF。但 STC 不是73 BCNF 关系,因为 T 是决定因素,但它不是候选键。 STC 可以分解为 ST(S,T)与 TC(T,C),它们都是 BCNF。 3NF 和 BCNF 是对以函数依赖为基础的关系模式规范化程度的衡量标准。4.3.5 多值依赖与第四范式 1.多值依赖 定义 4.8:设有关系模式 R(U),X、Y、Z 是 U 的子集,且 Z=U?X?Y。当且仅当 R 的任一 关系 r 在(X、Z)上的每一个值对应一组 Y 的值,这组值仅仅决定于 X 值而与 Z 值无关时, 称 Y 多值依赖于 X,记作 X→→Y。 如果 X→→Y,但 Z=U?X?Y=Ф,则称 X→→Y 为平凡的多值依赖,否则为非平凡的多值 依赖。 【例 4-9】学校中某一门课程由多个教师讲授,他们使用相同的一套参考书。每个教员可 以讲授多门课程,每种参考书可以供多门课程使用。 表 4-4 关系模式 Teach 的一个关系实例 课程 C 教师 T 参考书 B数据库原理及应用 数据库原理及应用 数据库原理及应用 数据库原理及应用 数据库原理及应用周晓明 周晓明 周晓明 程羽姗 程羽姗数据库系统概论 SQL Server 2000 离散数学 数据库系统概论 SQL Server 200074 数据库原理及应用 数据结构与算法 数据结构与算法 数据结构与算法 数据结构与算法 数据结构与算法 数据结构与算法 Teach∈BCNF程羽姗 程羽姗 程羽姗 程羽姗 王宏伟 王宏伟 王宏伟离散数学 数据结构与算法 数据结构 离散数学 数据结构与算法 数据结构 离散数学Teach 具有唯一候选键(C,T,B), 即全键 Teach 模式中存在的问题 (1)数据冗余度大 (3) 删除操作复杂 多值依赖具有以下性质: (1)替代性。若 X→Y,则 X→→Y,即 X→Y 是 X→→Y 的特例。 (2)对称性。若 X→→Y,则 X→→U?X?Y。 (3)传递性。若 X→→Y,Y→→Z,则 X→→Z?Y。 (4)合并性。若 X→→Y,X→→Z,则 X→→Y Z。 (5)若 X→→Y,X→→Z,则 X→→Y∩Z。 (6)若 X→→Y,X→→Z,则 X→→Y-Z,X→→Z C Y。 2.第四范式(4NF) 定义 4.9:关系模式 R∈1NF,如果对于 R 的每个非平凡多值依赖 X→→Y(Y ? X) 都含 ,X 有候选键,则称 R 属于第四范式,记为 R∈4NF。 (2)插入操作复杂 (4) 修改操作复杂75 例 4-9 的关系模式 Teach 中,主键是(C,T,B),即全键。C→→T,C→→B,它们都是非平凡 的多值依赖, C 不是候选键, 但 所以 Teach 不属于 4NF。 Teach 分解为 T(C,T)和 B(C,B), 将 虽然存在 C→→T,C→→B,但它们是平凡的多值依赖,所以 T∈4NF,B∈4NF,这样关系模 式 Teach 存在的问题得到了较好地解决,如表 4-5 和表 4-6 所示。 表 4-5 关系 T 课程 C 数据库原理及应用 数据库原理及应用 数据结构与算法 数据结构与算法 教师 T 周晓明 程羽姗 程羽姗 王宏伟 课程 C 数据库原理及应用 数据库原理及应用 数据库原理及应用 数据结构与算法 数据结构与算法 数据结构与算法 表 4-6 关系 B 参考书 B 数据库系统概论 SQL Server 2000 离散数学 数据结构与算法 数据结构 离散数学函数依赖和多值依赖是两种最重要的数据依赖。如果只考虑函数依赖,则属于 BCNF 的关系模式规范化程度是最高的;如果考虑多值依赖,则属于 4NF 的关系模式规范化程度 是最高的。实际上,数据依赖中除函数依赖和多值依赖之外,还有其他数据依赖,如连接依 赖。 函数依赖是多值依赖的一种特殊情况, 而多值依赖实际上又是连接依赖的一种特殊情况。 但连接依赖不像函数依赖和多值依赖可由语义直接导出,而是在关系的连接运算时反映出 来。存在连接依赖的关系模式仍然可能存在数据冗余、操作异常等问题。如果消除了属于 4NF 的关系模式中存在的连接依赖,则可以进一步达到满足 5NF 的关系模式。 4.3.6 关系模式的规范化 ? ? 关系数据库的规范化理论是数据库逻辑设计的工具 目的:尽量消除插入、删除异常,修改复杂,数据冗余76 ?基本思想:逐步消除数据依赖中不合适的部分 ? 实质:概念的单一化一个关系模式的规范化过程如图所示1NF ↓ 2NF 消除决定因素 非候选键的非 平凡函数依赖 ↓ 3NF↓消除非主属性对候选键的部分函数依赖 消除非主属性对候选键的传递函数依赖 消除主属性对候选键的部分和传递函数依赖 消除非平凡且非函数依赖的多值依赖 消除不是由候选键蕴含的连接依赖BCNF ↓ 4NF ↓ 5NF? ?不能说规范化程度越高的关系模式就越好 在设计数据库模式结构时, 必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式 ? 上面的规范化步骤可以在其中任何一步终止4.5 关系模式的分解 (1)把低一级的关系模式分解为若干个高一级的关系模式的方法不是唯一的 (2)只有能够保证分解后的关系模式与原关系模式等价,分解方法才有意义 三种模式分解等价的定义: (1) 分解具有无损连接性 (2) 分解要保持函数依赖 (3) 分解既要保持函数依赖,又要具有无损连接性 4.5.1 模式分解的定义 定义 4.16: 关系模式 R(U,F)的一个分解是指 ρ = { R1(U1 ,F1),R2(U2 ,F2),…,Rn(Un,Fn)), 其中 U=U1∪U2∪…∪Un,并且没有 Ui ? Uj(1≤i,j≤n) ,Fi 是 F 在 Ui 上的投影,Fi = {X→ Y | X→Y∈F+∧XY ? Ui }。77 定义 4.17:设 F 是关系模式 R(U,F)的函数依赖集。算法 4.2:判别一个分解的无损连接性。 ρ = {R1(U1,F1),R2(U2,F2),…,Rk(Uk,Fk)}是 R(U,F)的一个分解,U = {A1,…,An}, F = {FD1, FD2,…,FDρ},设 F 是一个极小函数依赖集,记函数依赖 FDi 为 Xi→Ali。判别方 法如下: (1)构造一张 n 列 k 行的表格。每列对应一个属性,每行对应分解中的一个关系模式。 若属性 Aj 属于 Ui,则在 j 列 i 行交叉处填上 aj,否则填上 b i j。 (2)对每一个 FDi 做如下操作:找到 Xi 所对应的列中具有相同符号的行,考察这些行中li 列的元素, 若其中有 ali, 则全部改为 ali, 否则全部改为 bmli(m 是这些行的行号最小值) 。应当注意的是,若某个 btli 被更改,那么该表的 li 列中凡是 btli 的符号(不管它是否为开始 找到的那些行)均应作相应的更改。如在某次更改后,有一行成为 a1,a2,…,an,则算法终 止。ρ具有无损连接性,否则ρ不具有无损连接性。 定理 4.3: 为无损连接分解的充分必要条件是算法 4.2 终止时, ρ 表中有一行为 a1,a2,…,an。 【例 4-13】 设有 R(U,F),其中,U = {A, B, C, D, E},F = {AB→C, C→D, D→E},R 的一个 分解为 R1(A, B, C),R2(C, D),R3(D, E), 该分解是否具有无损连接性?78 79 【本章小结】 1.本章主要介绍了关系规范化理论的内容,包括函数依赖及相关概念的定义、范式和规范化 方法、数据依赖的公理系统、关系模式的分解等。 2.关系规范化理论是设计没有操作异常的关系数据库模式的基本原则, 主要研究关系模式中 各属性之间的依赖关系。 范式是衡量模式优劣的标准, 表达了模式中数据依赖之间应当满足 的联系。对于函数依赖,考虑 2NF、3NF 或 BCNF;对于多值依赖,考虑 4NF。【思考与练习】 1.规范化理论的主要内容包含哪些? 2.课后练习综合训练。80 【参考书目】 1.《数据库原理与应用教程》 2. 《数据库原理与应用》 机械工业出版社 高教出版社 何玉洁 主编 施伯乐、丁宝康主编 赵增敏 、朱粹丹编著 王珊 、陈红 编著3.《sql server 2000 实用教程》 电子工业出版社 4.《数据库系统原理教程》 清华大学出版社81 第五章 数据库保护技术【教学目的】 熟悉数据库保护技术的主要内容 了解数据库安全性的主要内容 熟悉数据库的完整性约束 掌握数据库的并发控制以及常见数据不一致性问题 掌握数据库的常见故障及故障恢复技术 【教学手段】 【教学内容】¨ 数据共享是数据库的基本性能要求,多用户共享数据库时,必然有合法用户合法使用、 合法用户非法使用以及非法用户非法使用数据的问题, 要保证合法用户合法使用数据库及数 据共享的安全性,就需要对数据库实施保护。 数据库的保护技术主要有数据库的安全性、完整性、并发控制及恢复 4 方面内容。 6.1 数据库的安全性 6.1.1 计算机系统的安全性 计算机系统安全性的含义 : 计算机系统安全性就是指计算机系统建立和采取的各种安全保护措施, 以保护计算机系 统中的硬件、软件等资源,不因各种有意无意的原因而遭到破坏、泄密或拒绝正常使用,使 计算机系统的全部资源能保持其正常状态。 安全性问题有许多方面 : 计算机系统的安全性不仅涉及到计算机系统本身的技术问题、管理问题,还涉及法学、 犯罪学、心理学等问题,其内容包括计算机安全理论与策略、计算机安全技术、安全管理、 安全评价、安全产品,以及计算机犯罪与侦察、计算机安全法律等。概括起来,计算机系统多媒体讲授82 的安全性问题可分为技术安全类、管理安全类和政策法律类三大类。 6.1.2 数据库的安全性 数据库安全性的含义 : 数据库的安全性是指保护数据库以防止非法使用所造成的数据泄露、更改或破坏。 安全性问题包括 : (1)法律、社会和伦理方面时问题。 (2)物理控制方面的问题。 (3)政策方面的问题。 (4)运行方面的问题。 (5)硬件控制方面的问题。 (6)操作系统安全性方面的问题。 (7)数据库系统本身的安全性方面的问题。 6.1.3 安全性控制的一般方法 安全性控制就是指要尽可能地杜绝所有可能的数据库非法访问。数据库安全模型 安全性控制的一般方法: 用户标识和鉴定、用户存取权限控制、定义视图、数据加密、 审计(Audit) 。 6.2 数据库的完整性 数据库完整性的含义 数据库的完整性是指保护数据库中数据的正确性、 有效性和相容性, 防止错误的数据进83 入数据库造成无效操作。 数据库的完整性是指防止合法用户使用数据库时向数据库中加入不符合语义的数据。 完 整性措施的防范对象是不合语义的数据。 6.3 并发控制 数据库并发性的含义 为了充分利用数据库资源, 很多时候数据库用户都是对数据库系统并行存取数据, 这样 就会发生多个用户并发存取同一数据块的情况, 如果对并发操作不加控制可能会产生不正确 的数据,破坏数据的完整性。 并发控制就是解决这类问题, 以保持数据库中数据的一致性, 即在任何一个时刻数据库 都将以相同的形式给用户提供数据。 6.3.1 事务的基本概念 1.事务的特性 事务是数据库系统中执行的一个工作单位,它是由用户定义的一组操作序列。 一个事务可以是一组 SQL 语句、 一条 SQL 语句或整个程序, 一个应用程序可以包括多 个事务。 定义事务的语句有三条: BEGIN TRANSACTION(事务开始) 、COMMIT(事务提交) 、ROLLBACK(事务回 滚) 2.事务的特性 (1)原子性。 一个事务是一个不可分割的工作单位,事务在执行时,应该遵守“要么不做,要么全做” 的原则,即不允许完成部分的事务。即使因为故障而使事务未能完成,它执行的部分结果也84 将被取消。 事务的原子性是对事务最基本的要求。 (2)一致性。 事务执行的结果必须是使数据库从一个一致性状态转变到另一个一致性状态。 (3)隔离性。 如果多个事务并发地执行, 应像各个事务独立地执行一样, 一个事务的执行不能被其他事 务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的。 并发控制就是为了保证事务间的隔离性。 (4)持久性。 持久性也称永久性(Permanence) ,指一个事务一旦提交,它对数据库中数据的改变就应 该是持久的,即使系统发生故障也不应该对其有任何影响。 持久性的意义在于保证数据库具有可恢复性。 6.3.2 并发操作引发的问题 例如 飞机机票订票系统 。假设机票余额 R=100 张,甲事务 T1 读出某航班目前的机票余 额数 100 张,订出 1 张机票,乙事务 T2 读出同航班目前的机票余额数,订出 1 张机票 , 如果正常操作,即甲事务 T1 执行完毕再执行乙事务 T2,机票余额更新后应该是 98 张。但 是如果按照如下顺序操作,则会有不同的结果: (1)甲事务 T1 读取机票余额 R=100 张; (2)乙事务 T2 读取机票余额 R=100 张; (3)甲事务 T1 订出 1 张机票,修改机票余额 R=R-1=99,把 R=99 写回到数据库; (4)乙事务 T2 订出 1 张机票,修改机票余额 R=R-1=99,把 R=99 写回到数据库; 结果两个事务共订出机票 2 张,而数据库中的机票余额却只少了 1 张。得到这种错误的85 结果是由甲乙两个事务并发操作引起的。 1.丢失修改 两个事务 T1 和 T2 读入同一数据, 并发执行修改操作时, 会出现事务 T2 提交的结果破 坏了事务 T1 提交

我要回帖

更多关于 数据库系统原理 的文章

 

随机推荐