数据库技术总结
数据(Data):是数据库中存储的基本对象
数据的定义:描述事物的符号记录
数据的种类:文字、图形、图象、声音等
数据的特点:数据与其语义是不可分的
数据库(Database,简称DB):是长期储存在计算机内、有组织的、可共享的大量数据集合 数据库的特征:
? 数据按一定的数据模型组织、描述和储存
? 可为各种用户共享
? 冗余度较小
? 数据独立性较高
? 易扩展
数据库管理系统(Database Management System,简称DBMS):是位于用户与操作系统之间的一层数据管理软件。
DBMS的用途:科学地组织和存储数据、高效地获取和维护数据
DBMS的主要功能:
数据库的运行管理
保证数据的安全性、完整性、
多用户对数据的并发使用
发生故障后的系统恢复
? 数据库的建立和维护功能(实用程序)
数据库数据批量装载
数据库转储
介质故障恢复
数据库的重组织
性能监视等
数据库系统(Database System,简称DBS)是指在计算机系统中引入数据库后的系统构成。 ? 数据库系统的构成
? 由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员(和用户)构成。
? 数据管理
? 对数据进行分类、组织、编码、存储、检索和维护,是数据处理的中心问题 数据模型这个工具来抽象、表示和处理现实世界中的数据和信息。
? 数据模型应满足三方面要求
? 能比较真实地模拟现实世界
? 容易为人所理解
? 便于在计算机上实现
? 数据模型分成两个不同的层次
(1) 概念模型 也称信息模型,它是按用户的观点来对数据和信息建模。
(2) 数据模型 主要包括网状模型、层次模型、关系模型等,它是按计算机系统的观点对数据建模。
? 客观对象的抽象过程---两步抽象
? 现实世界中的客观对象抽象为概念模型;
? 把概念模型转换为某一DBMS支持的数据模型。
? 数据结构
? 对象类型的集合
数据结构是对系统静态特性的描述
? 两类对象
? 与数据类型、内容、性质有关的对象
? 与数据之间联系有关的对象
? 数据操作
? 对数据库中各种对象(型)的实例(值)允许执行的操作及有关的操作规则 ? 数据操作的类型
? 检索
? 更新(包括插入、删除、修改)
? 数据模型对操作的定义
? 操作的确切含义
? 操作符号
? 操作规则(如优先级)
? 实现操作的语言
? 数据操作是对系统动态特性的描述。
? 数据模型对约束条件的定义
? 反映和规定本数据模型必须遵守的基本的通用的完整性约束条件。
提供定义完整性约束条件的机制,以反映具体应用所涉及的数据必须遵守的特定的语义约束条件。
信息世界中的基本概念
(1) 实体(Entity)
客观存在并可相互区别的事物称为实体。
(2) 属性(Attribute)
实体所具有的某一特性称为属性。
一个实体可以由若干个属性来刻画。
(3) 码(Key)
唯一标识实体的属性集称为码。
(4) 域(Domain)
属性的取值范围称为该属性的域。
(5) 实体型(Entity Type)
用实体名及其属性名集合来抽象和刻画
同类实体称为实体型
(6) 实体集(Entity Set)
同型实体的集合称为实体集
联系(Relationship)
现实世界中事物内部以及事物之间的联系在信息世界
中反映为实体内部的联系和实体之间的联系
实体型间联系
两个实体型 一对一联系(1:1)
三个实体型 一对多联系(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:n
概念模型的表示方法
? 实体-联系方法(E-R方法)
? 用E-R图来描述现实世界的概念模型
? E-R方法也称为E-R模型
常用数据模型
? 非关系模型
? 层次模型(Hierarchical Model)
? 网状模型(Network Model )
? 数据结构:以基本层次联系为基本单位
基本层次联系:两个记录以及它们之间的一对多(包括一对一)的联系
? 关系模型(Relational Model)
? 数据结构:表
? 面向对象模型(Object Oriented Model)
? 数据结构:对象
? 层次模型
满足下面两个条件的基本层次联系的集合为层次模型。
1. 有且只有一个结点没有双亲结点,这个结点称为根
结点
2. 根以外的其它结点有且只有一个双亲结点
? 表示方法
实体型:用记录类型描述。
每个结点表示一个记录类型。
属性:用字段描述。每个记录类型可包含若干个字段。
联系:用结点之间的连线表示记录(类)型之间的
一对多的联系
网状数据模型的数据结构
? 网状模型
满足下面两个条件的基本层次联系的集合为网状模型。
1. 允许一个以上的结点无双亲;
2. 一个结点可以有多于一个的双亲。
? 表示方法(与层次数据模型相同)
实体型:用记录类型描述。
每个结点表示一个记录类型。
属性:用字段描述。
每个记录类型可包含若干个字段。
联系:用结点之间的连线表示记录(类)型之
间的一对多的父子联系。
关系模型的基本概念
? 关系(Relation)
一个关系对应通常说的一张表。
? 元组(Tuple)
表中的一行即为一个元组。
? 属性(Attribute)
表中的一列即为一个属性,给每一个属性起一个名称即属性名。
? 关系必须是规范化的,满足一定的规范条件
最基本的规范条件:关系的每一个分量必须是一个不
可分的数据项。
? 查询、插入、删除、更新
? ? 存取路径对用户隐蔽,用户只要指出“干什么”,不必详细说明“怎么干” 关系模型的完整性约束
? 实体完整性
? 参照完整性
? 用户定义的完整性
关系数据模型的存储结构
? 表以文件形式存储
? 有的DBMS一个表对应一个操作系统文件
? 有的DBMS自己设计文件结构
关系模型的优缺点
? 优点
? 建立在严格的数学概念的基础上
? 概念单一。数据结构简单、清晰,用户易懂易用
? 实体和各类联系都用关系来表示。
? 对数据的检索结果也是关系。
? 关系模型的存取路径对用户透明
? 具有更高的数据独立性,更好的安全保密性
? 简化了程序员的工作和数据库开发建立的工作
? 缺点
存取路径对用户透明导致查询效率往往不如非
关系数据模型
为提高性能,必须对用户的查询请求进行优化
增加了开发数据库管理系统的难度
数据库系统外部的体系结构
? 单用户结构
? 主从式结构
? 分布式结构
? 客户/服务器结构
? 浏览器/应用服务器/数据库服务器结构
分布式结构的数据库系统
? 数据库中的数据在逻辑上是一个整体,但物理地分布在计算机网络的不同结点上。
? 网络中的每个结点都可以独立处理本地数据库中的数据,执行局部应用 ? 同时也可以同时存取和处理多个异地数据库中的数据,执行全局应用
? 优点
? 适应了地理上分散的公司、团体和组织对于数据库应用的需求。
? 缺点
? 数据的分布存放给数据的处理、管理与维护带来困难。
? 当用户需要经常访问远程数据时,系统效率会明显地受到网络传输的制约
数据库管理员(DBA)
? 决定数据库中的信息内容和结构
? 决定数据库的存储结构和存取策略
? 定义数据的安全性要求和完整性约束条件
关系数据库
? 关系模型的组成
? 关系数据结构
? 关系操作集合
? 关系完整性约束
? 1) 常用的关系操作
? 查询
? 选择、投影、连接、除、并、交、差
? 数据更新
? 插入、删除、修改
? 查询的表达能力是其中最主要的部分
? 2) 关系操作的特点
? 集合操作方式,即操作的对象和结果都是集合。
? 非关系数据模型的数据操作方式:一次一记录
? 文件系统的数据操作方式
? 3) 关系数据语言的种类
? 关系代数语言
? 用对关系的运算来表达查询要求
? 4) 关系数据语言的特点
? 关系语言是一种高度非过程化的语言
? 存取路径的选择由DBMS的优化机制来完成
? 用户不必用循环结构就可以完成数据操作
? 能够嵌入高级语言中使用
? 关系代数、元组关系演算和域关系演算三种语言在表达能力上完全等价
关系
? ⒈ 域(Domain)
? 2. 笛卡尔积(Cartesian Product)
? 3. 关系(Relation)
? 域是一组具有相同数据类型的值的集合。例:
? 整数
? 实数
? 介于某个取值范围的整数
? 长度指定长度的字符串集合
? {?男?,?女?}
? 介于某个取值范围的日期
? 笛卡尔积
给定一组域D1,D2,…,Dn,这些域中可以有相同的。D1,D2,…,Dn的笛卡尔积为: D1×D2×…×Dn={(d1,d2,…,dn)|di?Di,i=1,2,…,n}
? 所有域的所有取值的一个组合
? 不能重复
? 2) 元组(Tuple)
? 笛卡尔积中每一个元素(d1,d2,…,dn)叫作一个n元组(n-tuple)或简
称元组。
? 3) 分量(Component)
? 笛卡尔积元素(d1,d2,…,dn)中的每一个值di叫作一个分量。
? 4) 基数(Cardinal number)
? 若Di(i=1,2,…,n)为有限集,其基数为mi(i=1,2,…,n),则D1
×D2×…×Dn的基数M为:
? 5)笛卡尔积的表示方法
? 笛卡尔积可表示为一个二维表。表中的每行对应一个元组,表中的每列对应
一个域。
关系(Relation)
1) 关系
D1×D2×…×Dn的子集叫作在域D1,D2,…,Dn上的关系,表示为
R(D1,D2,…,Dn)
R:关系名
n:关系的目或度(Degree)
2) 元组
关系中的每个元素是关系中的元组,通常用t表示。
3) 单元关系与二元关系
当n=1时,称该关系为单元关系(Unary relation)。
当n=2时,称该关系为二元关系(Binary relation)
4) 关系的表示
关系也是一个二维表,表的每行对应一个元组,表的每列对应一个域。
5) 属性
关系中不同列可以对应相同的域,为了加以区分,必须对每列起一个名字,称为属性(Attribute)。
n目关系必有n个属性。
6) 码
候选码(Candidate key)
若关系中的某一属性组的值能唯一地标识
一个元组,则称该属性组为候选码
在最简单的情况下,候选码只包含一个属性。
称为全码(All-key)
在最极端的情况下,关系模式的所有属性组
是这个关系模式的候选码,称为全码(All-
key) 主码
若一个关系有多个候选码,则选定其中一个
为主码(Primary key) 主码的诸属性称为主属性(Prime attribute)。 不包含在任何侯选码中的属性称为非码属性
(Non-key attribute)
7) 三类关系 基本关系(基本表或基表)
实际存在的表,是实际存储数据的逻辑表示 查询表
查询结果对应的表 视图表
由基本表或其他视图表导出的表,是虚表,不对
应实际存储的数据
基本关系的性质
① 列是同质的(Homogeneous)
每一列中的分量是同一类型的数据,来自同
一个域
② 不同的列可出自同一个域
其中的每一列称为一个属性
不同的属性要给予不同的属性名
③ 列的顺序无所谓
列的次序可以任意交换
遵循这一性质的数据库产品(如ORACLE),
增加新属性时,永远是插至最后一列
但也有许多关系数据库产品没有遵循这一
性质,例如FoxPro仍然区分了属性顺序
④ 任意两个元组不能完全相同
由笛卡尔积的性质决定
但许多关系数据库产品没有遵循这一性质。 例如:
Oracle,FoxPro等都允许关系表中存在两个完全相同 的元组,除非用户特别定义了相应的约束条件。 ⑤ 行的顺序无所谓
行的次序可以任意交换
遵循这一性质的数据库产品(如ORACLE), 插入一个元组时永远插至最后一行
但也有许多关系数据库产品没有遵循这一性 质,例如FoxPro仍然区分了元组的顺序
⑥ 分量必须取原子值
每一个分量都必须是不可分的数据项。
这是规范条件中最基本的一条
关系模式(Relation Schema)是型
关系是值
关系模式是对关系的描述
元组集合的结构
属性构成
属性来自的域
属性与域之间的映象关系
元组语义以及完整性约束条件
属性间的数据依赖关系集合
定义关系模式
关系模式可以形式化地表示为:
R(U,D,dom,F)
R 关系名
U 组成该关系的属性名集合
D 属性组U中属性所来自的域 dom 属性向域的映象集合
F 属性间的数据依赖关系集合 关系模式通常可以简记为
R (U) 或 R (A1,A2,…,An) R 关系名
A1,A2,…,An 属性名
注:域名及属性向域的映象常常直接说明为 属性的类型、长度 关系模式
对关系的描述
静态的、稳定的 关系
关系模式在某一时刻的状态或内容
动态的、随时间不断变化的
关系模式和关系往往统称为关系
通过上下文加以区别
1. 关系数据库
在一个给定的应用领域中,所有实体及实
体之间联系的关系的集合构成一个关系数
据库。
2. 关系数据库的型与值
关系数据库也有型和值之分 关系数据库的型称为关系数据库模式,是对关系数据库的描述
若干域的定义
在这些域上定义的若干关系模式 关系数据库的值是这些关系模式在某一时刻对应的关系的集合,通常简称为关系数据库 3 关系的完整性
关系模型的完整性规则是对关系的某种约束条件。
关系模型中三类完整性约束:
实体完整性
参照完整性
用户定义的完整性
实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性,应该由关系系统自动支持。
实体完整性
实体完整性规则(Entity Integrity)
若属性A是基本关系R的主属性,则属性
A不能取空值
关系模型必须遵守实体完整性规则的原因
(1) 实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集或多对多联系。
(2) 现实世界中的实体和实体间的联系都是可区分的,即它们具有某种唯一性标识。
(3) 相应地,关系模型中以主码作为唯一性标识。
关系模型必须遵守实体完整性规则的原因(续)
(4) 主码中的属性即主属性不能取空值。
空值就是“不知道”或“无意义”的值。
主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第(2)点相矛盾,因此这个规则称为实体完整性。
注意
实体完整性规则规定基本关系的所有
主属性都不能取空值
参照完整性
1. 关系间的引用
2. 外码
3. 参照完整性规则
1. 关系间的引用
在关系模型中实体及实体间的联系都是用
关系来描述的,因此可能存在着关系与关
系间的引用。
2.外码(Foreign Key)
设F是基本关系R的一个或一组属性,但不
是关系R的码。如果F与基本关系S的主码
Ks相对应,则称F是基本关系R的外码
基本关系R称为参照关系(Referencing
Relation)
基本关系S称为被参照关系(Referenced
Relation)或目标关系(Target Relation)。
说明
? 关系R和S不一定是不同的关系
? 目标关系S的主码Ks 和参照关系的外码F必须定义在同一个(或一组)域上 ? 外码并不一定要与相应的主码同名
当外码与相应的主码属于不同关系时,往往 取相同的名字,以便于识别
3. 参照完整性规则
若属性(或属性组)F是基本关系R的外码
它与基本关系S的主码Ks相对应(基本关
系R和S不一定是不同的关系),则对
于R中每个元组在F上的值必须为:
? 或者取空值(F的每个属性值均为空值)
? 或者等于S中某个元组的主码值。
2.3.3 用户定义的完整性
? 用户定义的完整性是针对某一具体关系数据库的约束条件,反映某一具体应用所涉
及的数据必须满足的语义要求。
? 关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,
而不要由应用程序承担这一功能。
Operation 运算,操作
Operator 算子
Operand 操作数
1.关系代数
一种抽象的查询语言
用对关系的运算来表达查询
2.关系代数运算的三个要素
运算对象:关系
运算结果:关系
运算符:四类
关系代数运算符
4.关系代数运算的分类 传统的集合运算
并、差、交、广义笛卡尔积 专门的关系运算
选择、投影、连接、除 5.表示记号
(1) R,t?R,t[Ai]
设关系模式为R(A1,A2,…,An)
它的一个关系设为R。t?R表示t是R的一个元组 t[Ai]则表示元组t中相应于属性Ai的一个分量 (2) A,t[A], A
若A={Ai1,Ai2,…,Aik},其中Ai1,Ai2,…,Aik是A1,A2,…,An中的一部分,则A称为属性列或域列。t[A]=(t[Ai1],t[Ai2],…,t[Aik])表示元组t在属性列A上诸分量的集合。A则表示{A1,A2,…,An}中去掉{Ai1,Ai2,…,Aik}后剩余的属性组。
? (3) tr ts
R为n目关系,S为m目关系。tr ?R,ts?S, tr ts称为元组的连接。它是一个n + m列的元组,前n个分量为R中的一个n元组,后m个分量为S中的一个m元组。
? 4)象集Zx
给定一个关系R(X,Z),X和Z为属性组。当t[X]=x时,x在R中的象集(Images Set)为: Zx={t[Z]|t ?R,t[X]=x}
它表示R中属性组X上值为x的诸元组在Z上分量的集合。
1. 并(Union)
? R和S
? 具有相同的目n(即两个关系都有n个属性)
? 相应的属性取自同一个域
? R∪S
? 仍为n目关系,由属于R或属于S的元组组成
R∪S = { t|t ? R∨t ?S }
? R和S
? 具有相同的目n
? 相应的属性取自同一个域
? R - S
? 仍为n目关系,由属于R而不属于S的所有元组组成
R -S = { t|t?R∧t?S }
? R和S
? 具有相同的目n
? 相应的属性取自同一个域
? R∩S
? 仍为n目关系,由既属于R又属于S的元组组成
R∩S = { t|t ? R∧t ?S }
R∩S = R –(R-S)
4. 广义笛卡尔积(Extended Cartesian Product)
? R
? n目关系,k1个元组
? S
? m目关系,k2个元组
? R×S
? 列:(n+m)列的元组的集合
? 元组的前n列是关系R的一个元组
? 后m列是关系S的一个元组
? 行:k1×k2个元组
? R×S = {tr ts |tr ?R ∧ ts?S }
专门的关系运算
1. 选择(Selection)
? 1) 选择又称为限制(Restriction)
? 2) 选择运算符的含义
? 在关系R中选择满足给定条件的诸元组
σF(R) = {t|t?R∧F(t)= '真'}
? F:选择条件,是一个逻辑表达式,基本形式为:
[?( ] X1θY1 [ )][φ [?( ] X2θY2 [ )]]…
? θ:比较运算符(>,?,<,?,=或<>)
? X1,Y1等:属性名、常量、简单函数;属性名也可以用它的序号来
代替;
? φ:逻辑运算符(∧或∨)
? [ ]:表示任选项
? …:表示上述格式可以重复下去
3) 选择运算是从行的角度进行的运算
2. 投影(Projection)
? 1)投影运算符的含义
? 从R中选择出若干属性列组成新的关系
πA(R) = { t[A] | t ?R }
A:R中的属性列
2)投影操作主要是从列的角度进行运算
? 但投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免
重复行)
3. 连接(Join)
? 1)连接也称为θ连接
? 2)连接运算的含义
? 从两个关系的笛卡尔积中选取属性间满足一定条件的元组
R S = { | tr ? R∧ts ?S∧tr[A]θts[B] }
? A和B:分别为R和S上度数相等且可比的属性组
? θ:比较运算符
? 连接运算从R和S的广义笛卡尔积R×S中选取(R关系)在A属性组上
的值与(S关系)在B属性组上值满足比较关系的元组。
? 3)两类常用连接运算
? 等值连接(equijoin)
? 什么是等值连接
? θ为“=”的连接运算称为等值连接
? 等值连接的含义
? 从关系R与S的广义笛卡尔积中选取A、B属性值相等的那
些元组,即等值连接为:
R S = { | tr ?R∧ts ?S∧tr[A] = ts[B] }
4)一般的连接操作是从行的角度进行运算。
自然连接还需要取消重复列,所以是同时从行和列的角度进行运算。
4)象集Z
给定一个关系R(X,Z),X和Z为属性组。当t[X]=x时,x在R中的象集(Images Set)为: Zx={t[Z]|t ?R,t[X]=x}
它表示R中属性组X上值为x的诸元组在Z上分量的集合。
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]
2)除操作是同时从行和列角度进行运算
第三章 关系数据库标准语言SQL
3.1 SQL概述
? SQL的特点
? 1. 综合统一
? 2. 高度非过程化
? 3. 面向集合的操作方式
? 4. 以同一种语法结构提供两种使用方法
? 5. 语言简洁,易学易用
5. 语言简捷,易学易用
表3.1 SQL语言的动词
3.2 数 据 定 义
表3.2 SQL的数据定义语句
3.2.1 定义语句格式
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件>] ] …
[,<表级完整性约束条件> ] );
? <表名>:所要定义的基本表的名字
? <列名>:组成该表的各个属性(列)
? <列级完整性约束条件>:涉及相应属性列的完整性约束条件
? <表级完整性约束条件>:涉及一个或多个属性列的完整性约束条件 ? 常用完整性约束
? 主码约束: PRIMARY KEY
? 唯一性约束:UNIQUE
? 非空值约束:NOT NULL
? 参照完整性约束
三、删除基本表
DROP TABLE <表名>;
基本表删除 数据、表上的索引都删除
表上的视图往往仍然保留,但
删除基本表时,系统会从数据字典中删去有关该
基本表及其索引的描述
(标准中没有,认为表建立后就永久存在)
二、修改基本表
ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <完整性约束名> ]
[ MODIFY <列名> <数据类型> ];
? <表名>:要修改的基本表
? ADD子句:增加新列和新的完整性约束条件
? DROP子句:删除指定的完整性约束条件
? MODIFY子句:用于修改列名和数据类型
ALTER TABLE Student ADD Scome DATE;
不论基本表中原来是否已有数据,新增加的列一律为空值。
? 删除属性列
直接/间接删除
? 把表中要保留的列及其内容复制到一个新表中
? 删除原表
? 再将新表重命名为原表名
直接删除属性列:(新)
例:ALTER TABLE Student Drop Scome;
ALTER TABLE Student MODIFY Sage SMALLINT;
? 注:修改原有的列定义有可能会破坏已有数据
建立与删除索引
? 建立索引是加快查询速度的有效手段
? 建立索引
? DBA或表的属主(即建立表的人)根据需要建立 ? 有些DBMS自动建立以下列上的索引
? PRIMARY KEY
? UNIQUE
? 维护索引
? DBMS自动完成
? 使用索引
? DBMS自动选择是否使用索引以及使用哪些索引 无法引用
一、建立索引
? 语句格式
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
? 用<表名>指定要建索引的基本表名字
? 索引可以建立在该表的一列或多列上,各列名之间用逗号分隔
? 用<次序>指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC ? UNIQUE表明此索引的每一个索引值只对应唯一的数据记录
? CLUSTER表示要建立的索引是聚簇索引
? 唯一值索引
? 对于已含重复值的属性列不能建UNIQUE索引
? 对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在
该列上是否取了重复值。这相当于增加了一个UNIQUE约束
? 聚簇索引
? 建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存
放。也即聚簇索引的索引项顺序与表中记录的物理顺序一致
例:
CREATE CLUSTER INDEX Stusname ON
Student(Sname);
在Student表的Sname(姓名)列上建立一个聚簇索引,而
且Student表中的记录将按照Sname值的升序存放
? 在一个基本表上最多只能建立一个聚簇索引
? 聚簇索引的用途:对于某些类型的查询,可以提高查询效率
? 聚簇索引的适用范围
? 很少对基表进行增删操作
? 很少对其中的变长列进行修改操作
二、删除索引
DROP INDEX <索引名>;
? 删除索引时,系统会从数据字典中删去有关该索引的描述。
3.3 查 询
? 语句格式
SELECT [ALL|DISTINCT] <目标列表达式>
[,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
? SELECT子句:指定要显示的属性列
? FROM子句:指定查询对象(基本表或视图)
? WHERE子句:指定查询条件
? GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组
为一个组。通常会在每组中作用集函数。
? HAVING短语:筛选出只有满足指定条件的组
? ORDER BY子句:对查询结果表按指定列值的升序或降序排序
3.3.2 单表查询
查询仅涉及一个表,是一种最简单的查询操作
一、选择表中的若干列
二、选择表中的若干元组
三、对查询结果排序
四、使用集函数
五、对查询结果分组
查询经过计算的值
SELECT子句的<目标列表达式>为表达式
? 算术表达式
? 字符串常量
? 函数
? 列别名
? 等
二、选择表中的若干元组
? 消除取值重复的行
? 查询满足条件的元组
1. 消除取值重复的行
? 在SELECT子句中使用DISTINCT短语
假设SC表中有下列数据
2.查询满足条件的元组
WHERE子句常用的查询条件
(1) 比较大小
在WHERE子句的<比较条件>中使用比较运算符
? =,>,<,>=,<=,!= 或 <>,!>,!<,
? 逻辑运算符NOT + 比较运算符
(2) 确定范围
? 使用谓词 BETWEEN … AND …
NOT BETWEEN … AND …
(3) 确定集合
使用谓词 IN <值表>, NOT IN <值表>
<值表>:用逗号分隔的一组取值
(4) 字符串匹配
? [NOT] LIKE ?<匹配串>? [ESCAPE ? <换码字符>?]
<匹配串>:指定匹配模板
匹配模板:固定字符串或含通配符的字符串
当匹配模板为固定字符串时,
可以用 = 运算符取代 LIKE 谓词
用 != 或 < >运算符取代 NOT LIKE 谓词
通配符
? % (百分号) 代表任意长度(长度可以为0)的字符串
? 例:a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab
等都满足该匹配串
? _ (下横线) 代表任意单个字符
? 例:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等
都满足该匹配串
查询DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design'
ESCAPE '\'
(5) 涉及空值的查询
? 使用谓词 IS NULL 或 IS NOT NULL
? “IS NULL” 不能用 “= NULL” 代替
(6) 多重条件查询
用逻辑运算符AND和 OR来联结多个查询条件
? AND的优先级高于OR
? 可以用括号改变优先级
可用来实现多种其他谓词
? [NOT] IN
? [NOT] BETWEEN … AND …
三、对查询结果排序
使用ORDER BY子句
? 可以按一个或多个属性列排序
? 升序:ASC;降序:DESC;缺省值为升序
当排序列含空值时
? ASC:排序列为空值的元组最后显示
? DESC:排序列为空值的元组最先显示
四、使用集函数
5类主要集函数
? 计数
COUNT()
COUNT(列名>)
? 计算总和
SUM(列名>)
? 计算平均值
AVG(列名>)
求最大值
MAX(列名>)
求最小值
MIN(列名>)
– DISTINCT短语:在计算时要取消指定列中的重复值
– ALL短语:不取消重复值
– ALL为缺省值
五、对查询结果分组
使用GROUP BY子句分组
细化集函数的作用对象
? 未对查询结果分组,集函数将作用于整个查询结果
? 对查询结果分组后,集函数将分别作用于每个组
? GROUP BY子句的作用对象是查询的中间结果表
? 分组方法:按指定的一列或多列值分组,值相等的为一组
? 使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数 使用HAVING短语筛选最终输出结果
? 只有满足HAVING短语指定条件的组才输出
? HAVING短语与WHERE子句的区别:作用对象不同
? WHERE子句作用于基表或视图,从中选择满足条件的元组。
? HAVING短语作用于组,从中选择满足条件的组。
连接查询
同时涉及多个表的查询称为连接查询
用来连接两个表的条件称为连接条件或连接谓词
一般格式:
? [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2>
比较运算符:=、>、<、>=、<=、!=
? [<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3> ? 连接字段
? 连接谓词中的列名称为连接字段
? 连接条件中的各连接字段类型必须是可比的,但不必是相同的
连接操作的执行过程
? 嵌套循环法(NESTED-LOOP)
? 首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接
件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。
? 表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐
一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。
? 重复上述操作,直到表1中的全部元组都处理完毕
排序合并法(SORT-MERGE)
常用于=连接
? 首先按连接属性对表1和表2排序
? 对表1的第一个元组,从头开始扫描表2,顺序查找满足连接条件的元组,
找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。当遇到表2中第一条大于表1连接字段值的元组时,对表2的查询不再继续
? 找到表1的第二条元组,然后从刚才的中断点处继续顺序扫描表2,查找满
足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。直接遇到表2中大于表1连接字段值的元组时,对表2的查询不再继续
? 重复上述操作,直到表1或表2中的全部元组都处理完毕为止
索引连接(INDEX-JOIN)
? 对表2按连接字段建立索引
? 对表1中的每个元组,依次根据其连接字段值查询表2的索引,从中找到满
足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结
果表中一个元组
SQL中连接查询的主要类型
? 广义笛卡尔积
? 等值连接(含自然连接)
? 非等值连接查询
? 自身连接查询
? 外连接查询
? 复合条件连接查询
一、广义笛卡尔积
? 不带连接谓词的连接
? 很少使用
二、等值与非等值连接查询
等值连接
? 连接运算符为 = 的连接操作
? [<表名1>.]<列名1> = [<表名2>.]<列名2>
? 任何子句中引用表1和表2中同名属性时,都必须加表名前缀。引用唯一属
性名时可以加也可以省略表名前缀。
自然连接
? 等值连接的一种特殊情况,把目标列中重复的属性列去掉。
非等值连接查询
连接运算符 不是 = 的连接操作
三、自身连接
? 一个表与其自己进行连接,称为表的自身连接
? 需要给表起别名以示区别
? 由于所有属性名都是同名属性,因此必须使用别名前缀
四、外连接(Outer Join)
? 外连接与普通连接的区别
? 普通连接操作只输出满足连接条件的元组
? 外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输
出
? 在表名后面加外连接操作符(*)或(+)指定非主体表
? 非主体表有一“万能”的虚行,该行全部由空值组成
? 虚行可以和主体表中所有不满足连接条件的元组进行连接
? 由于虚行各列全部是空值,因此与虚行连接的结果中,来自非主体表的属性
值全部是空值
? 左外连接
? 外连接符出现在连接条件的左边
? 右外连接
? 外连接符出现在连接条件的右边
五、复合条件连接
WHERE子句中含多个连接条件时,称为复合条件连接
? 嵌套查询概述
? 一个SELECT-FROM-WHERE语句称为一个查询块
? 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件
中的查询称为嵌套查询
? 子查询的限制
? 不能使用ORDER BY子句
? 层层嵌套方式反映了 SQL语言的结构化
? 有些嵌套查询可以用连接运算替代
? 不相关子查询
子查询的查询条件不依赖于父查询
? 相关子查询
子查询的查询条件依赖于父查询
? 不相关子查询
是由里向外逐层处理。即每个子查询在
上一级查询处理之前求解,子查询的结果
用于建立其父查询的查找条件。
? 相关子查询
? 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内
层查询,若WHERE子句返回值为真,则取此元组放入结果表;
? 然后再取外层表的下一个元组;
? 重复这一过程,直至外层表全部检查完为止
引出子查询的谓词
? 带有IN谓词的子查询
? 带有比较运算符的子查询
? 带有ANY或ALL谓词的子查询
? 带有EXISTS谓词的子查询
一、带有IN谓词的子查询
二、带有比较运算符的子查询
● 当能确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=或< >)。 ? 与ANY或ALL谓词配合使用
三、带有ANY或ALL谓词的子查询
谓词语义
? ANY:任意一个值
? ALL:所有值
需要配合使用比较运算符
> ANY 大于子查询结果中的某个值
> ALL 大于子查询结果中的所有值
< ANY 小于子查询结果中的某个值
< ALL 小于子查询结果中的所有值
>= ANY 大于等于子查询结果中的某个值
>= ALL 大于等于子查询结果中的所有值
<= ANY 小于等于子查询结果中的某个值
<= ALL 小于等于子查询结果中的所有值
= ANY 等于子查询结果中的某个值
=ALL 等于子查询结果中的所有值(通常没有实际意义)
!=(或<>)ANY 不等于子查询结果中的某个值
!=(或<>)ALL 不等于子查询结果中的任何一个值
四、带有EXISTS谓词的子查询
1. EXISTS谓词
2. NOT EXISTS谓词
3. 不同形式的查询间的替换
4. 相关子查询的效率
5. 用EXISTS/NOT EXISTS实现全称量词
6. 用EXISTS/NOT EXISTS实现逻辑蕴函
● 1. EXISTS谓词
– 存在量词?
– 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑
假值“false”。
● 若内层查询结果非空,则返回真值
● 若内层查询结果为空,则返回假值
– 由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS
的子查询只返回真值或假值,给出列名无实际意义
● 2. NOT EXISTS谓词
3. 不同形式的查询间的替换
一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换
所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换。
5.用EXISTS/NOT EXISTS实现全称量词(难点)
? SQL语言中没有全称量词? (For all)
? 可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:
(?x)P ≡ ? (? x(? P))
6. 用EXISTS/NOT EXISTS实现逻辑蕴函(难点)
? SQL语言中没有蕴函(Implication)逻辑运算
? 可以利用谓词演算将逻辑蕴函谓词等价转换为:
p ? q ≡ ? p∨q
3.3.5 集合查询
标准SQL直接支持的集合操作种类
并操作(UNION)
一般商用数据库支持的集合操作种类
并操作(UNION)
交操作(INTERSECT)
差操作(MINUS)
1. 并操作
? 形式
<查询块>
UNION
<查询块>
? 参加UNION操作的各结果表的列数必须相同;对应项的数据类型也必须相
同
2. 交操作
标准SQL中没有提供集合交操作,但可用其他方法间接实现。
3. 差操作
4. 对集合操作结果的排序
? ORDER BY子句只能用于对最终查询结果排序,不能对中间结果排序 ? 任何情况下,ORDER BY子句只能出现在最后
? 对集合操作结果排序时,ORDER BY子句中用数字指定排序属性 ?
3.4 数据更新
3.4.1 插入数据
? 两种插入数据方式
? 插入单个元组
? 插入子查询结果
1. 插入单个元组
? 语句格式
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>] … )
? 功能
将新元组插入指定表中。
? INTO子句
? 指定要插入数据的表名及属性列
? 属性列的顺序可与表定义中的顺序不一致
? 没有指定属性列:表示要插入的是一条完整的元组,且属性列属性与表定义
中的顺序一致
? 指定部分属性列:插入的元组在其余属性列上取空值
? VALUES子句
? 提供的值必须与INTO子句匹配
> 值的个数
> 值的类型
2. 插入子查询结果
? 语句格式
INSERT
INTO <表名> [(<属性列1> [,<属性列2>… )]
子查询;
? 功能
将子查询结果插入指定表中
INSERT
INTO Deptage(Sdept,Avgage)
SELECT Sdept,AVG(Sage) FROM Student
GROUP BY Sdept;
? INTO子句(与插入单条元组类似)
? 指定要插入数据的表名及属性列
? 属性列的顺序可与表定义中的顺序不一致
? 没有指定属性列:表示要插入的是一条完整的元组 ? 指定部分属性列:插入的元组在其余属性列上取空值 ? 子查询
? SELECT子句目标列必须与INTO子句匹配
? 值的个数
? 值的类型
3.4.2 修改数据
? 语句格式
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
[WHERE <条件>];
? 功能
修改指定表中满足WHERE子句条件的元组
? 三种修改方式
? 修改某一个元组的值
? 修改多个元组的值
? 带子查询的修改语句
UPDATE SC
SET Grade=0
WHERE 'CS'=
(SELETE Sdept
FROM Student
WHERE Student.Sno = SC.Sno);
? SET子句
指定修改方式
要修改的列
修改后取值
? WHERE子句
指定要修改的元组
缺省表示要修改表中的所有元组
DBMS在执行修改语句时会检查修改操作
是否破坏表上已定义的完整性规则
? 实体完整性
? 主码不允许修改
? 用户定义的完整性
? NOT NULL约束
? UNIQUE约束
? 值域约束
DELETE
FROM <表名>
[WHERE <条件>];
– 功能
? 删除指定表中满足WHERE子句条件的元组
– WHERE子句
? 指定要删除的元组
? 缺省表示要修改表中的所有元组
– 三种删除方式
? 删除某一个元组的值
? 删除多个元组的值
? 带子查询的删除语句
DBMS在执行插入语句时会检查所插元组
是否破坏表上已定义的完整性规则
– 参照完整性
? 不允许删除
? 级联删除
更新数据与数据一致性
DBMS在执行插入、删除、更新语句时必
须保证数据库一致性
? 必须有事务的概念和原子性
? 完整性检查和保证
3.5 视 图
视图的特点
? 虚表,是从一个或几个基本表(或视图)导出的表 ? 只存放视图的定义,不会出现数据冗余
? 基表中的数据发生变化,从视图中查询出的数据也随之改变 基于视图的操作
? 查询
? 删除
? 受限更新
? 定义基于该视图的新视图
1. 建立视图
? 语句格式
CREATE VIEW
<视图名> [(<列名> [,<列名>]…)] AS <子查询>
[WITH CHECK OPTION];
DBMS执行CREATE VIEW语句时只是把
视图的定义存入数据字典,并不执行其中
的SELECT语句。
在对视图查询时,按视图的定义从基本表
中将数据查出。
组成视图的属性列名
全部省略或全部指定
? 省略:
由子查询中SELECT目标列中的诸字段组成
? 明确指定视图的所有列名:
(1) 某个目标列是集函数或列表达式
(2) 目标列为 *
(3) 多表连接时选出了几个同名列作为视图的字段
(4) 需要在视图中为某个列启用新的更合适的名字
? WITH CHECK OPTION
透过视图进行增删改操作时,不得破坏视
图定义中的谓词条件
(即子查询中的条件表达式)
带表达式的视图
定义一个反映学生出生年份的视图。
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2000-Sage
FROM Student
设置一些派生属性列, 也称为虚拟列--Sbirth
带表达式的视图必须明确定义组成视图的各个属
性列名
? 一类不易扩充的视图
? 以 SELECT * 方式创建的视图可扩充性差,应尽可能避免
2. 删除视图
? DROP VIEW <视图名>;
? 该语句从数据字典中删除指定的视图定义
? 由该视图导出的其他视图定义仍在数据字典中,但已不能使用,必须显式删
除
? 删除基表时,由该基表导出的所有视图定义都必须显式删除
3.5.2 查询视图
? 从用户角度:查询视图与查询基本表相同
? DBMS实现视图查询的方法
? 实体化视图(View Materialization)
? 有效性检查:检查所查询的视图是否存在
? 执行视图定义,将视图临时实体化,生成临时表
? 查询视图转换为查询临时表
? 查询完毕删除被实体化的视图(临时表)
? 视图消解法(View Resolution)
? 进行有效性检查,检查查询的表、视图等是否存在。如果存在,则
从数据字典中取出视图的定义
? 把视图定义中的子查询与用户的查询结合起来,转换成等价的对基
本表的查询
? 执行修正后的查询
? 视图实体化法
? 视图消解法
3.5.3 更新视图
? 用户角度:更新视图与更新基本表相同
? DBMS实现视图更新的方法
? 视图实体化法(View Materialization)
? 视图消解法(View Resolution)
? 指定WITH CHECK OPTION子句后
DBMS在更新视图时会进行检查,防止用户通过视图对不属于视图范围内的基本表数据进行更新
更新视图的限制
? 一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应
基本表的更新(对两类方法均如此)
? 允许对行列子集视图进行更新
? 对其他类型视图的更新不同系统有不同限制
DB2对视图更新的限制:
(1) 若视图是由两个以上基本表导出的,则此视图不允许更新。
(2) 若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作。
若视图的字段来自集函数,则此视图不允许更新。
(4) 若视图定义中含有GROUP BY子句,则此视图不允许更新。
(5) 若视图定义中含有DISTINCT短语,则此视图不允许更新。
(6) 若视图定义中有嵌套查询,并且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。
(7) 一个不允许更新的视图上定义的视图也不允许更新
视图对重构数据库提供了一定程度的逻辑独立性
? 物理独立性与逻辑独立性的概念
? 视图在一定程度上保证了数据的逻辑独立性
? 视图只能在一定程度上提供数据的逻辑独立性
? 由于对视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因
基本表结构的改变而改变。
视图能够对机密数据提供安全保护
? 对不同用户定义不同视图,使每个用户只能看到他有权看到的数据
? 通过WITH CHECK OPTION对关键数据定义操作时间限制
3.6 数据控制
? 3.6.1 授权
? 3.6.2 收回权限
数据控制亦称为数据保护,包括数据的:
? 安全性控制
? 完整性控制
? 并发控制
? 恢复
SQL语言的数据控制功能
SQL语言提供了数据控制功能,能够在一定程度上保证数据库中数据的完全性、完整性,并提供了一定的并发控制及恢复能力。
1. 完整性
? 数据库的完整性是指数据库中数据的正确性与相容性。
? SQL语言定义完整性约束条件
CREATE TABLE语句
ALTER TABLE语句
? 码
? 取值唯一的列
? 参照完整性
? 其他约束条件
2. 并发控制
? 并发控制: 当多个用户并发地对数据库进行操作时,对他们加以控制、协调,以保
证并发操作正确执行,保持数据库的一致性。
? SQL语言并发控制能力:
提供事务、事务开始、事务结束、提交等概念
3. 恢复
? 恢复: 当发生各种类型的故障导致数据库处于不一致状态时,将数据库恢复到一致
状态的功能。
? SQL语言恢复功能:
提供事务回滚、重做等概念
(UNDO、REDO)
4. 安全性
? 安全性:保护数据库,防止不合法的使用所造成的数据泄露和破坏。
? 保证数据安全性的主要措施
存取控制:控制用户只能存取他有权存取的数据
规定不同用户对于不同数据对象所允许执行的操作
DBMS实现数据安全性保护的过程
? 用户或DBA把授权决定告知系统
? SQL的GRANT和REVOKE
? DBMS把授权的结果存入数据字典
? 当用户提出操作请求时,DBMS根据授权定义进行检查,以决定是否执行操作请求
3.6.1 授 权
? GRANT语句的一般格式:
GRANT <权限>[,<权限>]...
[ON <对象类型> <对象名>]
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
? 谁定义?DBA和表的建立者(即表的属主)
? REVOKE功能:将对指定操作对象的指定操作权限授予指定的用户。
(1) 操作权限
(2) 用户的权限
? 建表(CREATETAB)的权限:属于DBA
? DBA授予-->普通用户
? 基本表或视图的属主拥有对该表或视图的一切操作权限
? 接受权限的用户:
一个或多个具体用户
PUBLIC(全体用户)
(4) WITH GRANT OPTION子句
? 指定了WITH GRANT OPTION子句:
获得某种权限的用户还可以把这种权限再授予别的用户。
? 没有指定WITH GRANT OPTION子句:
获得某种权限的用户只能使用该权限,不能传播该权限
查询Student表权限授给用户U1
GRANT SELECT
ON TABLE Student
TO U1;
把对Student表和Course表的全部权限授予用户U2和U3
GRANT ALL PRIVILIGES
ON TABLE Student, Course
TO U2, U3;
3.6.2 收回权限
? REVOKE语句的一般格式为:
REVOKE <权限>[,<权限>]...
[ON <对象类型> <对象名>]
FROM <用户>[,<用户>]...;
? 功能:从指定用户那里收回对指定对象的指定权限
3.7 嵌 入 式 SQL
? SQL语言提供了两种不同的使用方式:
? 交互式
? 嵌入式
? 为什么要引入嵌入式SQL
? SQL语言是非过程性语言
? 事务处理应用需要高级语言
? 这两种方式细节上有差别,在程序设计的环境下,SQL语句要做某些必要的扩充
3.7.1嵌入式SQL的一般形式
? 为了区分SQL语句与主语言语句,需要:
? 前缀:EXEC SQL
? 结束标志:随主语言的不同而不同
? 以C为主语言的嵌入式SQL语句的一般形式
EXEC SQL <SQL语句>;
DBMS处理宿主型数据库语言SQL 的方法
? 预编译
? 修改和扩充主语言使之能处理SQL语句
预编译
1.由DBMS的预处理程序对源程序进行扫描,识别出SQL语句
2.把它们转换成主语言调用语句,以使主语言编译程序能识别它
3.最后由主语言的编译程序将整个源程序编译成目标码。
嵌入SQL语句
说明性语句
嵌入SQL语句 数据定义
可执行语句 数据控制
数据操纵
? 允许出现可执行的高级语言语句的地方,都可以写可执行SQL语句
? 允许出现说明语句的地方,都可以写说明性SQL语句
3.7.2 嵌入式SQL语句与主语言之间的通信
将SQL嵌入到高级语言中混合编程,程序中会含
有两种不同计算模型的语句
? SQL语句
? 描述性的面向集合的语句
? 负责操纵数据库
? 高级语言语句
? 过程性的面向记录的语句
? 负责控制程序流程
工作单元之间的通信方式
1. SQL通信区
向主语言传递SQL语句的执行状态信息
主语言能够据此控制程序流程
2. 主变量
1)主语言向SQL语句提供参数
2)将SQL语句查询数据库的结果交主语言进一步处理
3. 游标
解决集合性操作语言与过程性操作语言的不匹配
? 为什么要使用游标
? SQL语言与主语言具有不同数据处理方式
? SQL语言是面向集合的,一条SQL语句原则上可以产生或处理多条记录 ? 主语言是面向记录的,一组主变量一次只能存放一条记录
? 仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求 ? 嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式 ? 什么是游标
? 游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果 ? 每个游标区都有一个名字
? 用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言
进一步处理
? 使用游标的步骤
? 1. 说明游标
? 2. 打开游标
? 3. 移动游标指针,然后取当前记录
? 4. 关闭游标
1. 说明游标
? 使用DECLARE语句
? 语句格式
EXEC SQL DECLARE <游标名> CURSOR
FOR <SELECT语句>;
? 功能
? 是一条说明性语句,这时DBMS并不执行SELECT指定的查询操作。
2. 打开游标
? 使用OPEN语句
? 语句格式
EXEC SQL OPEN <游标名>;
? 功能
? 打开游标实际上是执行相应的SELECT语句,把所有满足查询条件的记录
从指定表取到缓冲区中
? 这时游标处于活动状态,指针指向查询结果集中第一条记录之前
3. 移动游标指针,然后取当前记录
? 使用FETCH语句
? 语句格式
EXEC SQL FETCH [[NEXT|PRIOR|
FIRST|LAST] FROM] <游标名>
INTO <主变量>[<指示变量>]
[,<主变量>[<指示变量>]]...;
? 功能
? 指定方向推动游标指针,然后将缓冲区中的当前记录取出来送至主变量供主
语言进一步处理。
? NEXT|PRIOR|FIRST|LAST:指定推动游标指针的方式。
?
?
?
?
? NEXT:向前推进一条记录 PRIOR:向回退一条记录 FIRST:推向第一条记录 LAST:推向最后一条记录 缺省值为NEXT
? 说明
? (1) 主变量必须与SELECT语句中的目标列表达式具有一一对应关系
? (2) FETCH语句通常用在一个循环结构中,通过循环执行FETCH语句逐条
取出结果集中的行进行处理
? (3) 为进一步方便用户处理数据,现在一些关系数据库管理系统对FETCH
语句做了扩充,允许用户向任意方向以任意步长移动游标指针
4. 关闭游标
? 使用CLOSE语句
? 语句格式
EXEC SQL CLOSE <游标名>;
? 功能
? 关闭游标,释放结果集占用的缓冲区及其他资源
? 说明
? 游标被关闭后,就不再和原来的查询结果集相联系
? 被关闭的游标可以再次被打开,与新的查询结果相联系
第四章 关系系统及其查询优化
4.1 关系系统
? 能够在一定程度上支持关系模型的数据库管理系统是关系系统。 ? 由于关系模型中并非每一部分都是同等重要的
? 并不苛求一个实际的关系系统必须完全支持关系模型。
? 关系数据结构
? 域及域上定义的关系
? 关系操作
? 并、交、差、广义笛卡尔积、选择、投影、连接、除等
? 关系完整性
? 实体完整性、参照完整性、用户自己定义的完整性
一个数据库管理系统可定义为关系系统,当且仅
当它至少支持:
1. 关系数据库(即关系数据结构)
系统中只有表这种结构
2. 支持选择、投影和(自然)连接运算
对这些运算不要求用户定义任何物理存取路径
对关系系统的最低要求
4.2 关系系统的查询优化
4.2.1 查询优化概述
? 查询优化的必要性
? 查询优化极大地影响RDBMS的性能。
? 查询优化的可能性
? 关系数据语言的级别很高,使DBMS可以从关系表达式中分析查询语义。 ? 用户不必考虑如何最好地表达查询以获得较好的效率
? 系统可以比用户程序的优化做得更好
(1) 优化器可以从数据字典中获取许多统计信息,而用户程序则难以获得这些信息
(2)如果数据库的物理统计信息改变了,系统可以自动对查询重新优化以选择相适应的执行计划。
在非关系系统中必须重写程序,而重写程序在实际应用中往往是不太可能的。
(3)优化器可以考虑数百种不同的执行计划,而程序员一般只能考虑有限的几种可能性。
(4)优化器中包括了很多复杂的优化技术
? 查询优化的总目标
选择有效策略,求得给定关系表达式的值
? 实际系统的查询优化步骤
1. 将查询转换成某种内部表示,通常是语法树
2. 根据一定的等价变换规则把语法树转换成标准
(优化)形式
3. 选择低层的操作算法
对于语法树中的每一个操作
? 计算各种执行算法的执行代价
? 选择代价小的执行算法
4. 生成查询计划(查询执行方案)
? 查询计划是由一系列内部操作组成的。
4.2.4 关系代数等价变换规则
? 关系代数表达式等价
? 指用相同的关系代替两个表达式中相应的关系所得到的结果是相同的
? 上面的优化策略大部分都涉及到代数表达式的变换
4.2.6 优化的一般步骤
1.把查询转换成某种内部表示
2.代数优化:把语法树转换成标准(优化)
形式
3.物理优化:选择低层的存取路径
4.生成查询计划,选择代价最小的
第五章 关系数据理论
二、关系模式的形式化定义
关系模式由五部分组成,即它是一个五元组:
R(U, D, DOM, F)
R: 关系名
U: 组成该关系的属性名集合
D: 属性组U中属性所来自的域
DOM:属性向域的映象集合
F: 属性间数据的依赖关系集合
三、什么是数据依赖
1. 完整性约束的表现形式
? 限定属性取值范围:
? 定义属性值间的相互关连(主要体现于值的相等与否),这就是数据依赖,它是数
据库模式设计的关键
2. 数据依赖
? 是通过一个关系中属性间值的相等与否体现出来的数据间的相互关系
? 是现实世界属性间相互联系的抽象
? 是数据内在的性质
? 是语义的体现
3. 数据依赖的类型
? 函数依赖(Functional Dependency,简记为FD)
? 多值依赖(Multivalued Dependency,简记为MVD)
? 其他
四、关系模式的简化表示
● 关系模式R(U, D, DOM, F)
简化为一个三元组:
R(U, F)
● 当且仅当U上的一个关系r 满足F时,r称为关系模式 R(U, F)的一个关系
五、数据依赖对关系模式的影响
⒈ 数据冗余太大
? 浪费大量的存储空间
例:每一个系主任的姓名重复出现
⒉ 更新异常(Update Anomalies)
? 数据冗余 ,更新数据时,维护数据完整性代价大。
例:某系更换系主任后,系统必须修改与该系学生有关的每一个元组
⒊ 插入异常(Insertion Anomalies)
? 该插的数据插不进去
例,如果一个系刚成立,尚无学生,我们就无法把这个系及其系主任的信息存入数据库。
⒋ 删除异常(Deletion Anomalies)
? 不该删除的数据不得不删
原因:由存在于模式中的某些数据依赖引起的
解决方法:通过分解关系模式来消除其中不合适
的数据依赖。
5.2 规范化
5.2.1 函数依赖
一、函数依赖
定义5.1 设R(U)是一个属性集U上的关系模式,X和Y是U的子集。
若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称 “X函数确定Y” 或 “Y函数依赖于X”,记作X→Y。 X称为这个函数依赖的决定属性集(Determinant)。
Y=f(x)
1. 函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
2. 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。
例如“姓名→年龄”这个函数依赖只有在不允许有同名人的条件下成立
3. 数据库设计者可以对现实世界作强制的规定。
二、平凡函数依赖与非平凡函数依赖
在关系模式R(U)中,对于U的子集X和Y,
如果X→Y,但Y Not ? X,则称X→Y是非平凡的函数依赖
若X→Y,但Y ? X, 则称X→Y是平凡的函数依赖
在关系SC(Sno, Cno, Grade)中,
非平凡函数依赖: (Sno, Cno) → Grade
平凡函数依赖: (Sno, Cno) → Sno
(Sno, Cno) → Cno
三、完全函数依赖与部分函数依赖
定义5.2 在关系模式R(U)中,如果X→Y,并且对于X的任何一个真子集X’,都有 X’ Y, 则称Y完全函数依赖于X,记作X Y。
若X→Y,但Y不完全函数依赖于X,则称Y部分函数依赖于X,记作X Y。
四、传递函数依赖
定义5.3 在关系模式R(U)中,如果X→Y,Y\→Z,且Y \?X,Y→X,则称Z传递函数依赖于X。
注: 如果Y→X, 即X←→Y,则Z直接依赖于X。
5.2.2 码
定义5.4 设K为关系模式R<U,F>中的属性或属性组合。若K f U,则K称为R的一个侯选码(Candidate Key)。若关系模式R有多个候选码,则选定其中的一个做为主码(Primary key)。
? 主属性与非主属性
? ALL KEY
外部码
定义5.5 关系模式 R 中属性或属性组X 并非 R的码,但 X 是另一个关系模式的码,则称 X 是R 的外部码(Foreign key)也称外码
5.2.3 范式
某一关系模式R为第n范式,可简记为R∈nNF。
5.2.4 2NF
? 1NF的定义
如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。
? 第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关
系数据库。
(1) 插入异常
(2) 删除异常
(3) 数据冗余度大
(4) 修改复杂
? 2NF的定义
定义5.6 若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF。
? 3NF的定义
定义5.8 关系模式R<U,F> 中若不存在这样的码X、属性组Y及非主属性Z(Z\ ?
Y), 使得X→Y,Y \→ X,Y→Z,成立,则称R<U,F> ∈ 3NF。
? 若R∈3NF,则R的每一个非主属性既不部分函数依赖于候选码也不传递函数依赖
于候选码。
? 如果R∈3NF,则R也是2NF。
? 采用投影分解法将一个2NF的关系分解为多个3NF的关系,可以在一定程度上解
决原2NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。 ? 将一个2NF关系分解为多个3NF的关系后,并不能完全消除关系模式中的各种异
常情况和数据冗余。
5.2.6 BC范式(BCNF)
? 定义5.9 设关系模式R<U,F>∈1NF,如果对于R的每个函数依赖X→Y,若Y
不属于X,则X必含有候选码,那么R∈BCNF。
若R∈BCNF
? 每一个决定属性集(因素)都包含(候选)码
? R中的所有属性(主,非主属性)都完全函数依赖于码
? R∈3NF(证明)
? 若R∈3NF 则 R不一定∈BCNF
STJ∈3NF
? (S,J)和(S,T)都可以作为候选码
? S、T、J都是主属性
STJ\∈BCNF
? T→J,T是决定属性集,T不是候选码
解决方法:将STJ分解为二个关系模式:
∈ BCNF, J)∈ BCNF
没有任何属性对码的部分函数依赖和传递函数依赖
3NF与BCNF的关系
? 如果关系模式R∈BCNF,
必定有R∈3NF
? 如果R∈3NF,且R只有一个候选码,
则R必属于BCNF。
BCNF的关系模式所具有的性质
⒈ 所有非主属性都完全函数依赖于每个候选码
⒉ 所有主属性都完全函数依赖于每个不包含它的候选码
⒊ 没有任何属性完全函数依赖于非码的任何一组属性
5.2.5 多值依赖与第四范式(4NF)
一、多值依赖
? 定义5.10
设R(U)是一个属性集U上的一个关系模式, X、 Y和Z是U的子集,并且Z=U-X-Y,多值依赖 X→→Y成立当且仅当对R的任一关系r,r在(X,Z)上的每个值对应一组Y的值,这组值仅仅决定于X值而与Z值无关
? 平凡多值依赖和非平凡的多值依赖
? 若X→→Y,而Z=φ,则称
X→→Y为平凡的多值依赖
? 否则称X→→Y为非平凡的多值依赖
多值依赖的性质
(1)多值依赖具有对称性
若X→→Y,则X→→Z,其中Z=U-X-Y
多值依赖的对称性可以用完全二分图直观地表示出来。
(2)多值依赖具有传递性
若X→→Y,Y→→Z, 则X→→Z -Y
3)函数依赖是多值依赖的特殊情况。
若X→Y,则X→→Y。
(4)若X→→Y,X→→Z,则X→→Y? Z。
(5)若X→→Y,X→→Z,则X→→Y∩Z。
(6)若X→→Y,X→→Z,则X→→Y-Z, X→→Z -Y。
二、第四范式(4NF)
? 定义5.10 关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→
Y(Y\ ? X),X都含有候选码,则R∈4NF。
(X→Y)
? 如果R ∈ 4NF, 则R ∈ BCNF
不允许有非平凡且非函数依赖的多值依赖
允许的是函数依赖(是非平凡多值依赖)