DBMS-形式化關系查詢語言:關系代數、元組關系演算、域關系演算


關系代數

關系代數(relational algebra):一種過程化查詢語言。包括一個運算的集合,集合中運算以一個或兩個關系為輸入,產生一個新的關系作為結果。

關系代數的基本運算包括:選擇、投影、並、集合差、笛卡爾積、更名。

其他運算:集合交、自然連接、賦值,可用基本運算來定義。

關系運算的結果自身也是一個關系,可用一個關系運算表達式作為另一個關系運算的參數,因此可以把多個關系代數運算組合成一個關系代數表達式(relational-algebra expression

 

關系代數定義了一套在表上運算且輸出結果也是表的代數運算。這些運算可以混合使用來得到表達所希望查詢的表達式。關系代數定義了關系查詢語言中使用的基本運算。

關系代數運算可分為:基本運算、附加的運算(可用基本運算表達)、擴展的運算(其中一些擴展了關系代數的表達能力)。

關系代數是一種簡介的、形式化的語言,不適用於那些偶爾使用數據庫系統的用戶,因此商用數據庫系統采用有更多“語法修飾”的語言。(SQL基於關系代數)

 

1. 基本運算

一元運算:對一個關系進行運算,包括選擇、投影、更名運算。

二元運算:對兩個關系進行運算,包括並、集合差、笛卡爾積運算。

 

選擇(select)運算選出滿足給定謂詞的元組,用小寫sigma(σ)表示,下標為謂詞,括號中為參數關系。

e.g. 找出關系instructor中屬於物理系的所有教師

σdept_name=”Physics”(instructor)

e.g. 找出工資額大於90000美元的所有教師

σsalary>90000(instructor)

可用連詞and(∧)、or(∨)、not(¬)將多個謂詞合並為一個較大的謂詞。

e.g. 找出屬於物理系且工資大於90000美元的所有教師

σdept_name=”Physic”salary>90000(instructor)

選擇謂詞中可包括兩個屬性的比較。

e.g. 找出所有系名與樓名相同的系

σdept_name=building(department)

注意:關系代數中的屬於select與SQL中的關鍵詞select含義不同,關系代數中屬於select對應SQL中的where。

 

投影(project)運算:返回作為參數的關系,但把某些屬性排除在外,所有重復行均被去除。用大寫pi(Π)表示,下標為在結果中出現的屬性,括號中為參數關系。

e.g. 列出所有教師的ID、name和salary,而不關系dept_name。

ΠID, name, salary(instructor)

e.g. 找出物理系所有教師的名字

Πnamedept_name=”Physics”(instructor))

 

並(union)運算: 可將兩個集合並起來,找出出現在兩個集合之一或同時出現在兩個集合中的所有元組。用表示。

e.g. 找出開設在2009年秋季學期或者2010年春季學期或者這二者皆開的所有課程的集合。

Πcourse_idsemester=”Fall”year=2009(section))∪Πcourse_idsemester=”Spring”year=2010(section))

/*注意:結果中重復值只留下單個元組。*/

必須保證做並運算的關系是相容的,否則運算結果沒有意義。要使並運算rs有意義(rs可以是數據庫關系或作為關系代數表達式結果的臨時關系),要求以下兩個條件同時成立:

a. 關系r和s必須是同元的(屬性數目相同)。

b. 對所有的i,r的第i個屬性的域必須和s的第i個屬性的域相同。

 

集合差(set-difference)運算:表達式r-s包含所有在r中而不在s中的元組的關系。

e.g. 找出所有開設在2009年秋季學期但是在2010年春季學期不開的課程。

Πcourse_idsemester=”Fall”year=2009(section))-Πcourse_idsemester=”Spring”year=2010(section))

類似並運算,必須保證做集合叉運算的關系是相容的,否則運算結果沒有意義。要使集合差運算r-s有意義,要求一下兩個條件同時成立:

a. 關系r和s必須是同元的。

b. 對所有的i,r的第i個屬性的域必須和s的第i個屬性的域相同。

 

笛卡爾積(Cartesian-product)運算:將任意兩個關系的信息組合在一起,結果中包含所有可能的元組對。關系r1和r2的笛卡爾積寫作r1×r2,假如r1有n1個元組,r2有n2個元組,則可由n1×n2種方式選擇元組對。

由於相同的屬性名可能同時出現在r1和r2中,需要一個命名機制來區別這些屬性。可采用把屬性所來自的關系名稱附加到該屬性上的方法。

