数据库期末复习(6-9章)

来源:互联网 发布:手机qq监控软件 编辑:程序博客网 时间:2024/05/17 21:44

第6章 关系代数

目录

引言
形式化定义
操作语法语义
示例查询
更新
与SQL比较

1.引言
过程语言
运算符以两个或多个关系作为输入,并给出一个新的关系作为结果

2.形式化定义
关系代数中的一个基本表达式由下列任意一个组成
数据库中的关系
一个恒定的关系
假设E1和E2是关系代数表达式,则下列均为关系代数表达式:
    * E1∪E2
    * E1-E2
    * E1×E2
    * σF(E1),F是E1属性的谓词
    * ∏A(E1),A是包含E1的一些属性的一个列表
    * ρX(E1),X是E1的结果的一个新名字

Tutorial D的语法
<Relational exp>::= RELATION {<Tuple exp commalist>}  |<relvar name>  |<relational operation>  |(<relational exp>)<relational operation>::=<project>|<nonproject><project>::=<relational exp>{[All But] <attr name commalist>}<nonproject>::=<rename>|<union>|<intersect>|<minus>|<times>|<restrict>|<join>|<divide><rename>::=<relational exp>RENAME <renaming commalist><union>::<relational exp> UNION <relational rxp><intersect>::=<relational exp>INTERSECT <relational exp><minus>::=<relational exp>MINUS <relational exp><times>::=<relational exp>TIMES <relational exp><restrict>::=<relational exp> WHERE <relationla exp><join>::= <relational exp> JOIN <relationla exp><divide>::=<relational exp> DIVIDEBY <relational exp> PER <per><per>::= <relational exp>|(<relational exp>,<relational exp>)

3.操作定义
约束操作
    * 记号:σF(r)
       r WHERE F
    * F称为选择谓词
    * 定义为:σF(r)={t|t∈r and F(t)}
    * 其中f是命题演算中包含的术语的公式:^(and),∨(or),┐(not)
    * 每一项都是以下之一
       <attribute> op <attribute> or <constant>,其中op是:=,≠,>,≥,<,≦
    * 选择例子:$\sigma_{city}="London"(S)​$
Project操作
    * 记号:$\prod{A_1,A_2,...,A_k}(r)$
    * 结果为k列关系,其中有些关系没有列出的被擦除掉了
    * 结果中删除了重复行,因为关系是集合
    * E.g.擦除S的城市属性:$\prod{s \sharp,sname,status}(S)$
Union操作
    * 记号:r∪s
    * r union s 定义为:r∪s={t|t∈r or t∈s}
    * 若r∪s有效,r,s必须有相同的数量,属性域必须兼容
    * E.g.找到所有城市的供应商或部分:$\prod{city}(S)\cup\prod{city}(P)$
Difference操作
    * 记号r-s r minus s
    * 定义为 r-s={t|t∈r and t≠s}
    * 集合差必须在兼容的关系间定义
Intersection操作
    * 记号:r ∩s r intersect s
    * 定义为 r∩s={t|t∈ and t∈s}
    * 假设:r,s有相同的数量,r和s的属性兼容
    * r∩s=r-(r-s)
笛卡尔乘积
    * 记号:r×s t times s
    * 定义为r×s={t q|t∈r and q∈s}
    * 对于r×s,假设r(S)和s(S)的属性是不相交的
    * 如果r(R)和s(S)的属性是不相交的,则必须使用重命名
Rename操作
    * ρX(E)返回在名字X下的表达式E
    * 如果一个关系代数表达式E的数量为n,那么$ρ_X(A1,A2,...An)(E)$返回在名字X下的表达式E,带有重命名为A1,A2,…的属性值

4.示例查询
查找所有状态超过20的供应商:
    * $σ_status>20(S) \quad S\, WHERE\, status>20$
