数据库复习
第一章 数据库发展史
1、数据管理技术的发展(特点)
人工管理阶段,文件系统阶段,数据库技术,文件系统的缺陷(数据冗余性,数据不一致性、数据联系弱)
2、数据库技术的产生
进入数据库阶段的标志是20世纪60年代末的三件大事
1968年IBM公司研制的IMS系统——典型的层次DBS
1969年美国CODASYL组织 DBTG报告踢出——网状DBS的概念
1970年美国IBM公司的E.F.COOD发表的论文踢出——关系模型的思想
数据库阶段的特点:
(1)采用数据模型标识复杂的数据结构(数据库的三级体系结构)
(2)有较高的数据独立性(逻辑数据独立性、物理数据独立性)
(3)数据库系统为用户提供了方便的用户接口
(4)数据库系统提供四方面的数据控制功能:数据库的并发控制、数据库的回复、数据的完整性、数据安全性。
(5)对数据的操作以数据项为单位,增加了系统的灵活性。
3、数据库技术的术语
用户——DBMS——DB
DBMS(数据库管理系统)、DB(数据库)和用户三样东西加起来,通常被称为数据库系统(Database System,DBS)。
4、数据库技术的发展
关注分布式数据库(不怎么考)
第二章 数据库系统结构
现实——信息——机器 三个世界的转换
现实世界到信息世界 通过ER图
信息世界到机器世界 通过逻辑设计,把ER图转化成了某一种数据模型(层次、网状、关系,层次、网状被淘汰了)所以逻辑设计就是把一张ER图转化成一张张的表
1、数据描述
从事物的特性到计算机中的具体表示,分别经历了三个阶段:
概念设计中的数据描述(实体、属性、实体集、实体标识符)
逻辑设计中的数据描述(记录、字段、文件、关键码)——表中的行是记录,列是字段,表本身是文件
物理设计中的数据描述(位、字节、字、块、桶、卷)
注意他们的差别:
概念设计中的数据描述与逻辑数据描述的差别;
逻辑数据描述与物理数据描述的差别。
存储介质的层次:图2.1
2、数据联系的描述
联系的元数:与一个联系有关的实体集的个数
联系的类型: 一对一(1:1)
一对多(1:n)
多对多(m:n)
3、数据模型的概念: 表示实体类型及实体间联系的模型
概念数据模型(对现实世界的第一层抽象)
是按用户的观点对数据建模,强调其语义表达能力。
(独立于计算机系统的模型,用于建立信息世界的数据模型)。
逻辑数据模型 “结构数据模型”:(对现实世界的第二层抽象)
是直接面向数据库的逻辑结构,与DBMS有关。
(从计算机的观点对数据建模,用于建立机器世界的数据模型)
概念数据模型--实体联系模型(ER模型)
在ER模型中有四个基本成分:
矩形框表示实体类型;
菱形框表示联系类型(实体间的联系);
椭圆形框表示实体类型和联系类型的属性;
用直线连接:实体与属性;
联系与属性;
实体与实体;
相应的命名均记人各种框中。
对于关键码的属性,在属性名下划一横线。
建立ER模型的步骤如下:
首先确定实体类型和联系类型,
接着把实体类型和联系类型组合成ER图;
然后确定实体类型和联系类型的属性,
再确定实体类型的键,在属于键的属性名下划一横线。
(包括第六章ER模型的扩充)
逻辑数据模型:面向数据库逻辑结构的模型。
逻辑数据模型包含:
数据结构、数据操作和数据完整性约束。
数据结构是指对实体类型和实体间联系的表达和实现;
数据操作是指对数据库的检索和更新(包括插入、删除、修改)两类操作的实现;
数据完整性约束给出数据及其联系应具有的制约和依赖规则。
逻辑数据模型主要有:
层次模型:用树型结构来表示实体类型及实体之间联系的模型,称为层次模型。(数据之间的联系通过指针实现)
网状模型:用有向图结构表示实体类型及实体间联系的模型,称为网状模型。(数据之间的联系通过指针实现)
关系模型:用二维表格结构来表示实体集。(数据之间的联系,是通过外键和主键间联系实现的 即:公共属性…)
面向对象模型:数据之间嵌套、递归联系是通过对象标识符实现的
层次网状数据库通过指针来联系
关系数据库通过共同属性(外键)来联系
4、数据库的体系结构
三级模式结构
三级结构和两级映象
数据独立性定义
两级数据独立性: 物理数据独立性、逻辑数据独立性
5、数据库管理系统