e.g. r = instructor×teaches的關系模式

(instructor.ID, instructor.name, instructor.dept_name, instructor.salary, teaches.ID, teaches.course_id, teaches.sec_id, teaches.semeser, teaches.year)

/*對於只在兩個關系模式之一出現的屬性,通常省略其關系名前綴。因此可將r的關系模式寫作:*/

(instructor.ID, name, dept_name, salary, teaches.ID, course_id, sec_id, semester, year)

注意:該命名規則規定作為笛卡爾積運算參數的關系名稱必須不同,因此當某個關系要與自身做笛卡爾積或在笛卡爾積中使用關系代數表達式結果時可能產生問題,可通過更名運算給關系一個名字以引用其屬性來解決。

e.g. 找出物理系中的所有教師,以及他們所教授的所有課程。

/* σdept_name=”Physics”(instructor×teaches)只包含物理系的教師的元組,但course_id列可能包含並非這些教師所教授的課程;

σinstructor.ID=teaches.IDdept_name=”Physics”(instructor×teaches))包含物理系教師以及他們所教的課程的元組;

Πname, course_idinstructor.ID=teaches.IDdept_name=”Physics”(instructor×teaches)))投影得到需要的教師名字列和corse_id列。*/

Πname, course_idinstructor.ID=teaches.IDdept_name=”Physics”(instructor×teaches)))

/*用關系代數表達查詢的方法並不唯一,也可采用如下等價查詢:*/

Πname, course_idinstructor.ID=teaches.ID((σdept_name=”Physics”(instructor))×teaches))

 

更名(rename)運算:給關系代數表達式的結果賦上名字以供引用,用小寫rho(ρ)表示。

表達式ρx(E)返回給定關系代數表達式E的結果並把名字x賦給它。更名運算也可用於關系,可得到具有新名字的一個相同的關系。

更名運算的另一形式:ρx(A1, A2, …, An)(E)。假設關系代數表達式E是n元的,運算返回表達式E的結果,並把名字x賦給它,同時將各屬性更名為A1, A2, …, An

e.g. 找出大學里的最高工資

/*步驟1:計算出一個由非最高工資組成的臨時關系。

首先通過更名運算引用其中一個instructor關系以便計算笛卡爾積instructor×instructor,再構造選擇運算比較任意兩個出現在同一元組中的salary選擇較低的元組。通過投影選取instructor.salary列得到非最高工資構成的臨時關系*/

Πinstructor.salaryinstructor.salary<d.salary(instructor×ρd(instructor)))

/*步驟2:計算關系Πsalary (instructor)和剛才計算出的非最高工資構成的臨時關系的集合差,得到結果。*/

Πsalary (instructor)-Πinstructor.salaryinstructor.salary<d.salary(instructor×ρd(instructor)))

 

更名運算不是必須的,因為可以用位置標記隱含地作為關系(或關系代數表達式運算的結果)的屬性名,用$1、$2、…指代第一個屬性、第二個屬性…以此類推。

e.g. 用位置標記來計算大學里的非最高工資構成的臨時關系

/*在笛卡爾積(instructor×instructor)中,$4代表第一個instructor的屬性salary,$8代表第二個instructor的屬性salary。*/

Π$4$4<$8(instructor×instructor))

如果一個二元運算需要區分其運算對象的兩個關系,也可使用為指標及作為關系的名稱。E.g. $R1指代第一個作為運算對象的關系,$R2指代第二個關系。

 

 

2. 關系代數的形式化定義

關系代數中基本的表達式是以下二者之一:a. 數據庫中的一個關系;b. 一個常數關系。

 

常數關系:可在{}內列出其元組來表示。

E.g. {(22222, Einstein, Physics, 95000), (76543, Singh, Finance, 80000)}

 

設E1和E2都是關系代數表達式,則以下這些都是關系代數表達式:

·E1∪E2

·E1-E2

·E1×E2

·σp(E1),P為E1屬性上的謂詞。

·ΠS(E1),S為E1上某些屬性的列表。

·ρx(E1),x為E1結果的新名字。

 

 

3. 附加的關系代數表達式

關系代數的基本運算足以表達任何關系代數查詢。附加的關系代數運算不能增強關系代數的表達能力,但可以簡化一些常用的查詢。

 

集合交(intersection)運算 ()