为每个供应商的状态找到大于20的供应商状态
    * $\prod{s\sharp}(\sigma_{status}>20(S))$
      S WHERE status>20{s#}
查找所有供应商、所有零件或两者的城市
    * $\prod{city}(S)\cup\prod{city}(P)$
       S{city} union P{city}
查找所有拥有供应商和零件的城市
    * $\prod{city}(S)\cup\prod{city}(P)$
    * S{city} intersect P{city}
查找在伦敦提供零件的所有供应商的数量
    * $\prod{s\sharp}(\sigma{city}="London"(\sigma_{p.p\sharp=sp,p\sharp}(P\times SP)))​$
查找所有供应商的城市,这些城市的状态大于20且没有零件
    * $\prod{city}(\sigma_{status>20}(S))-\prod{city}(P)$
查找所有供应零件在伦敦的供应商的数量
    * Query1:$\prod{s\sharp}(\sigma{city}="London"(\sigma_{p.p\sharp=sp,p\sharp}(P\times SP)))​$
    * Query2: $\prod{s\sharp}(sigma_{p.p\sharp=sp.p\sharp}((\sigma_{city="London"}(P))\times SP))$
查找最大零件的qty,重命名SP关系为d
    * $\prod{qty}(SP)-\prod{SP.qty}(\sigma_{SP.qty<d.qty}(SP\times ρ_d(SP)))$
      SP{qty} minus ((SP times (SP RENAME qty as qt1) WHERE qty<qt1){qty})

Join操作
自然连接操作
    * 假设r和s分别是模式R和S上的关系,结果是R∩S上的关系,分别考虑了r中的tr元组和ts中的s。
    * 如果tr和ts在R∩S的每个属性上有相同的值,一个元组t会被加到结果中,t在r上和tr有相同的值,在s上和ts有相同的值。
    * 如R = (A, B, C, D),S = (E, B, D),结果模式=(A, B, C, D, E)
    * r * s 定义为:r.A, r.B, r.C, r.D, s.E (r.B = s.B  r.D = s.D (rx s))
θ连接是普通连接,不需要对操作都有相同属性值,连接条件可以是任何比较操作,即 R times S WHERE F
Equi-join是另一种连接,它的连接条件为比较操作

Division操作
适用于包括所有“for all“短语的查询
假设r和s分别是R和S模式上的关系,R = (A1, …, Am, B1, …, Bn),S = (B1, …, Bn)
r÷s是如下模式的关系:R – S = (A1, …, Am),r  s = { t | t   R-S(r)   u  s ( tu  r ) }
性质:
    * 令q为r÷s的结果,则q是满足q x s ∈ r的最大的关系
(特殊符号比较难打,我选择放弃了)
Assignment操作
赋值操作提供了一个表达复杂查询的方式,赋值必须总是作用于临时关系

扩展操作
外部连接(Outer Join)
聚集函数(Aggregate Functions)
半连接(Semijoin)
半差(Semiminus)
扩展(extend)
Generalized Projection
(具体介绍及查询例子略)

数据库修改操作
Deletion: r←r - E
Insertion: r←r ∪ E
Updating: r← ∏F1,F2,...,Fl,(E)

关系代数和SQL
e.g.
∏s#(σcity="London"(σP.p#=SP.p#(P×SP)))
Select s#From P, SPWhere P.p#=SP.p# AND city='London'
e.g.
∏s#(σp#=p#((σcity="London"(P))×SP))
Select s#From SPWhere p# in (Select p#             From P             Where city = 'London')
e.g.
g sum(SAL) (EMP)
Select sum(SAL) From EMP
e.g.
σAVG(SAL)>2000(d# g AVG(SAL) (EMP))
Select d#, AVG(SAL)From EMPGroup By d#Having AVG(SAL)>2000

第7章 关系演算

目录

引言
元组演算
举例
关系演算与关系代数比较
域演算
其他演算语言

1.引言
基于数理逻辑分支的谓词演算
ALPHA,QUEL语言
范围变量:关系演算的一个基本特征,如sx的范围是S
元组演算和域演算

2.元组演算
语法
<Range var definition>::=RANGEVAR <range var name>RANGES OVER <relational exp commlist><range attr reference>::= <range var name>.<attr reference> [AS <attr name>]<boolean exp>::=...all the usual possibilityes,together with: | <quantified boolean exp><quantified boolean exp>::= EXISTS <range var name> (<boolean exp>)|FORALL <range var name>(boolean exp>)<relational operation>::= <proto tuple>[WHERE <boolean exp>]<proto tuple> ::= <tuple exp>
范围变量
范围变量并不是程序语言角度的变量,而是逻辑意义上的变量
e.g.
RANGEVAR sx RANGES OVER S;RANGEVAR sy RANGES OVER S;RANGEVAR spx RANGES OVER SP;RANGEVAR spy RANGES OVER SP;RANGEVAR px RANGES OVER P;
量词
ESISTS v (P)
FORALL v (P)
定义:
EXISTS v (P(v))
false OR P(t1) OR ... OR P(tm)
FORALL v (P(v))
true AND P(t1) AND ... AND P(tm)
FORALL v (p) = NOT EXISTS v (NOT p)
e.g.
r(a,b,c)={(1,2,3) (1,2,4) (1,3,4)}
EXISTS V (V.c>1) :true
EXISTS V (V.b>3) :false
EXISTS V (V.a>1 OR V.c=4) : true
FORALL V (V.a>1) : false
FORALL V (V.b>1) : true
FORALL V (V.a=1 AND V.c>2) : true

3.举例
查找在巴黎的状态数大于20的的供应商号码和状态:
(sx.s#,sx.status)WHERE sx.city = 'paris' ANDsx.status > 20
查找所有在同一地点的供应商的供应号码组合:
(sx.s# AS SA, sy.s# AS SB)WHERE sx.city = sy.cityAND sx.s#<sy.s#
查找供应零件p2的供应商的所有信息:
sx WHEREEXISTS spx (spx.s#=sx.s# AND spx.p#=p#('p2'))
查找至少供应一个红色零件的供应商名称:
sx.sname WHEREEXISTS spx (sx.s#=spx.s# ANDEXISTS px (px.p#=spx.p# ANDpx.color = color('red')))
查找至少有一个零件和供应商s2所供应的相同的供应商名称
sx.sname WHEREEXISTS spx ( EXISTS spy (sx.s#=spx.s# AND  spx.p#=spy.p# AND  spy.s#=s#('s2')))
查找供应了所有零件的供应商名称:
sx.sname WHEREFORALL px (EXISTS spx   (spx.s#=sx.s# AND    spx.p#=px.p#))
查找没有供应零件p2的供应商名称:
sx.s#WHERE NOT EXISTS spx(spx.s#=sx.s# AND spx.p#=p#('p2'))
查找至少供应了所有s2供应商所供应的零件的供应商号码:
sx.s# WHERE FORALL spx(spx.s# ≠ s#('s2') OR EXISTS spy (spy.s#=sx.s# AND  spy.p#=spx.p#))
查找零件质量大于16磅或者由供应商s2所供应的零件号码,或者两者均满足:
RANGEVAR pu RANGE OVER(px.p# WHERE px.weight>weight(16.0)),(spx.p# WHERE spx.s# = s#('s2'));pu.p#或者px.p#WHERE px.weight>weight(16.0)OR EXISTS spx(spx.p#=px.p# ANDspx.s# = s#('s2'))

4.关系演算与关系变量比较
看不太懂~~略过不记

计算能力
查找重量超过10000克的零件的零件号和重量:
(px.P#,px.weight*454 as GMWT)WHEREpx.weight*454>weight(10000.0)
对每个零件,取出每一个零件号和其供货总数量:
(px.p#,SUM(spx WHERE spx.p#=px.p#,QTY)   AS totqty)
查找总的供货数量:
SUM(spx,QTY) AS Grandtotal
对每一个供应商,取出其供应商号及其供应的零件总数量:
(sx.s#, COUNT(spx WHERE spx.s#=sx.s#)AS #_of_parts)
找出保存至少5个红色零件的城市:
RangeVar py Over Ppx.city WHERE COUNT(py WHERE py.city=px.cityAND py.color=color('red'))>5

5.域演算
在域上的范围变量:
RANGEVAR sx, sy RANGES OVER S#;RANGEVAR px, py RANGES OVER P#;RANGEVAR namex, namey RANGES OVER name;RANGEVAR qtyx, qtyy RANGES OVER qty;RANGEVAR cityx, cityy RANGES OVER char;
成员条件:R(pair, pair,...)

举例:查找位于巴黎且其状态大于20的供应商的供应商号:
sx WHERE EXISTS statusx    (statusx>20 AND     S(s#:sx, status:statusx, city: 'Paris'))
查找所有成对的住在同一城市的供应商的供应商号:
(sx AS sa, sy AS sb)WHERE EXISTS cityz(S (s#:sx, city:cityz) AND S (s#:sy, city:cityz) ANDsx < sy)

表达式的安全性
有可能会产生无限关系的元组表达式,如对于{t | ┐t∈r},如果关系r的任意属性的域是无限的,则得到的关系也是无限的

6.其他演算语言
Query-by-Example(QBE)
Datalog

QBE-基本结构
一个基于域关系演算的图形化查询语言
_x是个变量(可选的),P.指的是打印(输出),默认去除重复,返回重复结果可以使用P.ALL

Microsoft Access QBE
Graphical Query By Example(GQBE)

第8章 视图

目录

引言
视图的用途
视图检索
视图更新
快照
SQL对视图的支持

1.引言
视图是外部模型
视图是在一些基本表的基础上创建的一个表
视图是一个命名了的关系代数表达式
导出(虚)关系变量

定义:
VAR <relvar name> VIEW <relational expression>  [<candidate key definition list>];

举例:
VAR good_supplier VIEW (S WHERE status>15){s#,status,city}
VAR redpart VIEW ((P WHERE color=color('red')) {ALL BUT color} RENAME weight AS wt;


2.视图的用途

视图对于隐藏的数据自动给予安全保障;提供了一个快捷方式或者是“宏”的功能;使相同的数据可在同一时间被不同的用户以不同的方式查看;提供了逻辑上的数据独立性

视图定义结合了外部模式函数和外部模式/概念映像函数

逻辑独立性:用户或用户程序在数据库逻辑结构发生改变时的抗扰性

可成长性:已有的基本关系变量为增加新的属性而扩展;引入一个新的基本关系变量

可重构性:如果用以下两个关系变量代替S:

VAR snc BASE RELATION {s#,s#,sname name,city char} PRIMARY KEY {s#}VAR st BASE RELATION{s# s#,status integer}PRIMARY KEY {s#}
则S为:VAR S VIEW snc JOIN st;

两个准则:

互换性准则:在基本关系变量和导出的关系变量中不能有随意的或不必要的区别, 如S vs snc and st

数据库相对性准则:真实数据库 vs 可表达数据库


3.视图检索

D是一个数据库,V是定义在D上的视图,则视图的定义表达式X是定义在D上的一个函数:

V = X(D)

在V上的检索为:

R(V) = R(X(D)) = X'(D)

所以,对视图的检索和对基本变量的检索没多大差别

视图实现:

物化(Materializing):X(D)拥有关系的一个副本

替代(Substitution):X(D)没有物化的副本,检索V会直接改变检索D


4.视图更新

U是V上的更新操作,则

U(V) = U(X(D))

变为 U(X(D)) = X(U'(D))

所以,视图更新更复杂了

视图更新机制要遵循的基本准则:

视图可更新性是一个语义学问题,而与语法无关;

对于视图就是基本关系变量这一特殊情况,视图更新机制必须要正确处理;

更新法则必须要用到它的地方保持对称;等。

DELETE:如果A中的元组时,如果它还在B中出现,则在B中删除

UPDATE:更新后的元组必须能满足PA或PB或同时满足两者

INSERT:新的元组必须满足PA或PB,或同时满足PA和PB

Difference、Restrict、Project、Extend、Join


5.快照

导出的关系变量,与视图相似

定义:

VAR <relvar name> SNAPSHOT <rel exp><candidate key definition list>REFRESH EVERY <now and then>

6.SQL对视图的支持

create view v as <query expression>

例如:

create view good_supplier as(select s.s#,s.status,s.cityfrom Swhere s.status>15);
Create view redpart AS select p#,pname,weight AS wt,city   from P   where color = 'red';
Create view PQAS select p#, SUM(qty) AS totqtyfrom SPgroup by p#;
create view city_pairAS select distinct s.city scity, p.city pcityfrom S,SP,Pwhere s.s#=sp.s# and sp.p#=p.p#
Create viewdept_summary(name,minsal,maxsal,avgsal)AS select dname,min(sal),max(sal),ave(sal)from EMP,DEPTwhere dept.d#=emp.d#group by dname;
视图检索:

从redpart视图中查找所有重量大于20磅的零件:

select * from redpartwhere wt > 20;
它会改变在基本关系上的操作:

select p#,pname,weight,cityfrom Pwhere color = 'red' and weight > 20;
查找雇员平均工资等于2000的所有部门:

select name from dept_summarywhere avesal = 2000
它会改变在基本关系上的操作:

select dname from emp, deptwhere emp.d#=dept.d#group by dnamehaving avg(sal)=2000;
简单视图vs复杂视图

简单视图必须满足:不包含关键词JOIN,UNION,INTERSECT,EXCEPT,不包含关键词DISTINCT,SELECT语句只包含单列名称,子查询语句不能参照与外部查询相同的表,没有GROUP BY 语句等。

向redpart中添加新的元组:

insert into redpartvalues (p8, knife, 10, 'shanghai')

对更复杂的视图的更新比较困难或不可能,所以被禁止

大多数SQL实现只允许在简单视图上的更新(无聚集函数)

SQL使用with check option'作为更新视图定义

create view good_supplier asselect s.s#,s.status,s.cityfrom Swhere s.status>15with check option;
则如下操作失败:
Update good_supplierset status=10where s#='s1';

第9章 安全性

目录

引言
自主访问控制
 -授权
 -SQL支持
强制访问控制

1.引言
安全性:保护数据避免受到未授权用户故意造成的破坏
完整性:保护数据避免受到授权用户无意中造成的破坏

安全性:数据库系统层、操作系统层、网络层、物理层、人力层
操作系统层:操作系统超级用户可以对数据库做任何事,好的操作系统层次安全性是必需的
网络层:必须使用加密来防止窃听和伪造
物理层:入侵者对物理的访问可能对数据造成破坏,传统的lock-and-key机制是必要的;计算机还需要防止自然灾害的破坏
人力层:用户必须要被监视以保证已授权用户不会给入侵者访问权限;用户应该在密码选择和安全性方面接受训练
数据库系统层:鉴别和授权机制允许特定用户访问所需数据(安全子系统)

安全管理
三个层次:服务器授权、DB数据库账户、对象访问授权

2.访问控制机制
自主访问控制:基于身份鉴别
强制访问控制:基于安全模型,数据对象以密级进行标记,用户具有许可证

授权
数据库上的授权形式:
读取授权:允许读,但无修改数据的权限;
插入授权:允许插入,但无对所存在的数据进行修改的权限;
更新授权:允许修改,但没有删除数据的权限;
删除授权:允许删除数据
修改数据库模式的授权形式:
索引授权:允许创建和修改索引;
资源授权:允许创建新的关系;
修改授权:允许添加或删除关系中的属性;
删除(Drop)授权:允许删除关系

授权和视图

Granting of Privileges
权限从一个用户到另一个用户的传递可以使用授权图(authorization graph),图的结点是用户,图的根是数据库管理员
要求:授权图中的所有边必须是源于数据库管理员结点的某条路径的一部分
避免没有从根结点出发的环的存在

SQL中的安全说明
grant语句用于授予权限:
grant <privilege list>on <relation name or view name> to <user list>
<user list>包括:a user-id(用户id),public(允许对所有有效用户的授权)、a role(角色)
对一个视图进行授权并不意味着对其下的关系进行授权
授权者必须已拥有特定权限或是数据库管理员

SQL中的权限
select:
grant select on branch to U1,U2,U3
insert:
update:
delete:
references:当创建关系时定义外键的权限
usage:在SQL-92中,授予一个用户使用特定域的权限
all privileges:所有权限
with grant option:允许被授权用户传递该权限

Roles
角色允许普通权限授予用户组

SQL中的Revoking机制
revoke语句用于撤销授权:
revoke <privilege list>on <relation name or view name> from <user list> [restrict|cascade]
举例:
revoke select on branch from U1,U2,U3 cascade
避免级联撤销的方法:采用restrict代替cascade,此时,当请求进行级联撤销时,操作会失败

审计追踪
审计追踪本质上是一特殊的文件或数据库,系统可自动记录用户对数据执行的所有操作,在有些系统中,审计追踪物理上与恢复日志合二为一
审计追踪包含如下信息:
请求(源文本)
发出操作调用的终端
发出操作调用的用户
操作日期和时间
操作作用的关系变量、元组、属性
旧值
新值

SQL授权的限制
SQL不支持对元组的授权、应用程序的所有终端用户可能会被映射到单一的数据库用户


3.强制访问控制

基于系统级别政策而不能被单一用户改变

每个数据对象都具有一定的密级

每个用户具有一定的许可证级别

在1900s受到关注,具有特定应用(军事、银行等)

对象(如表、视图、元组)

主体(如用户、用户程序)

密级:TS(Top Secret)、S(Secret)、C(Classified)、U(Unclassified)

每个主体和客体都被分为某个特定密级

Bell-LaPadulla 性质:

简单规则:(NO READ UP)用户i可以查询对象j,当且仅当i的许可证级别大于或等于j的密级

星规则:(NO WRITE DOWN)用户i可以更新对象j,当且仅当i的许可证级别等于j的密级


多级关系

multilevel relation(MLS) schema

密级属性C

元组密级TC

R(A1,C1,A2,C2,...An,Cn,TC)

橘皮书
























原创粉丝点击