1、第1部分 数据库系统基础第2章 关系模型与关系数据库,高级数据库系统及其应用,2018/11/4,2,第2章 关系模型与关系数据库,关系数据模型,2.1,关系操作与关系查询语言,2.2,SQL语言,2.3,应用关系数据库,2.4,2018/11/4,3,2.1 关系数据模型,2.1.1 关系模型基础,2.1.2 关系模型的约束及其表达,2.1.3 关系数据库,2018/11/4,4,2.1.1 关系模型基础,关系(表) 关系模型将数据库表示为一组“关系(relation)”的集合。每个关系好比一个具有多个行(row)和多个列(column)的二维值表(table)。 每个关系含两部分信息:关系
2、模式(relation schema)和关系实例(relation instance)。 在正式的关系模型术语中 表行:被称为记录(record)或元组(tuple) 表列标题:被称为属性(attribute)或字段(field) 。,2018/11/4,5,一个简单关系表的关系模式和关系实例示例(图2.1),2018/11/4,6,其它几个重要的关系模型概念(1),属性域 在关系模型中,必须为每个属性指定一个域(domain)。 关系模式(relation schema) 指一个关系的基本模式结构定义。 形式上,名为R的关系模式可表示为: R(A1:dom(A1),An:dom(An) 关系
3、实例(关系状态) 关系的每个数据行称为一个元组,可形式表示为 t =, 关系的实例(状态)是一个元组集或记录集,可形式表示为: r(R)=t1, t2, , tn,2018/11/4,7,其它几个重要的关系模型概念(2),关系数据库模式 (Schema, S) 指由一个关系模式集R1,R2,Rn和一个关系约束集ICs构成的定义集; S=R1,R2,Rn+ICs。 关系数据库状态 指特定时刻DB中所有关系状态的集合,即DB=r1,r2,rn,其中,ri是关系Ri的状态。 关系数据库 关系数据库(RDB),是采用关系模型来表示数据的数据库。RDB的一个状态也称为一个RDB实例。,2018/11/4
4、,8,2.1.2 关系模型的约束及其表达,完整性约束(Integrity Constraints, ICs) DBMS必须能强制实施与DB模式有关的所有约束,以限制允许存储到DB的数据,确保DB中只有满足约束的合法数据。 ICs的主要类型包括域约束、主键约束和外键约束,它们常被统称为基于模式的约束。 键约束 超键(superkey,SK)的概念 能唯一标识关系R中每个元组的一个属性子集 超键中可能会有冗余属性 候选键(Candidate Key) 没有冗余属性的超键,2018/11/4,9,引用完整性约束,引用完整性约束(referential integrity constraint) 指要
5、在两不同关系之间指定,用来维护两关系元组间一致性的一种关系模型约束。 该约束指定:当某关系元组引用另一个关系中元组时,只能引用已经存在的元组。 外键(Foreign Key,FK)定义 外键条件指定了两个关系模式R1和R2之间的一个引用完整性约束,或简称为外键约束。,2018/11/4,10,约束指定应用实例,2018/11/4,11,2.2 关系操作与关系查询语言,2.2.1 关系代数,2.2.2 关系演算,本章查询表达说明用例模式( “水手值勤服务”) Sailors(sid:integer, sname:string, rating:integer, age:integer); Boat
6、s(bid:integer, bname:string, color:string); Reserves(sid:integer, bid:integer, day:date);,关系查询语言的两种属性引用方法: (1) 属性名 (2) 属性在关系模式中的位置或顺序号,2018/11/4,12,“水手值勤服务”的一个简单模式实例,2018/11/4,13,2.2.1 关系代数,关系代数由一组操作符构成。每个操作符接受1或2个关系实例作为参数,返回一个关系实例作为结果。以下三个方面因素,可突显关系代数在RDBMS中的重要性和地位: 它为关系模型操作提供了一个形式化的基础; 是RDBMS查询实现和
7、优化的基础; SQL结合并保留了很多关系代数的基本概念 关系代数操作符的两种主要类型: 基于集合论的操作,包括并、交、差和叉积等,这些操作的适用性源于“关系”本质上是元组集合; 另一类操作则是专门为RDBMS开发的操作,包括选择、投影、连接,以及为聚合运算引入的相关操作。,2018/11/4,14,1. 并、交、差运算,并、交、差这三个运算操作都可对应到集合论操作,它们都属于二元操作符,要求有两个被操作对象,且要求这两个关系是相容的。 并(RS): RS=t | tR tS 交(RS): RS=t | tR tS 差(RS): RS=t | tR tS ,2018/11/4,15,2. 叉积操
8、作,叉积,也称为笛卡儿积(cartesian product),操作符用表示,属于二元关系操作符,代数表达式为RS。,2018/11/4,16,3. 选择操作与投影操作,选择操作符表示为c(R) ,其中,c为条件表达式。 投影操作符表示为 L(R) ,其中,L为投影输出的属性子集列表A1,Am。,2018/11/4,17,4. 重命名操作,在许多场合,输出列名可以直接使用输入关系的属性名。但当输出列为表达式,或二元操作两个输入关系中含同名属性,或希望改善原属性名的可读性等,都需要重命名机制。 关系代数中引入了一个重命名操作符(),其代数表达形式为: ( R(A1A1, , AiAi,), E
9、) 例2.6 基于图2.4(d) 的S1R1,写出表达式 ( R(1sid1, 5sid2), S1R1) 返回的R模式。,2018/11/4,18,5. 连接操作,连接操作(c),用来合并两个关系中的信息将两关系中相关的“元组对”合并成一个元组输出。 虽然在概念上,RcS = L(c(RS);但按这种方法实现连接操作的效率很低。在RDBMS中,连接操作通常以独立于叉积结果的方法实现。,2018/11/4,19,6. 消除重复与排序运算,消除重复运算的表达式为 (RB),其操作对象可以是包型关系或集合型关系。 消除重复是一个代价较大的操作,故在很多实际系统中,默认情况下的投影输出都不自动消除重
10、复。 排序操作的代数符号表达式为T L(R)。该操作用来将关系R的所有元组,按L所指定方式排序输出。 L是一个属性表达列表,具有形如A1 asc|desc, A2 asc|desc, 的形式,2018/11/4,20,7. 分组与聚合操作,分组(grouping)与聚合(aggregating)操作的代数表达式为L(R),该操作将关系R的所有元组按L指定方式进行分组。 L是一个列表表达式。 聚合关系与原关系R一般具有不同的模式结构。 聚合关系中的属性,必须或者是出现L中的属性,或是一个聚合函数表达式。 很多DB书籍或文献中,都将aggregating运算译为聚集。本书中,考虑到已将cluste
11、ring译为聚簇、聚集。为避免混淆,同时也考虑到合计汇总运算这个语义,故采用聚合这个译法。,2018/11/4,21,2.2.2 关系演算(relational calculus),关系演算为关系DB查询提供了一种高级描述性表示法。 它是一种形式化语言,其基础是被称为谓词(predicate)演算的数理逻辑分支一阶谓词逻辑(First Order Logic, FOL)。 在演算表达式中,不需给出如何应获取结果的操作次序指示信息,只描述了结果中应当包括的信息。 关系演算表达式描述了一个新的关系,这个新关系以变量形式来指定,变量取值范围可是是新关系中的元组(元组演算),或是新关系中的属性域(域演
12、算)。 元组演算对商业化关系查询语言SQL发展有重要影响; 域演算则是QBE (Query-By-Example语言)的基础。,2018/11/4,22,元组关系演算(Tuple Relational Calculus,TRC),元组变量 是取值范围限为特定关系元组的变量。 TRC查询的基本表达形式 t | p(t), t 代表一个元组变量,而p(t)则是t应当满足的逻辑公式。 查询结果是能使逻辑公式p(t)为真值的所有元组t集合。 构造TRC查询表达的核心任务是给出逻辑公式p(t), 本质上TRC逻辑公式是FOL公式的一个子集。 应用举例 要检索职级超过7的水手, TRC表达为:S |SSa
13、ilors S.rating 7,2018/11/4,23,TRC原子公式,是下面形式之一: R Rel 是最基本原子公式,表达元组变量R的取值。 R.a op S.b 或 R.a op const 或 const op R.a 是比较型原子公式,表达R在其指定属性上的取值限定。 任何TRC公式可由如下任一方法递归地构造产生: 任何一个原子公式。 p(取反), p q (与连接构造), p q (或连接构造), pq(蕴涵: 若p为真,q必为真)。 R(p(R),R是元组变量。 R(p(R),R是元组变量。,TRC查询的语法与语义,令Rel是关系名; 逻辑操作符op , =,;R和S是元组变量
14、,a与b分别是R与S的一个属性;p和q是一个TRC公式。,该表达语义是:对p(R)中的每个自由变量(包括R),至少存在一个能使公式p(R)为真的元组赋值。(绑定到变量R的存在量词),通常一个公式p(R)中会包含一个RRel条件,以及一些关于R的量词限定表达。为简洁起见, 常用RRel(p(R) 替代R(RRelp(R)常用RRel(p(R) 替代R(RRelp(R),2018/11/4,24,域关系演算(Domain Relational Calculus, DRC),DRC公式可按类似TRC公式的方式进行形式定义。这两类公式定义的主要差别是变量的取值范围。令X和Y是域变量。 DRC原子公式是
15、下面形式之一:Rel Rel是含有n个属性的关系名,每个xi , 1in,或是一个变量,或是一个常数。 X op Y 或 X op constant 或 constant op X 任何DRC公式可由如下任一方法递归地构造产生。 任何一个DRC原子公式; p(取反), p q (与连接构造), p q (或连接构造), pq(蕴涵: 若p为真,q必为真) X(p(X),X是 。 X(p(X),X是 。,2018/11/4,25,DRC查询示例,(Q3) 查询被指派到103号船值勤的水手名 | I,T,A(Sailors Ir ,Br ,D ( Reserves Ir = I Br=103) 若
16、引入简记法,也可改写为: | I,T,A(Sailors Reserves(Ir = I Br=103) 该式还可用如下更简洁的写法: | I,T,A(Sailors D( Reserves) ) (Q4) 查询曾在一个红船上值勤过的所有水手名字 | I,T,A(Sailors Reserves Boats ,2018/11/4,26,2.3 SQL语言,2.3.1 用DDL定义数据库,2.3.2 用DML操纵数据库,2.3.3 视图,2018/11/4,27,SQL语言简介,SQL是结构化查询语言(Structured Query Language)的缩写。 SQL发展简史 最初由IBM研究
17、院设计实现,并作为IBM早期数据库系统SYSTEM R的接口。 第一个SQL标准是1986由美国国家标准署(ANSI)推出的SQL1,也称SQL-86。在SQL-86基础上,ANSI还推出了一个改进版SQL-89。 1992年,ANSI与国际标准化组织(ISO)合作,对原有版本进行了较大的修订和扩充,共同推出了一个更完整的SQL新标准,称为SQL-92(也称SQL2)。 最新也最终版本是1999年ANSI/ISO推出的SQL-99(也称SQL3)。SQL现已成为商业化DBMS的标准语言。,2018/11/4,28,2.3.1 用DDL定义数据库,(1)定义DB模式与DB编目 DB模式,也称SQ
18、L模式(SQL schema)最早由SQL-92引入,旨在将同属于一个DB应用的表和其它构造组织在一起。 SQL-92中,创建模式的SQL语句为:CREATE SCHEMA sailorMDB AUTHORIZATION Jsmith PASSWORD 123 (2)定义关系模式 建表命令(CREATE TABLE)用来创建或定义关系表。,2018/11/4,29,创建表示例创建“水手”小模式,2018/11/4,30,2.3.1 用DDL定义数据库,(1)定义DB模式与DB编目 (2)定义关系模式 (3)更改SQL模式定义 DROP命令:是CREATE命令的逆命令。用来删除命名的模式或模式元
19、素,如表、域、约束、视图,等。命令的基本格式为: DROP 例1 DROP SCHEMA RESTRICT 例2 DROP TABLE CASCADE ALTER命令 :用来更改表或其它模型元素定义。,2018/11/4,31,2.3.2 用DML操纵数据库,一、SQL基本查询 (一)SQL查询的基本形式 SELECT DISTINCT select_list FROM from-list WHERE (二)SQL基本查询的语义 (概念赋值策略) 计算出现在from-list中关系表的叉积; 删除叉积结果中不满足WHERE中条件的元组; 删除未出现在select-list中的列; 如果指定了D
20、ISTINCT,删除重复元组。(与实际DBMS中的查询赋值策略相比,概念赋值策略通常不考虑效率,更强调概念性和易理解性),2018/11/4,32,SQL基本查询应用举例(1),2018/11/4,33,SQL基本查询应用举例(2),2018/11/4,34,2.3.2 用DML操纵数据库,一、SQL基本查询 二、在SQL命令中使用表达式和字符串 select-list中的每个项,除了可以是相关表的属性名外,还允许是形如 AS 输出列名 这种更一般的表达。 WHERE语句中的条件项,也允许含一般表达式。 三、集合运算 SQL提供了并(UNION)、交(INTERSECT)、差(EXCEPT)等
21、三种集合操作,以扩展基本查询。,2018/11/4,35,在SQL中使用表达式和字符串举例,2018/11/4,36,集合运算 应用举例,显然,对前面的Q8、Q9这两查询,利用集合操作符,我们可得到更清晰、更好理解的表达。,2018/11/4,37,2.3.2 用DML操纵数据库,一、SQL基本查询 二、在SQL命令中使用表达式和字符串 三、集合运算 四、嵌入查询 允许在条件项中引用“基于另一表的即时计算值”,是SQL的一个强有力特性,可有效提高查询表达能力。 为获得即时引用值,可通过在条件项中嵌入另一个SQL查询来实现。 内嵌的查询称为子查询,含子查询的查询称为嵌入查询。,2018/11/4
22、,38,嵌入查询应用举例,可用嵌入查询来重新表达Q3、Q4,2018/11/4,39,2.3.2 用DML操纵数据库,一、SQL基本查询 二、在SQL命令中使用表达式和字符串 三、集合运算 四、嵌入查询 五、聚合操作 除了简单存取数据,查询也经常需要执行一些汇总(summarization)计算,或分组合计。标准SQL支持以下五种基本聚合操作: COUNT(DISTINCTA): 计算属性A上(不同)值的个数 SUM(DISTINCTA): 计算属性A上(不同)值的合计值 AVG(DISTINCTA): 计算属性A上(不同)值的平均值 MAX(A): 计算属性A上的最大值; MIN(A): 计
23、算属性A上的最小值; 除count外,其它四个操作都要求属性A的域为数值型。,2018/11/4,40,五、聚合操作,(一)在查询表达中简单应用聚合函数(Q15)查职级=2的所有水手平均/最大/最小年龄/总人数 SELECT AVG(S.age) AS avg_age, MAX(S.age) AS max_age, COUNT(*) AS numFROM Sailors SWHERE S.rating=2 (Q16)查比职级为2的最大年龄水手年龄更大的水手 SELECT S.snameFROM Sailors SWHERE S.age (SELECT MAX(S2.age)FROM Sailo
24、rs S2 WHERE S2.rating=2) (二)分组计算聚合值,2018/11/4,41,五、聚合操作,(一)在查询表达中简单应用聚合函数 (Q15、Q16)都是针对关系中被选择的所有元组进行聚合计算,这相当于只有一个分组(组中包含了所有被选择元组) 。 (二)分组计算聚合值 SQL也支持针对关系中被选择的元组进行分组,并针对每个分组进行聚合计算。 增加分组聚合的扩展SQL语句基本形式为:SELECT DISTINCT select_listFROM from-listWHERE select-conditonGROUP BY grouping-attribute-listA1, A2
25、,HAVING grouping-select-conditon 分组聚合扩展查询语句表达的赋值策略,2018/11/4,42,2.3.2 用DML操纵数据库,一、SQL基本查询 二、在SQL命令中使用表达式和字符串 三、集合运算 四、嵌入查询 五、聚合操作 六、外连接操作 是连接操作的一类重要变体,其结果实例中通常会有大量NULL值,可能产生比条件连接更多的结果元组 外连接又分“左外连接”、“右外连接”和“左右外连接”,2018/11/4,43,六、外连接操作(outer joins),左外连接(left outer join) 左表中那些不匹配的元组也会被加入到结果中。 左表的每个不匹配元
26、组与右表空元组(所有列都取NULL值)拼接产生一个结果元组。 右外连接(right outer join) 右表中那些不匹配的元组也会被加入到结果中。 全外连接(full outer join) 两个表中不匹配元组都会分别与另一表的空元组组合,加入到连接结果集中。,查询示例: SELECT S.sid, R.bid, R.day FROM Sailors S NATURAL LEFT OUTER JOIN Reserves R,2018/11/4,44,2.3.2 用DML操纵数据库,一、SQL基本查询 二、在SQL命令中使用表达式和字符串 三、集合运算 四、嵌入查询 五、聚合操作 六、外连接
27、操作 七、修改数据库 更新或修改DB主要包括三种基本操作:插入(insert)、删除(delete)和修改(update)。,2018/11/4,45,修改数据库操作的基本语法说明,2018/11/4,46,修改数据库操作应用示例,2018/11/4,47,2.3.3 视图,让用户看都DB中所有数据是不合适的。 首先,从安全的角度考虑,我们可能更希望各用户只看到与其有关的哪些数据。 其次,不同用户,可能需要以特有的个性化视角来观察所感兴趣的数据子集。 在DB中,通过引入视图(view)这一概念来解决以上问题。原则上,基于一组给定的实关系,我们能创建一组任意大小视图集。 视图定义的基本形式为:
28、CREATE VIEW AS ,2018/11/4,48,2.4 应用关系数据库,2.4.1 DB存储过程与SQL/PSM,2.4.2 在通用编程语言中嵌入SQL语言,2.4.3 基于API接口访问数据库:ODBC与JDBC,作为一种非过程化的、声明性语言,SQL为用户使用、操纵RDBMS带来了极大的方便。允许用户基于关系模型的概念层次来表达操作请求。用户不必关心数据在DB中的物理存储布局,以及具体查询实现过程。本节将集中讨论:过程化编程方式中使用RDBMS的几种方法。,2018/11/4,49,2.4.1 DB存储过程与SQL/PSM,DB存储过程是SQL的过程化扩展。 存储过程的主要作用,
29、在以下情况下很有用: 对一些同时为多个应用所需,且没有交互工作界面的DB处理过程,如果用PSM实现并存储在DB服务器上供相关应用共享调用,将有助于减少重复工作,并增强软件的模块化特性。 PSM直接在服务端执行,有助于减少客户机与服务器之间的数据传输和通讯代价。 通过为DB用户提供更复杂的导出数据,PSM过程可增强DB视图的建模能力。 DB触发器也需要借助PSM过程实现。,2018/11/4,50,2.4.1 DB存储过程与SQL/PSM,DB存储过程是SQL的过程化扩展。 存储过程的作用。 SQL/PSM对DB模型和语言进行了必要扩充。,2018/11/4,51,2.4.2 在通用编程语言中嵌
30、入SQL语言,PSM只是SQL的简单过程化扩充,语义表达能力不及通用程序编程语言,如C、Java、Ada、Pascal等。 当需要更大灵活性,或需要达一些复杂查询,或需要更友好用户界面时,我们可能需要借助通用编程语言,来构建高级DB应用。 DB与通用编程语言结合的两种主要方案 直接嵌入SQL命令到通用程序编程语言; 应用通过存取DB关口的API函数库(如ODBC或JDBC)来操纵数据库。,2018/11/4,52,2.4.3 基于API接口访问数据库:ODBC与JDBC,嵌入SQL只是在源代码级实现与宿主语言集成,在未重新编译情况下是无法更改的,是一种静态DB应用程序设计法。 ODBC/JDBC则是以标准化的应用编程接口(API),向编程者提供DB能力。 相对于嵌入SQL,使用API接口访问DB则是一种动态的DB程序设计方法。 它是在执行级实现与宿主语言集成,只有一个语境(访问DB只是特定API函数调用),没有不同类型系统转换问题。,2018/11/4,53,基于ODBC/JDBC方法的应用体系结构,