e.g. 找出在2009年秋季和2010年春季都開設的課程

Πcourse_idsemester=”Fall”year=2009(section))∩Πcourse_idsemester=”Spring”year=2010(section))

任何使用了集合交的關系代數表達式都可以通過一對集合差運算替代重寫:

r∩s=r-(r-s)

 

自然連接(natural join)運算 ():首先形成兩個參數關系的笛卡爾積,然后基於兩個關系模式中都出現的屬性上的相等性進行選擇(只考慮兩個關系在所有相同屬性有相同值的元組組成的元組對),最后去除重復屬性(並不重復記錄在兩個關系模式中都出現的屬性)。

自然連接的形式化定義:

設r(R)和s(S)(模式分別為R和S的兩個關系),其自然連接的結果r ⋈ s是模式R∪S上的一個關系。

r ⋈ s = ΠRSr.A1=s.A1r.A2=s.A2r.An=s.An(r×s)),其中R∩S={A1, A2, …, An}。

如果r和s不含有任何相同屬性,即R∩S=∅,則r ⋈ s = r×s。

所列出的屬性的順序:兩個關系模式的相同屬性排在最前,只屬於第一個關系模式的屬性其次,只屬於第二個關系模式的屬性最后。

e.g. 找出所有教師的姓名,連同他們教的所有課程的course_id。

/*instructor和teaches自然連接的結果模式為(ID, name, dept_name, salary, course_id),投影后得到模式為(name, course_id)的關系。*/

Πname, course_id(instructor ⋈ teaches)

 考慮兩個關系模式R和S,可將關系模式看作集合:用R∩S表示同時出現在R和S中的屬性名,用R∪S表示出現在R中、S中或在二者中都出現的屬性名,用R-S表示出現在R中而不出現在S中的屬性名,用S-R表示出現在S中而不出現在R中的屬性名。

自然連接時可結合的(associative)。

e.g. 找出計算機系的所有教師,以及他們教授的所有課程的名稱。

/* 自然連接instructor ⋈ teaches ⋈ course的執行順序可能為

(instructor ⋈ teaches) ⋈ course 或 instructor ⋈ (teaches ⋈ course),二者是等價的。*/

Πname, titledept_name=”Comp.Sci.”(instructor ⋈ teaches ⋈ course))

 theta連接(theta join)運算:是自然連接的擴展。

考慮關系r(R)和s(S),θ是模式R∪S的屬性上的謂詞。r ⋈θ s = σθ(r×s)

 

賦值(assignment)運算 ():可用於給臨時關系變量賦值,便於寫關系代數表達式。

e.g. 自然連接運算r ⋈s的定義可寫作

temp1←r×s

temp2←σr.A1=s.A1r.A2=s.A2r.An=s.An(temp1)

result = ΠRS(temp2)

對關系代數查詢而言,賦值必須是賦給一個臨時關系變量。對永久關系的賦值形成了對數據庫的修改。

 

外連接(outer-join)運算:連接運算的擴展,可處理缺失的信息(因為不滿足自然連接條件而不能在自然連接結果中找到的元組),避免信息的丟失。

外連接運算與自然連接運算類似,不同之處在於外連接在連接計算結果中添加額外的帶空值的元組,以此保留在連接中丟失的元組。

外連接運算有三種形式:

左外連接(left outer join)():取出左側關系中所有與右側關系的任一元組都不匹配的元組,用空值填充所有來自右側關系的屬性,再把產生的元組加到自然連接的結果中。所有來自左側關系的信息在左外連接結果中都得到保留。

右外連接(right outer join)():與左外連接相對稱,用空值填充來自右側關系的所有與左側關系任一元組都不匹配的元組,將結果加到自然連接的結果中。所有來自右側關系的信息在右外連接中都得到保留。

全外鏈接(full outer join)():既做左外連接又做右外連接,既填充左側關系中與右側關系的任一元組都不匹配的元組,又填充右側關系中與左側關系任一元組都不匹配的元組,並把結果都加到連接的結果中。

注意:外連接運算可用基本關系代數運算表示。E.g. 左外連接運算r⟕s可寫作

/*其中常數關系{(null, …, null)}的模式為S-R。*/

(r ⋈ s)∪(r - ΠR(r ⋈ s)) × {(null, …, null)}

 

 

4. 擴展的關系代數運算

擴展的關系代數(extended relational-algebra)運算可實現一些不能用基本的關系代數運算來表達的查詢

 