用户访问数据的过程 :

DBMS的主要功能:
(1)数据库的定义功能:建数据库表视图索引等
(2)数据库的操纵功能:增删查改
(3)数据库的保护功能:第八章的四大功能:恢复、并发、完整性、安全性
(4)数据库的维护功能:
(5)数据字典:数据库的数据库,把数据库以及数据库中的对象(表、视图、索引等)的相关信息记录在数据字典。数据字典存放了数据库的相关信息(例如谁建的,建在哪)和数据库的对象的相关信息。
DBMS的模块组成(太专业,可以不用看)
从模块结构来观察,DBMS由两大部分组成:查询处理器和存储管理器。
查询处理器有四个主要成分:DDL编译器,DML编译器,嵌入式DML的预编译器及查询运行核心程序。
存储管理器有四个主要成分:权限和完整性管理器,事务管理器,文件管理器及缓冲区管理器。
数据库管理系统:模块结构(太专业,可以不用看)
6、数据库系统DBS
DBS的组成:
数据库DB、硬件(计算机)、软件(DBMS、操作系统等)、数据库管理员DBA(用户)
DBS的全局结构(略)
DBS结构的分类(略)
DBS的效益(略)
数据库管理员DBA:
DBA是控制数据整体结构的一组人员,负责DBS的正常运行,承担创建、监控和维护数据库结构的责任。
DBA的主要职责:
① 定义模式
② 定义内模式(存在什么地方)
③ 与用户的联络。包括定义外模式、应用程序的设计、提供技术培训等专业服务。
④ 定义安全性规则,对用户访问数据库的授权。
⑤ 定义完整性规则,监督数据库的运行。
⑥ 数据库的转储与恢复工作。
第三章 关系运算(重点)
作业一定要好好看
两个重点:学会写关系代数表达式和学会用语法树来做查询优化(主观题)
也有很多客观题要考,基本概念要梳理。
1、基本概念
关系模型:
用二维表格表示实体集,用关键码表示实体间联系的数据模型;
关键码:
超键、候选键、主键和外键;(P.37)
唯一决定这一行的都叫超键
超键里不含有多余属性的叫候选键
候选键中选一个是主键
外键可能不是主键,可能是另一个关系的主键,是两张表联系的纽带
拿到一个关系一定要找到主键和外键。要找主键肯定要找超键,要找超键肯定要找候选键
关系的定义和特点;(P.36-P.37,P.41)
这部分参考数据库中关系有哪些性质(结合例子自己理解)_数据库关系的性质-CSDN博客
关系有几个性质,一定要搞清楚。
1、列是同质的,即每列中的数据必须来自同一个域,具有相同的数据类型
这句话怎么理解呢,性别我们有男女之分,但是也可以用1和2来代表男和女或者M或者F。所以当你选择用男或者女用M和F时,你就不能用1和2.这就是同质。
2、每列必须是不可再分的数据项
这句话怎么理解呢,工资有基本工资、绩效工资和岗位工资等等。你不能将表中单独放一个栏目叫做工资下面几个小工资,你必须将工资分成不可割分之后并列。比如:
图2就不可以!!!!
3、元组(记录)不重复,即不能有相同的行
这个不用举例,记录不存在冗余。假如你存储了王大记录,你就不能再存储王大记录。
4、元组无序性,即行次序无关
这句话可以理解为:张明这条记录和王红的记录可以上下互换,表示同样的意思,无异性。
5、属性无序性,即列次序无关
这句话理解更简单,假如学生信息表,你把性别和年龄列交换顺序都一样。比如:
两者相同!!!!!!
6、属性不同名
三类完整性规则:
实体完整性规则(约束主键,不为空)、参照完整性规则(约束外键)、用户定义的完整性规则;(P.40-P.41)。
前两个完整性是必须干的。第三个在第八章有很多。
ER模型到关系模型的转换规则;
过程性语言与非过程性语言:
过程性语言:编程时必须指出“干什么”及“怎么干”的语言;
非过程性语言:编程时只须指出“干什么”,不必指出“怎么干”。
非过程性语言与过程性语言的区别
关系运算包括:关系代数和关系演算两类。
2、关系代数(P.42—P.51)理论基础:集合运算
五个基本操作(并、差、笛卡儿积、投影、选择);
四个组合操作(交、联接、自然联接、除);
交是通过两次差获得的;链接运算是通过两张表先笛卡尔积,完了再做选择;自然链接(三种运算组合而成)的条件是两张表要有相同属性,把两张表相同属性的行连接起来得到的;除运算也是三种运算组合而成(哪三种?)
三个扩充的关系代数操作(外联接、外部并、半联接);
关系代数表达式的运用技巧
(1)一般规则
对于只涉及到选择、投影、联接的查询可用下列表达式表示:
π…(σ…(R×S)) 或者 π…(σ…(R⋈S))
(2) 对于否定的操作,一般要用差操作表示;
例如: “检索不学C2课的学生姓名”。
不能用下式表示: πSNAME,AGE(σCNO≠'C2'(S⋈SC))
一定要用“差”的形式:
πSNAME,AGE(S)-πSNAME,AGE(σCNO='C2'(S⋈SC))
(3)对于具有“全部”或“包含”问题的检索,一般要用除法操作表示。
例: “检索学习全部课程的学生学号”:
πSNO,CNO(SC)÷πCNO(C)
不能表示为:πSNO (SC÷πCNO(C))
3、查询优化(P.57-P.64)
用语法树的办法来做查询优化。
第一步 写出表达式
第二步 画出原始语法树
第三步 把所有选择往树叶端点靠(往最下靠)
第四步 把所有投影往树叶端点靠
关系代数表达式的优化问题;
关系代数表达式的等价变换规则;
优化的策略;
优化算法、例 3.24
第四章 关系数据库语言SQL (P.67-P.97)(重点)
参考:史上最全SQL基础知识总结(理论+举例)-CSDN博客
SQL:DDL:CREATE;DROP;ALTER (Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
DQL:SELECT(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
DML:INSERT;DELETE;UPDATE (Data Control Language):数据控制语言,用来定义访问权限和安全级别;
DCL:(Data Query Language):数据查询语言,用来查询记录(数据)
考试百分之80考SELECT,百分之20考另外六条
1、SQL数据库的体系结构,SQL的组成。
2、SQL的数据定义:SQL模式、基本表和索引的创建和撤销,SQL提供的数据类型。
3、SQL的数据查询:SELECT语句的格式,单表和多表查询,基本表的联接操作,聚合和分组,集合操作。
4、SQL的数据更新:插入、删除和修改语句。
5、视图的创建和撤消,对视图更新操作的限制。
6、嵌入式SQL:预处理方式,使用规定,使用技术。不考主观题
客观题就是概念,主观题就是sql命令
SELECT语句
语法:
select 列名 ----> 要查询的列名称from 表名 ----> 要查询的表名称where 条件 ----> 行条件group by 分组列 ----> 对结果分组having 分组条件 ----> 分组后的行条件order by 排序列 ----> 对结果分组limit 起始行, 行数 ----> 结果限定
内容分析
SELECT语句是SQL的核心内容,应掌握下列内容。
1.SELECT语句的来历
在关系代数中最常用的式子是下列表达式:
πA1,…,An(σF(R1×…×Rm))
这里R1、…、Rm为关系,F是公式,A1、…、An为属性。
为此SQL设计成SELECT—FROM—WHERE句型:
SELECT A1,…,AnFROM R1,…,RmWHERE F
该句型是从关系代数表达式演变来的,但WHERE子句中的条件表达式F要比关系代数中公式更灵活。
2.SELECT语句中出现的基本表名,应理解为基本表中的元组变量,而列名应理解为元组分量。
3.SELECT语句的语义通常有三种情况(SQL标准):
以学生表S(SNO,SNAME,AGE,SEX)为例说明。
第一种情况:SELECT语句中未使用分组子句,也未使用聚合操作,
那么SELECT子句的语义是对查询的结果执行投影操作。
如:
SELECT SNO,SNAMEFROM SWHERE SEX='M';
第二种情况:SELECT语句中未使用分组子句,但在SELECT子句中使用了聚合操作,此时SELECT子句的语义是对查询结果执行聚合操作。
如:
SELECT COUNT(\*),AVG(AGE)FROM S WHERE SEX='M';
该语句是求男同学的人数和平均年龄。
第三种情况:SELECT语句使用了分组子句和聚合操作,此时SELECT子句的语义是对查询结果的每一分组去做聚合操作。
如:求男同学每一年龄的人数。
SELECT AGE,COUNT(\*)FROM SWHERE SEX='男'GROUP BY AGE;
SQL的数据更新:
插入、删除和修改语句 (P.89-P.91)
数据插入
1、插入单个元组:
INSERT INTO 基本表名(列名表)VALUES (元组值)
2、插入子查询的结果:
INSERT INTO 基本表名(列名表)SELECT 查询语句;
数据删除
删除关系中满足条件的元组语句的句法如下:
DELETE FROM <表名> WHERE <条件表达式>
数据修改
UPDATE 基本表名 SET 列名=值表达式[,列名=值表达式…][WHERE 条件表达式]
视图的更新操作 (P.91-P.92)
对于视图元组的更新操作(INSERT、DELETE、UPDATA),有以下三条规则:
① 如果一个视图是从多个基本表使用联接操作导出的,那么不允许对这个视图执行更新操作。
② 如果在导出视图的过程中,使用了分组和聚合操作,也不允许对这个视图执行更新操作。
③ 如果视图是从单个基本表使用选择、投影操作导出的,并且包含了基本表的主键或某个候选键,那么这样的视图称为“行列子集视图”,并且可以被执行更新操作。
在SQL2中,允许更新的视图在定义时,必须加上“WITH CHECK OPTION”短语。
嵌入式SQL的使用技术:(主观题不考,客观题考)
嵌入式SQL的实现,有两种处理方式:
1、扩充宿主语言的编译程序,使之能处理SQL语句;
2、采用预处理方式。
目前多数系统采用后一种方式。
处理数据一行的不需要游标,处理数据多行的用游标
处理数据一行的只需要定义几个变量放值就行
游标怎么用?定义游标declare,打开游标open,推进游标fetch,关闭游标close

嵌入式SQL使用时必须解决的问题
①为区分SQL语句与宿主语言语句,在所有的SQL语句前必须加上 前缀标识“EXEC SQL”,并以“END EXEC”作为语句结束标志。
② 数据库工作单元和主程序工作单元之间的通讯允许嵌入的SQL语句引用宿主语言的程序变量 (称为共享变量)。在引用这些变量时必须在这些变量前加冒号“ :”作为前缀标识,以示与数据库中变量有区别;
③ 引入游标机制: 将集合操作转换为单元组处理。
第四章作业
对于教学数据库的三个基本表。
S( SNO, SNAME, AGE,SEX, SDEPT)
SC(SNO, CNO, GRADE)
C( CNO, CNAME , CDEPT, TNAME )
试用SQL的查询语句表达下列查询。
(1)检索LIU老师所授课程的课程号和课程名
(2)检索年龄大于23岁的男学生的学号和姓名
(3)检索学号为S3的学生所学课程的课程名和任课教师名
(4)检索至少选修LIU老师所授课程中一门课程的女学生姓名
(5)检索WANG同学不学的课程的课程号
看到不字用NOT EXIST或者NOT IN
(6)检索至少选修两门课程的学生学号。
分组统计门数>=2,还有一种方法是自身连接
(7)检索全部学生都选修的课程的课程号与课程名
全部 就是双重否定
(8)检索选修课程包含LIU老师所授课程的学生学号
双重否定
试用SQL查询语句表达下列对教学数据库中三个基本表S、SC、C的查询。
(1)统计有学生选修的课程门数。
(2)求选修C4课程的学生的平均年龄。
(3)求LIU老师所授课程的每门课程的学生平均成绩
(4)统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。
(5)检索学号比WANG同学大,而年龄比他小的学生姓名
比较运算符两边都要是值,不能是集合
(6)检索姓名以WANG打头的所有学生的姓名和年龄
凡是有通配符前面要用like不能用= 且必须要用单引号
(7)在SC中检索成绩为空值的学生学号和课程号。
条件里出现空 前面一定用is 不能用=
(8)求年龄大于女同学平均年龄的男学生姓名和年龄
(9)求年龄大于所有女同学年龄的男学生姓名和年龄
大于>后面一定要加all,不用all的话把这个年龄求最大值就是值了
试用SQL更新语句表达对教学数据库中三个基本表S、SC、C的各个更新操作
(1)向基本表S中插入一个学生元组('S9','WU',18)。
(2)在基本表S中检索每一门课程成绩都大于或等于80分的学生学号、姓名和性别并将检索结果保存到另一个已存在的基本表STUDENT(SNO,SNAME,SEX)中。
(3)在基本表SC中删除尚无成绩的选课元组。
(4)把WANG同学的学习选课和成绩全部删去
(5)把选修MATHS课不及格的成绩全改为空值。
(6)把低于总平均成绩的女同学成绩提高5%。
(7)在基本表SC中修改C4课程的成绩,若成绩小于或等于75分时提高5%,若成绩大于75分时提高4%(用两个UPDATE语句实现)。
对于教学数据库中基本表SC,已建立下列视图
CREATE VIEW S_GRADE(SNO,C NUM,AVG GRADE)AS SELECT SNO, COUNT(CNO), AVG(GRADE)FROM SC GROUP BY SNO;
试判断下列查询和更新是否允许执行。若允许,写出转换到基本表SC上的相应操作
(1)SELECT * FROM S_GRADE;
(2)SELECT SNO,C_NUM
FROM S_GRADE
WHERE AVG_GRADE>80:
3)SELECT SNO, AVG_GRADE
FROM S_GRADE
WHERE C_NUM>(SELECT C_NUM
FROM S_GRADE
SNO='S4');
(4)UPDATE S_GRADE
SET C_NUM=C_NUM +1
WHERE SNO ='S4';
(5) DELETE FROM S_GRADE
WHERE C_NUM>4;
第四第五题不允许
第七章 数据库设计
客观题为主
一、本章重要概念
(1)DBS生存期及其7个阶段的任务和工作,DBD过程的输入和输出。
(2)需求分析的步骤、数据流图,数据字典的内容和作用。
(3)概念设计的重要性、主要步骤。逻辑设计阶段的主要步骤。
(4)ER模型的基本元素,属性的分类,联系的元数、连通词、基数。采用ER方法的概念设计步骤。
(5)ER模型到关系模型的转换规则。采用ER方法的逻辑设计步骤。
(6)ER模型的扩充:弱实体,超类和子类。
(7)规范化理论对数据库设计的指导意义。
概念设计——逻辑设计——物理设计
ER图怎么画
一共有四种符号:矩形符号,椭圆框,菱形框,连线
弱实体是什么?邮件里的附件,简历,一个人的家庭住址
超类 子类
学校里有很多超类,人是超类,学生和老师是子类
只要学会画基本er模型就行,弱实体和超类子类只要概念就行,最多客观题
两条规则,实体怎么转换,联系怎么转换
实体:一个实体就是一张表
联系:一对一,一的放到另一个一变成外键
一对多,把一的主键放到多的表变成外键
多对多,新的表,两张表主键组合而成
不单考客观题,还会考综合题
明面上有七步,重点掌握其中的两到三步
建表的语句要掌握
建表语句 CREATE
主键 primary key
外键 foreign key
插一个元组 INSERT
二、本章的重点篇幅
(1)教材中P163-165的转换规则和实例。
(2)教材中P159-160的ER模型实例。
三、要求掌握
(1)基本概念、定义、方法;
(2)根据用户的需求,进行ER模型设计;
(3)根据转换规则,将ER模型转换为关系模型。
这一章没说是重点,但是既有客观题又有主观题
第八章 数据库管理(重点)
这个学期三个重点,第三章第四章第八章
这一章不但有客观题还有主观题
一、本章重要概念
(1)事务的定义,COMMIT和ROLLBACK的语义,事务的ACID性质,事务的状态变迁图。
COMMIT是把内存里的更新提交
ROLLBACK是把内存里的更新作废(注意定义)
事务的四大性质
A:原子性(Atomicity)
——原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
C:一致性(Consistency)
——事务前后数据的完整性必须保持一致。
I:隔离性(Isolation)
——事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
D:持久性(Durability)
——持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
(2)存储器类型,稳定存储器的实现,数据传送过程。
(3)恢复的定义、基本原则和实现方法,故障的类型,检查点机制,REDO和UNDO操作,运行记录优先原则。
什么叫恢复?
备份/转储,日志。
三类故障:
事务故障:程序错了 怎么解决?撤销
系统故障:硬件或者软件坏了 建两个队列 重做队列 正向扫描 撤销队列 反向扫描
上面两个故障系统会帮我们做的
介质故障:放数据的硬盘坏了
怎么恢复?买个新盘吧最新的备份弄进去,完了以后再把日志拿出来从这个时间点去做
检查点机制
p177 图8-1
发生故障后
第一种情况,t1在检查之前已经commit,不用恢复
第二种情况:t2和t4在检查点的时候还没做完,在故障点之前做完,将来要放在重做队列
第三种情况:t3和t5在检查点和故障点都没做完,将来要放在撤销队列
运行记录优先原则
包括两点:
将一个更新结果写到DB中前,必须确保先在日志中成功登记了这个更新。
直至对一事务的日志登记全部完成,方能够允许该事务完成COMMIT处理。
这个原则确保了发生故障后能够根据日志对事务进行REDO或UNDO。
(4)并发操作带来的三个问题,X锁、PX协议、PXC协议,S锁、PS协议、PSC协议,活锁、饿死和死锁,并发调度,串行调度,并发调度的可串行化,两段封锁法,SQL中事务的存取模式和隔离级别。
并发操作的三个问题
丢失更新问题:一事务所作的更新操作因另一事务的操作而丢失。
读“脏数据”问题:又称为未提交依赖,指一事务取用了别的事务未提交随后又被撤消的数据。
不一致分析问题:指事务从数据库中读取了处于不一致状态的数据,并因此进行了不一致的分析。
防止这三个问题产生,方法是封锁机制
基本的封锁有两类:
排它型封锁(写锁,X封锁):一个事务对数据对象加了X锁后,在它释放X锁之前不允许其他事务再对该数据对象加任何锁。
共享型锁(读锁,S封锁) :一个事务对数据对象加了S锁后,允许其他事务再对该数据对象加S锁,但在它释放S锁之前不允许其他事务加X锁。
锁加的不好可能会导致活锁,死锁
活锁:永远处在等待状态,解决活锁的办法就是队列,先来先服务
死锁:循环等待,解决的办法有三:指定一个封锁顺序,一次性全加锁,把代价最小的事务做rollback解开锁
调度问题:
并发调度和串行调度
可串行化概念
如果一个并发调度与某一串行调度具有相同的执行结果,那么称这个并发调度是“可串行化的调度”(即正确的并发调度),否则是不可串行化的调度。
两端封锁法
事务在对数据对象存取之前必须先获得对此数据对象的封锁,事务在解除了一个锁之后不再获得任何锁。
遵守两段封锁协议 所有并发调度都可串行化,反过来不成立
(5)完整性的定义,完整性子系统的功能,完整性规则的组成。SQL中的三大类完整性约束,SQL3中的触发器技术。
完整性是指数据的正确性、有效性和相容性。
完整性约束条件:为保证数据的完整性而规定的条件。
完整性检查:检查DB中数据是否满足完整性约束条件。
完整性子系统:DBMS中执行完整性检查的子系统。其功能:
①监督事务的执行,测试其是否违反完整性约束条件;
②若有违反,则按进行预定的处理。
完整性规则的组成
每个规则包括三部分:
触发条件 规定何时执行本规则进行检查;
约束条件 又称谓词,定义应满足的条件;
否则子句 规定不满足条件时该作的处理。
② 在关系DB中,完整性规则可分为三类:
域完整性规则:定义属性取值范围。
域联系的规则:定义属性间的联系、影响和约束。
关系完整性规则:定义更新操作对值的影响和限制。
③ 完整性规则用DDL描述,由系统执行检查。
完整性约束分为三大类:
域约束
基本表约束:主键外键约束
断言
比断言还厉害的 就要用触发器了
(6)安全性的定义、级别,权限,SQL中的安全性机制(视图、SQL用户权限及操作)
二、本章的重点篇幅
(1)检查点机制的方法和恢复算法。(教材中P.175-176)
(2)并发操作带来的三个问题,封锁带来的三个问题,并发调度的可串行化。 (教材P.177-179)
(3)SQL中完整性约束的实现,断言、触发器(SQL3)。(教材P.185-191)
SQL Server 触发器的使用(教材P.298-300)
(4)安全性中的授权语句、回收语句(教材P.193、194)。
三、要求掌握
(1)恢复、并发控制、完整性和安全性的基本概念、定义和方法;
(2)采用检测点技术进行数据恢复的分析方法;
(3)并发调度的可串行化(包括事务的调度、串行调度、并发调度)分析方法;
(4)根据用户的需求,能用多种方法定义完整性约束;
(5)授权和回收语句的使用。
8.19 设教学数据库的关系如下:
S(SNO,SNAME,AGE,SEX)SC(SNO,CNO,GRADE)C(CNO,CNAME,TEACHER)
试用多种方法定义下列完整性约束:
⑴ 在关系S中插入的学生年龄值应在16~25岁之间。
(1)用检查子句定义:
CHECK(AGE BETWEEN 16 AND 25);
⑵ 在关系SC中插入元组时,其SNO值和CNO值必须分别在S和C中出现。
定义sc表学号课程号的时候定义两个外键,学号必须要参照s表中的学号,课程号必须要参照c表的课程号
在关系SC的定义中,用外键子句定义:
FOREIGN KEY(SNO) REFERENCES S(SNO);
FOREIGN KEY(CNO) REFERENCES C(CNO);
⑶ 在关系C中删除一个元组时,首先要把关系SC中具有同样CNO值的元组全部删去。
在关系SC的定义中,用外键子句定义:
FOREIGN KEY(CNO) REFERENCES C(CNO)
ON DELETE CASCADE;
⑷ 在关系S中把某个SNO值修改为新值时,必须同时把关系SC中那些同样的SNO值也修改为新值。
(4)在关系SC的定义中,用外键子句定义:
FOREIGN KEY(SNO) REFERENCES S(SNO)
ON UPDATE CASCADE;
8.20 在教学数据库中的关系S、SC、C中,试用SQL的断言机制定义下列两个完整性约束:
只要掌握两大类就能解决这里的题目
⑴ 每位教师开设的课程不能超过10门。
CREATE ASSERTION ASSE5 CHECK(10>=ALL(SELECT COUNT(CNO))FROM CGROUP BY TNAME))
(2)不允许男同学选修WU老师的课程。
CREATE ASSERTION ASSE2 CHECK(NOT EXISTS ( SELECT *FROM SC WHERE CNO IN (SELECT CNO FROM CWHERE TNAME=’WU’)AND SNO IN (SELECT SNO FROM SWHERE SEX=’男’)));
(3)每门课程最多50名男同学选修
两张表做连接查询,然后和第一道差不多
CREATE ASSERTION ASSE3 CHECK(50>=ALL(SELECT COUNT(SC.SNO)FROM S, SCWHERE S.SNO=SC.SNO AND SEX=’ 男’GROUP BY CNO));
(4)学生必须在选修Maths课后,才能选修其他课程。
这个约束可用下列形式表达:
“不存在一个学生的选课,这个学生没学过Maths课”。
这样就能很容易地写出断言:
CREATE ASSERTION ASSE4 CHECK(NOT EXISTS( SELECT SNOFROM SC XWHERE NOT EXISTS(SELECT *FROM SC Y, CWHERE Y.CNO=C.CNOAND Y.SNO=X.SNOAND CNAME=’ Maths’)));
(5)每个男学生最多选修20门课程。
CREATE ASSERTION ASSE5 CHECK(20>=ALL(SELECT COUNT(CNO)FROM S, SCWHERE S.SNO=SC.SNOAND SEX=’ 男’GROUP BY S.SNO));