关系演算(Relational Calculus)
关系代数通过建立一套代数系统,通过关系代数运算符表达查询;
关系演算基于谓词逻辑,用逻辑条件表达查询。
关系演算分为:元组关系演算(Tuple relational calculus, TRC)和域关系演算(Domain relational calculus, DRC).
- 元组关系演算变量定义在元组上,域关系演算变量定义在属性上。
域关系演算
查询形式: { ⟨ x 1 , x 2 , . . . , x n ⟩ ∣ P ( x 1 , x 2 , . . . , x n , x n + 1 , . . . , x n + m ) } \left\{ {\left\langle {{x_1},{x_2},...,{x_n}} \right\rangle {\kern 1pt} {\kern 1pt} \left| {P\left( {{x_1},{x_2},{\kern 1pt} {\kern 1pt} ...{\kern 1pt} {\kern 1pt} ,{x_n},{x_{n + 1}},{\kern 1pt} {\kern 1pt} ...{\kern 1pt} {\kern 1pt} ,{x_{n + m}}} \right)} \right.} \right\} {⟨x1,x2,...,xn⟩∣P(x1,x2,...,xn,xn+1,...,xn+m)}
-
结果变量由 x 1 , x 2 , . . . , x n {x_1},{x_2},...,{x_n} x1,x2,...,xn组成
-
这n个域变量应满足的条件: P ( x 1 , x 2 , . . . , x n , x n + 1 , . . . , x n + m ) {P\left( {{x_1},{x_2},{\kern 1pt} {\kern 1pt} ...{\kern 1pt} {\kern 1pt} ,{x_n},{x_{n + 1}},{\kern 1pt} {\kern 1pt} ...{\kern 1pt} {\kern 1pt} ,{x_{n + m}}} \right)} P(x1,x2,...,xn,xn+1,...,xn+m)
-
域关系演算查询,定义一组变量(域变量),定义表达式(布尔表达式)来对变量进行限制。
-
P所表达的公式,在关系演算中,采用递归的方法定义。从简单的原子公式(atomic formulas)开始,利用逻辑连接符,构成更复杂,更大的公式。
域关系演算中的原子公式:
- ⟨ x 1 , x 2 , . . . , x n ⟩ ∈ R n a m e , o r X o p Y , o r X o p c o n s tan t \left\langle {{x_1},{x_2},...,{x_n}} \right\rangle \in Rname,{\kern 1pt} {\kern 1pt} or{\kern 1pt} {\kern 1pt} X{\kern 1pt} {\kern 1pt} op{\kern 1pt} {\kern 1pt} Y,{\kern 1pt} {\kern 1pt} or{\kern 1pt} {\kern 1pt} X{\kern 1pt} {\kern 1pt} op{\kern 1pt} {\kern 1pt} cons\tan t ⟨x1,x2,...,xn⟩∈Rname,orXopY,orXopconstant(n个变量的某一组取值属于某个关系)
- op是比较公式:<,>,=,等等。。。
公式的定义(什么样的式子是公式):
- 原子公式
- 如果p,q是公式,那么 ¬ p , p ∧ q , p ∨ q \neg p,{\kern 1pt} {\kern 1pt} p \wedge q,{\kern 1pt} {\kern 1pt} p \vee q ¬p,p∧q,p∨q也是公式。
-
∃
X
(
p
(
X
)
)
\exists X\left( {p\left( X \right)} \right)
∃X(p(X)),存在x使p(x)为真。(在p中x是free的,没有被其他量词绑定)
- ∀ X ( p ( X ) ) \forall X\left( {p\left( X \right)} \right) ∀X(p(X)),所有x使p(x)为真。(在p中x是free的,没有被其他量词绑定)
什么是绑定(bound)和自由( free )变量
- 如果在一个域变量上面使用了量词, ∃ o r ∀ \exists {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\rm{or}}{\kern 1pt} {\kern 1pt} \forall ∃or∀.那么称X被绑定。
- 变量没有被绑定,就是free的。
关系演算法实质:使P为真的X对应的元组(结果域变量应该在p中是free的)。
例:查找所有级别大于7的水手: { ⟨ I , N , T , A ⟩ ∣ ⟨ I , N , T , A ⟩ ∈ S a i l o r s ∧ T > 7 } \left\{ {\left\langle {I,N,T,A} \right\rangle {\kern 1pt} {\kern 1pt} \left| {\left\langle {I,N,T,A} \right\rangle {\kern 1pt} {\kern 1pt} \in {\kern 1pt} {\kern 1pt} Sailors{\kern 1pt} {\kern 1pt} \wedge {\kern 1pt} {\kern 1pt} T{\kern 1pt} {\kern 1pt} } \right. > {\kern 1pt} {\kern 1pt} 7} \right\} {⟨I,N,T,A⟩∣⟨I,N,T,A⟩∈Sailors∧T>7}
不安全查询
句法正确的查询,结果无限多。即为不安全查询。
表达能力
可以证明,关系代数所表达的查询,都可以用一个安全的域关系演算或元组关系演算来表达。反之亦然。SQL语言是建立在关系演算之上的。
元组关系演算
查询形式: { t [ a t t r i b u t e l i s t ] ∣ P ( t ) } \left\{ {t\left[ {attribute{\kern 1pt} {\kern 1pt} {\kern 1pt} list} \right]{\kern 1pt} \left| {P\left( t \right)} \right.} \right\} {t[attributelist]∣P(t)}
- 变量t是定义在元组上的,t表明一个元组。
- t[所需要的元组属性]
- P(t),使P(t)为真的元组t。
例:查找所有级别大于7,年龄小于50的水手。
{
t
[
N
]
∣
t
∈
S
a
i
l
o
r
s
∧
t
.
T
>
7
∧
t
.
A
<
50
}
\left\{ {t\left[ N \right]\left| {t \in Sailors \wedge t.T > 7 \wedge t.A < 50} \right.} \right\}
{t[N]∣t∈Sailors∧t.T>7∧t.A<50}