廣義投影(generalized-projection):通過允許在投影列表使用算術運算和字符串函數等來對投影進行擴展。

運算形式:

ΠF1, F2, …, Fn(E)

其中E為任意關系代數表達式,F1, F2, …, Fn都是涉及常量以及E的模式中屬性的算術表達式。

最基本情況下算術表達式可以僅僅是一個屬性或常量,在表達式中可使用對數值屬性或產生數值結果的表達式的+、-、*、/等代數運算。廣義投影還允許其他數據類型上的運算(如字符串的串接)。

e.g. 查詢每個教師的ID、name、dept_name以及每月的工資

ΠID, name, dept_name, salary/12(instructor)

 

聚集運算(𝒢)

聚集函數(aggregate function):輸入值的一個匯集,將單一值作為結果返回。E.g. 聚集函數sum、avg、count、min、max。

e.g. 使用聚集查詢所有教師的工資總和的關系代數表達式

𝒢 sum(salary)(instructor)

 

在計算聚集函數前如果想去除重復,可使用連字符將distinct附加在函數名后。

e.g. 找出在2010年春季學期教課的教師數(每名教師只應計算一次,而不管他教了幾門課程。)

/*聚集函數count-distinct確保:即使某位教師授課多於一門,在結果中也只對他計數一次。*/

𝒢 count-distinct(ID)semester=”Spring”year=2010(teaches) )

 

可對一組元組集合(而不是單個元組集合)執行聚集函數。

聚集運算的通常形式為:

G1, G2, …, Gn𝒢 F1(A1), F2(A2), …, Fm(Am)(E)

其中E為任意關系代數表達式,G1, G2, …, Gn是用於分組的一系列屬性,每個Fi是一個聚集函數,每個Ai是一個屬性名。表達式E的結果中的元組被分成若干組,各組用屬性G1, G2, …, Gn上的值唯一標識。

屬性列G1, G2, …, Gn可以為空,則唯一一組包含關系中所有的元組(相當於沒有分組)。

e.g. 分別查詢a. 每個系教師的平均工資 b. 所有教師的平均工資

/*先通過dept_name屬性對關系instructor進行分組,再對每個分組執行指定查詢。*/

dept_name 𝒢 average(salary)(instructor)

/*從運算符𝒢左邊去掉了屬性dept_name,整個關系被當做單個組來執行聚集。*/

𝒢 average(salary)(instructor)

 

多重集(multiset):使用聚集函數對其進行操作的匯集中,一個值可以出現多次,值出現的順序是無關緊要的,這樣的匯集稱為多重集。集合(set)是多重集的特例,其中每個值都只出現一次。

多重集關系代數(multiset relational algebra):SQL與關系代數不同,允許在輸入關系以及查詢結果匯總存在元組的多重拷貝。為了映射SQL的這種模式,我們定義了多重集關系代數來對多重集進行操作。

多重集關系代數基本運算的定義:

1. 如果在r1元組t1有c1份拷貝,並且t1滿足選擇σθ,那么在σθ(r1)中元組t1有c1份拷貝;

2. 對於r1中元組t1的每份拷貝,在ΠA(r1)中都有一個與之對應的ΠA(t1),表示單個元組t1的投影。

3. 如果在r1中元組t1有c1份拷貝,在r2中元組t2有c2份拷貝,那么在r1×r2中就有元組t1t2的c1*c2份拷貝。

按照SQL中的相應含義,還可用相似方法定義多重集的並、交、集合差運算。(聚集運算在多重集定義下沒有變化)

 

 

元組關系演算

