赞
踩
树形结构,双亲唯一,一对多
可以多对多
实例是模式的一个具体值
其中,每一个元素称为元组,如(张清玖,计算机专业,李勇)
元组中每一个值叫分量,如张清玖,计算机专业,李勇
基数计算方法则是每个域中值的个数的乘积
R(U, D, DOM, F)
R:关系名
U:组成该关系的属性名集合
D:U中属性所来自的域
DOM:属性向域的映像集合
F:属性间数据的依赖关系的集合
F是R的外码
- F是基本关系R的一个或一组属性,但不是关系R的码
- F与基本关系S的主码Ks相对应
R:参照关系
S:被参照关系 / 目标关系
通俗的讲外码就是只是参照关系里的普通属性(非码),但是却和被参照关系里的主码对应
对应参照完整性规则2.2
外码要么取空值要么取等于S中某个元组的主码值
个人理解是满足语义要求即可
R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R \cup S = \{ t|t \in R \vee t \in S \} R∪S={t∣t∈R∨t∈S}
R − S = { t ∣ t ∈ ∧ t ∉ S } R-S = \{ t | t \in \wedge t \notin S \} R−S={t∣t∈∧t∈/S}
R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R \cap S = \{ t|t \in R \wedge t \in S \} R∩S={t∣t∈R∧t∈S}
R × S = { t r ⌢ t s ∣ t r ∈ R ∧ t s ∈ S } R \times S= \{ t_r\frown t_s | t_r \in R \wedge t_s \in S \} R×S={tr⌢ts∣tr∈R∧ts∈S}
Z x = { t [ Z ] ∣ t ∈ R , t [ X ] = x } Z_x = \{ t[Z] | t\in R, t[X]=x \} Zx={t[Z]∣t∈R,t[X]=x}
表示R中属性组X上值为x的诸元组再Z上分量的集合
σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) = ′ 真 ′ } σ_F(R) = \{ t|t \in R ∧ F(t)= '真' \} σF(R)={t∣t∈R∧F(t)=′真′}
π A ( R ) = { t [ A ] ∣ t ∈ R } π_A(R) = \{ t[A] | t \in R \} πA(R)={t[A]∣t∈R}
A:R中的属性列
看图,不解释
悬浮元组:在自然连接中未被连接的元组
外连接:吧悬浮元组保存在结果关系中,在其他属性上填空值(NULL)
左外连接:只保留左边关系R中的悬浮元组
由外连接:只保留右边关系S中的悬浮元组
R ÷ S = { t r [ X ] ∣ t r ∈ R ∧ π Y ( S ) ⊆ Y x } R \div S= \{ t_r[X]|t_r \in R∧π_Y(S) \subseteq Y_x \} R÷S={tr[X]∣tr∈R∧πY(S)⊆Yx}
Y x Y_x Yx:X在R中的象集, x = t r [ X ] x=t_r[X] x=tr[X]
a1的象集{(b1,c2), (b2,c3), (b2,c1)}
a2的象集{(b3,c7), (b2,c3)}
a3的象集{(b4,c6)}
a4的象集{(b6,c6)}
S在(B,C)上的投影{(b1,c2), (b2,c1), (b2,c3)}
只有a1的象集包含S的投影集,故结果为a1
定义模式实际上是定义一个命名空间,在其中可以定义数据库对象(基本表、试图、索引等)
CASCADE(级联):删除模式的同时删除模式中所有数据库对象
RESTRICT(限制):如果模式中定义了下属的数据库对象,则拒绝执行删除;只有当没有下属对象时才能删除。
ADD:增加新列、新列级完整性约束条件和新表级完整性约束条件
DROP COLUMN:用于删除表中的列
DROP CONSTRAINT:用于删除指定的完整性约束条件
ALTER COLUMN:用于修改原有的列定义
RESTRICT:存在依赖该表的对象,则不能删除
CASCADE:删除表的同时,删除相关依赖对象
这里的is不能用**=**代替
and优先级高于or
升序:ASC
降序:DESC
缺省为升序
GROUP BY 分组
HAVING短语与WHERE子句作用对象不同
- WHERE作用于基本表或试图
- HAVING短语作用组
GROUP BY的作用感觉PPT上写的有点模糊,可以看这里:https://www.cnblogs.com/rainman/archive/2013/05/01/3053703.html
查询-等值连接 例3.49 - P102
外连接会将主题表中不满足连接条件的元组一并输出而普通连接不会
3.62的思路可以先看3.63
下面两个式子要记住:
$(\forall ) P \equiv \neg ( \exist x (\neg P) ) $
$p \rightarrow q \equiv \neg p \vee q $
并:UNION
交:INTERSECT
差:EXCEPT
在FROM里面加个子查询并将查询结果作为一个新表
NOT NULL 和 UNIQUE 和 码属性 不能取空值
空值算数运算为空值 空值比较运算为UNKNOWN
如果一个试图上还导出了其他试图,使用CASCADE级联删除
试图消解法
- 进行有效性检查
- 转换成等价的对基本表的查询
- 执行修正后的查询
WITH GRANT OPTION 可传播权限,如果没有这句话默认不可传播
数据库角色:被命名的一组与数据库操作相关的权限
- 角色是权限的集合
- 可以为一组具有相同权限的用户创建一个角色
- 简化授权过程
两个字段作为联合主键,这两个变量可以有重复,但是不能两个同时重复。
比如说我们拿id和name作为联合主键,name可以重复,id也可以重复,但是不能有两个元组同时拥有一样的id和name。
破坏参照完整性
- SC表中增加一个元组,该元组的Sno值在Student表中找不到一个元组的Sno值与之对应
- 修改SC表中一个元组,修改后找不到元组与之对应
- 从Student表中删除一个元组,删除后SC表中元组Sno值找不到对应
- 修改Student表中一个元组,修改后SC表中元组Sno值找不到对应
处理方式
- NO ACTION : 拒绝执行
- CASCADE : 级联操作
- SET_NULL : 设置为空值
定义属性上的约束条件
- NOT NULL : 列值非空
- UNIQUE : 列值唯一
- CHECK : 检查列值是否满足一个条件表达式
元组级的约束可设置不同属性之间的取值的相互约束条件
不满足条件拒绝执行
删除断言:DROP ASSERTION <断言名>;
语法样式
触发事件
- INSERT, DELETE, UPDATE
- AFTER / BEFORE 表示触发时间(在事件发生前后)
触发器类型
- FOR EACH ROW : 行级触发器
- FOR EACH STATEMENT : 语句级触发器
触发条件
- 缺省WHEN,则触发器激活后立即执行
激活触发器
- 事件触发
- 多个触发器
- 执行该表上BEFORE触发器
- 激活触发器的SQL语句
- 执行该表上的AFTER触发器
删除触发器
- DROP TRIGGER <触发器名> ON <表名>;
Student<U,F>中存在的问题
U:属性,F:属性上的一组数据依赖
- 数据冗余:系主任名字重复出现
- 更新异常:更换系主任要改好多次
- 插入异常:一个系刚成立无学生,则无法存入系主任信息
- 删除异常:删除所有学生的信息时,会把系和系主任一起删了
解决:
这里有错误,应该是圈出两个S1
函数依赖:X→Y(X确定Y / Y依赖于X):不可能存在一个元组,X上值相等而Y上值不等
F:完全函数依赖
- X里面任何一个真子集都不能确定Y
P:部分函数依赖
- X中存在一个真子集能确定Y
平凡的函数依赖
- Y是X的一个子集
非平凡的函数依赖
- Y不是X的一个子集
候选码(Candidate Key):K为R<U,F>中的属性或属性组合且U完全依赖于K,则K为R的一个候选码
超码(Superkey):U部分依赖于K,则K为超码
主码(Primary key):若关系模式R有多个候选码,则选一个为主码
主属性(Prime attribute):包含在任何一个候选码中的属性
非主属性(Nonprime attribute)或非码属性(Non-key attribute):不包含在任何码中的属性
全码(All-key):整个属性组是码
2NF要求每个主属性都必须完全依赖于任何一个候选码
3NF要求无传递依赖
BCNF:每一个决定属性集都包含候选码
缺点:
- 数据冗余度大
- 增加操作复杂性
- 删除操作复杂
- 修改操作复杂
原因:存在多值依赖
不得不说,数据库在定义说明上有一手的,属实难理解。
个人理解:
就拿上面这个例子来说,我们可以取很多个(C,B),C相同,B不同,此时T都有一组值与之对应。
说白了就是对于(X,Y,Z)一个X对应多个Y,然后一组(X,Z)对应多个Y。
如果实在不理解就采用最简单粗暴的方式,X→→Y中一个X对应多个Y
补充:多值依赖的性质 P74
多值依赖于函数依赖区别:
XY为W的子集,W为U的子集
- X→→Y 在U上成立,则W上一定成立
- X→→Y 在W上成立,在U上未必成立
- 这个实际上就是大范围推小范围
Y‘为Y的真子集
X→Y 则 X→Y’
X→→Y 不能断言 X→→Y’
为啥这里的一个联系名用的是仓库
建立数据库连接
- EXEC SQL CONNECT TO target [AS connection-name] [USER user-name];
- target为要连接的数据库服务器
- connect-name是可选的连接名
关闭数据库连接
- EXEC SQL DISCONNECT [connection];
用into子句指定存放查询结果的主变量
对于多条记录等的必须使用游标
说明游标
EXEC SQL DECLARE <游标名> CURSOR FOR <SELECT 语句>;
打开游标
EXEC SQL OPEN <游标名>;
推进游标指针并取当前记录
EXEC SQL FETCH <游标名> INTO <主变量>[<指示变量>] [,<主变量>[<指示变量>]]…;
关闭游标
EXEC SQL CLOSE <游标名>;
看看就好,感觉应该不会考吧
创建、执行、修改和删除的代码见PPT - P78 P83 P85
函数见PPT - P88
操作步骤
- 配置数据源
- 初始化环境
- 建立连接
- 分配语句句柄
- 执行SQL语句
- 结果集处理
- 中止处理
这个简单看吧 这个排版有点糟糕,建议看书,书上的排版赏心悦目
这个其实不难理解,先选择完再连接的消耗比连接完再选择要低得多。
PS:连接操作时查询处理中最耗时的操作之一 - P24
通过索引来选择比顺序查找效率高。
数据库的ACID特性
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 不可被干扰
- 持续性(Durability)
- 一旦事物被提交,改变为永久性的
恢复的实现技术
- 数据转储
- 登记日志文件
丢失修改
不可重复读
一级封锁:事务T在修改R之前必须加X锁,知道事务结束才释放
- 没有共享锁,所以不能保证可重复性读和不读脏数据
二级封锁:一级封锁协议加上事务T在读数据R之前必须对其加S锁,读完即可释放S锁
- 读完数据即可释放S锁,不能保证可重复性读
三级封锁:一级封锁加上事务T在读数据R之前必须先对其加S锁,知道事务结束才可释放
- 三级封锁可防止丢失修改、读脏数据和不可重复读
两阶段:
- 一阶段:只能获得锁
- 二阶段:只能释放锁
两段锁仍然可能发生死锁:两段锁不是一次性对要用的数据全部加锁
IS锁:对后裔结点加S锁
IX锁:对后裔结点加X锁
SIX锁:加S锁,再加IX锁
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。