不同於關系代數表達式,元組關系演算(tuple relational calculus非過程化的(nonprocedural)查詢語言,只描述所需信息,而不給出獲得該信息的具體過程。

元組關系演算中的查詢表達為:{ t | P(t) }。含義:所有使謂詞P為真的元組t的集合。

 

1. 查詢示例

e.g. 找出工資大於80000美元的所有教師的ID

/*所有滿足如下條件的元組t的集合:在關系instructor中存在元組s使t和s在屬性ID上的值相等,且s在屬性salary上的值大於80000美元。

因為ID屬性是對t進行限制的條件所涉及的唯一屬性,因此結果只得到ID列上的關系。*/

{ t| ∃s∈instructor( t[ID] = s[ID] ∧ s[salary] >80000 ) }

e.g. 找出位置在Watson樓的系中的所有教師姓名

/*元組變量u保證該系位於Watson樓,元組變量s被限制到與u的dept_name相同。結果得到name列上的關系。*/

{ t | ∃s∈instructor( t[name] = s[name]

∧∃u∈department( u[dept_name] = s[dept_name]

                     ∧ u[building] = ‘Watson’ ) ) }

e.g. 找出在2009年秋季學期或2010年春季學期或這兩個學期都開設的所有課程的course_id

/*給出至少滿足下面兩個條件之一的couse_id元組的集合:

·在關系section中滿足semester=Fall且year=2009的某個元組包含該course_id;

·在關系section中滿足semester=Spring且year=2010的某個元組包含該course_id。*/

{ t | ∃s∈section ( t[course_id] = s[course_id] )

     ∧s[semester] = “Fall”∧s[year] = 2009 )

∨∃u∈section (u[course_id] = t[course_id] )

     ∧u[semester] = “Spring”∧u[year] = 2010 )

e.g. 找出只在2009年秋季和2010年春季兩個學期都開設的所有課程的course_id

{ t | ∃s∈section ( t[course_id] = s[course_id] )

     ∧s[semester] = “Fall”∧s[year] = 2009 )

∧∃u∈section (u[course_id] = t[course_id] )

     ∧u[semester] = “Spring”∧u[year] = 2010 )

e.g. 找出2009年秋季開設而2010年春季不開的所有課程的course_id

/*從2009年秋季開設的課程中去掉那些在2010年春季開設的課程*/

{ t | ∃s∈section ( t[course_id] = s[course_id] )

     ∧s[semester] = “Fall”∧s[year] = 2009 )

∧¬∃u∈section (u[course_id] = t[course_id] )

     ∧u[semester] = “Spring”∧u[year] = 2010 )

e.g. 找出所有那些選了生物系全部課程的學生

/*所有滿足如下條件的ID列上的元組t的集合:

對關系course中所有元組u,如果u在dept_name屬性上的值是’Biology’,那么在關系takes中一定存在一個包含該學生ID以及該課程course_id的元組。

注意:如果生物系沒有開設任何課程,則所有學生ID都滿足條件。該情況下,∃r∈student ( r[ID] = t[ID] )保證結果是關系student里的學生ID的值。*/

{ t | ∃r∈student ( r[ID] = t[ID] ) ∧

  ∀u∈course (u[dept_name] = “Biology”⇒

∃s∈takes ( t[ID] = s[ID]

∧s[course_id] = u[course_id] ) ) }

 

 

形式化定義

元組關系演算表達式的形式:{ t | P(t) }

P為一個公式,公式中可出現多個元組變量,如果元組變量不被∃或∀修飾則稱為自由變量,否則稱為受限變量

公式由原子構成。原子可以為如下形式之一:

·s∈r,其中s為元組變量,r為關系;

·s[x] 𝚯 u[y],其中s、u為元組變量,x為s所基於的關系模式中的一個屬性,y為u所基於的關系模式中的一個屬性,𝚯為比較運算符(<, ≤, =, ≠, >, ≥)(要求x和y所屬域成員可用𝚯比較);

·s[x] 𝚯 c,其中s為元組變量,x為s所基於的關系模式中的一個屬性,c是屬性x所屬域中的常量。

根據如下規則用原子構造公式:

·原子是公式;

·如果P1是公式,則¬P1和(P1)也都是公式;

·如果P1和P2是公式,則P1∨P2、P1∧P2和P1⇒P2也都是公式;

·如果P1(s)是包含自由元組變量s的公式,r為關系,則∃s∈r(P1(s))和∀s∈(P1(s))也都是公式。

 

元組關系演算中的等價性規則:

·P1∧P2等價¬(¬(P1)∨¬(P2));

·∀t∈r(P1(t))等價¬∃t∈r(¬P1(t));

·P1⇒P2等價¬(P1)∨P2

 

 

元組關系演算表達式的安全性

為避免元組關系演算表達式產生一個無限的關系,需對元組關系演算進行限制。

域(domain):元組關系公式P的域用dom(P)表示,是P所引用的所有值的集合。它既包括P自身用到的值,又包括P中所涉及的關系的元組中出現的所有值。(i.e. P中顯式出現的值,以及名稱出現在P中的那些關系的所有值的集合)。

如果出現在表達式{ t | P(t) }結果中的所有值均來自dom(P),則表達式是安全的,安全的表達式一定包含有限的結果。

 

語言表達能力

限制在安全表達式范圍內的元組關系演算和基本關系代數(不包括擴展的關系代數運算符)具有相同的表達能力。

因此:

對於每個只運用基本操作的關系代數表達式,都有與之等價的元組關系演算表達式;

對於每個元組關系演算表達式,也都有與之等價的關系代數表達式。

 

 

域關系演算

域關系演算(domain relational calculus):關系演算的另一種形式,使用從屬性域中取值的域變量,而不是整個元組的值。

 

1. 形式化定義

域關系演算中的表達式形式:

{ <x1, x2, …, xn> | P(x1, x2, …, xn) }

其中x1, x2, …, xn代表域變量,P代表由原子構成的公式。

原子可以為如下形式之一:

·<x1, x2, …, xn>∈r,其中r為n個屬性上的關系,x1, x2, …, xn為域變量或域常量;

·x𝚯y,其中x和y為域變量,𝚯為比較運算符(要求屬性x和y所屬域可用𝚯比較);

·x𝚯c,其中x為域變量,c是x作為域變量的那個屬性域中的常量。

根據如下規則用原子構造公式:

·原子是公式;

·如果P1是公式,則¬P1和(P1)也都是公式;

·如果P1和P2是公式,則P1∨P2、P1∧P2和P1⇒P2也都是公式;

·如果P1(x)是包含自由域變量x的公式,則∃x(P1(x))和∀x(P1(x))也都是公式。

我們把∃a,b,c(P(a,b,c))作為a(∃b(∃c(P(a,b,c))))的簡寫。

 

2. 查詢示例

e.g. 找出工資在80000美元以上的教師的ID、name、dept_name和salary。

{ <i, n, d, s> | <i, n, d, s>∈instructor∧s>80000 }

e.g. 找出工資大於80000美元的所有教師的姓名

{ < i > | ∃n, d, s (<i, n, d, s>∈instructor∧s>80000) }

e.g. 找出在物理系的所有教師的姓名,以及他們教授的所有課程的course_id。

{ <n, c> | ∃i, a, s, y (<I, c, a, s, y>∈teaches

   ∧∃d, s(<i, n, d, s>∈instructor∧d=”Physics”) ) }

e.g. 找出在2009年秋季學期或2010年春季學期或這兩個學期都開設的所有課程的集合

{ < c > | ∃a, s, y, b, r, t(<c, a, s, y, b, r, t>∈section

     ∧s=”Fall”∧y=”2009”)

   ∨∃a, s, y, b, r, t(<c, a, s, y, b, r, t>∈section

     ∧s=”Spring”∧y=”2010”) }

e.g. 找出選了生物系開設的全部課程的所有學生

/*如果生物系沒開設任何課程,結果將包含所有學生。*/

{ < i > | ∃n, d, tc(<i, n, d, tc>∈student) ∧

  ∀ci, ti, dn, cr(<ci, ti, dn, cr>∈course ∧ dn=“Biology” ⇒

  ∃si, se, y, g(<I, ci, si, se, y, g>∈takes) ) }

 

表達式的安全性

不安全的域關系演算表達式的結果中會出現不在表達式域中的值。

如果下列條件同時成立,則認為表達式{ <x1, x2, …, xn> | P(x1, x2, …, xn) }是安全的:

1. 表達式的元組中所有值均來自dom(P);

2. 對每個形如∃x(P1(x))的子公式,子公式為真當且僅當dom(P1)中有某個值x使P1(x)為真;

3. 對每個形如∀x(P1(x))的子公式,子公式為真當且僅當P1(x)對dom(P1)中所有值x均為真。

 

語言表達能力

限制在安全表達式范圍內的域關系演算和限制在安全表達范圍內的元組關系演算具有相同的表達能力(因此也與基本關系代數的表達能力等價)。

注意:沒有任何一個域關系演算等價於聚集運算,但它可以擴展以支持聚集。

 

元組關系演算和域關系演算是非過程化語言,代表了關系查詢語言所需的基本能力。基本關系代數是一種過程化的語言,在能力上等價於被限制在安全表達式范圍內的關系演算的這兩種形式。

關系演算是簡介的、形式化的語言,不適合於那些偶爾使用數據庫系統的用戶。(QBE和Datalog基於元祖關系演算和域關系演算)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM