7-1 關聯式代數 7-2 關聯式代數的特性    
7-3 資料庫管理系統的演進 7-4 利用 SQL*Plus 產生報表   
   
 

 

  關聯式資料模式上的資料操作部份有:關聯式代數(Relational Algebra)與關聯式計算(Relational Calculus)兩種。由於關聯式代數
比較接近 SQL 語意,所以這裡我們只介紹關聯式代數。關聯表的運算,E.F.Codd 將其定義為以下幾種:

(1) 聯集運算(Union):以“∪”代表,如 R1“∪”R2。

(2) 交集運算(Intersection):以“∩”代表,如 R1“∩”R2

(3) 差集運算(Difference):以“ - ”代表,如 R1 - R2

(4) 乘積運算(Cartesian Product):以“x”代表,如 R1 x R2

(5) 選擇運算( Select):以“σ”代表,如 σ條件 (R)

(6) 投影運算(Project):以“π”代表,如 “π”屬性列(R)

(7) 關聯運算(Join):以“”代表,如 R1關聯條件R2

(8) 除法運算(Divide):以“÷”代表,如 R1÷R2

  以上的運算除了投影運算、選擇運算外,其餘的運算為二元運算子。它們具有以下的性質:

  • 封閉性(Closure):關聯表經過了上面的運算後,其輸出結果仍是一
             個關聯表。
  • 巢狀式 (Nested) 運算:也就是關聯表可以在經過一連串以上的運算           組合,其結果仍是關聯表。

 

  而聯集運算、交集運算與差集運算運算中,參與運算的關聯表 R1(a11, a12, a13, …., a1n)與 R2(a21, a22, a23, …., a2m),都必須滿足下面的「聯集相容」(Union-compatible)條件,或稱為「型態相容」(Type-compatible)條件。此條件要求:

  • 兩個關聯表R1 與 R2 的屬性集必須具有相同的維度(Degree),也就是屬性數目必須相同(n=m)。
  • 兩個關聯表R1 與 R2 的相對屬性都必須定義於相同的值域 (Domain) 上。

  此外我們可以依運算性質的不同,分為「原始運算子」與「非原始運算子」兩種:

  • 原始運算子(Primitive Operators):其運算無法由其他運算子取代,例如:聯集運算、差集運算、乘積運算、選擇運算、投影運算、選擇運算。
  • 非原始運算子(Non-primitive Operators):其運算可由其他運算子取代,例如:交集運算、關聯運算、除法運算。

7-1-1聯集運算(Union)

  此運算將兩個關聯表 R1 與 R2 聯集成一個新的關聯表,新的關聯表 R3 中的記錄為原來兩關聯表記錄的聯集。例如:

7-1-2交集運算(Intersection)

  此運算將兩個關聯表 R1 與 R2 交集成一個新的關聯表,新的關聯表 R3 中的記錄為原來兩關聯表記錄的交集。

7-1-3差集運算(Difference)

  此運算將一個關聯表 R1 中的記錄減去另一個關聯表 R2 的記錄,形成新的關聯表 R3 的記錄。事實上差集的運算相當於將關聯表 R1 中之記錄減去 R1 與 R2 共有的記錄,也就是 R1-R2=R1-(R1CR2)。

7-1-4乘積運算(Cartesian Product)

   此運算是將兩關聯表 R1 與 R2 的記錄利用集合運算中的乘積運算形成新的關聯表 R3,假如 R1 有 r1 個屬性,m 筆記錄,R2 有 r2 個屬性,n 筆記錄,則 R3 會有 (r1+r2) 個屬性,(mxn) 筆記錄。

7-1-5選擇運算(Select)

  此運算是由關聯表 R 中選取符合條件的記錄。假設 P 為選取的條件則以sp(R) 代表此運算。其結果為原關聯表 R 記錄的子集合。
  例如:σsa1>1600(Emp) 為從關聯表 Emp 中選取符合屬性 Sal 大於 1600 的記錄,如下圖陰影部分所示:

7-1-6投影運算(Project)

  此運算是由關聯表中選出所需的關聯表屬性。假設關聯表 R 中欲選出的屬性列表為 A1, A2, A3, ... An,則以p表示此投影運算。
  

  值得注意的一點:因為關聯表經過投影後仍為關聯表,所以必須遵守關聯表的特性;如果投影的結果並沒有包含原關聯表的主鍵或候選鍵時,則重覆的記錄將會被刪除,並由所有屬性構成新關聯表的主鍵。

7-1-7關聯運算(Join)

  此運算將兩個關聯表 R1 與 R2 依關聯條件合併成一個新關聯表 R3,假設 P 為關聯條件,以 R1?PR2 表示此關聯運算。而關聯的條件 P 的型式為:A1 q A2 ,其中 A1為 R1 的屬性,A2 為 R2 的屬性,q為比較運算子,例如:<、>、=、≦、≧、≠等等。關聯運算會因為q不同而產生不同的結果。
  一般我們稱此為「θ-關聯」(θ-join)。以下面兩個關聯表 Emp 與 Dept 為例:


   由於「等於關聯」通常會造成新的關聯表中有兩個一模一樣的欄位資料。但是在實務應用上是多餘的,因此可以將其中的一個欄位刪除,而此種關聯運算稱為「自然關聯」 (Natural Join)。

  事實上關聯運算 join 可以看成先把 R1 與 R2 做乘積運算(Cartesian Product) 後,再依關聯條件做選擇運算(Select) 來篩選出合乎關聯條件的記錄。所以,如果 R1 與 R2 依關聯條件 P 做關聯運算,則有以下的等式:

          R1
?pR2=σp(R1×R2)

  關聯運算除了前面介紹的「等於關聯」 (Equijoin) 與「自然關聯」(Nature Join) 都屬於「θ-關聯」外,還有「外部關聯」(Outer Join)。

  而「外部關聯」(Outer Join) 分為 「左外部關聯」(Left Outer Join)、「右外部關聯」(Right Outer Join) 與[ 全外部關聯] (Full Outer Join) 三種。因為自然關聯必須在左右關聯表中找到相互對應的值組才行,而外部關聯 (Outer Join) 則無此限制。假設關聯表R1 與 R2 如下:

1. 左外部關聯(Left Outer Join) 這個關聯運算會把「左方關聯表」的所 有資料值輸出,如果左關聯表 R1 中找不到可匹配的 R2 值組時,則會以 虛值(Null) 代替 R2 的值組再與 R1 的值關聯運算。

2. 右外部關聯(Right Outer Join) 這個關聯運算會把「右方關聯表」的所 有資料值輸出,如果右關聯表 R2 中找不到可匹配的 R1 值組時,則會以 虛值(Null) 代替 R1 的值組再與 R2 的值做關聯(Join) 運算。

3. 全外部關聯(Full Outer Join) 這個關聯運算會把「左方關聯表」與「右 方關聯表」的所有資料值輸出,如果左關聯表 R1 或右關聯表 R2 找不到 可匹配的值組做關聯運算時,則會以虛值(Null) 代替。

7-1-8 除法運算(Divide)

  此種運算如同數學上的除法一般,有二個運算元:第一個關聯表 R1 當作「被除表格」,第二個關聯表 R2 當作「除表格」。其中「被除表格」的屬性必須比「除表格」多,而且「除表格」中的任何屬性的值域都要與「被除表格」中的某屬性之值域相符合。

  R1 除以 R2 的表示法與結果如下:

     R1(X, Y)÷R2(Y)={t|{t}×R2(Y) R1(X, Y)}

  其中 t 是由 X1, X2......Xm 等屬性所組成。

  其意義為將 R1 中 X 的複合屬性值個別地與 R2 中 Y 的複合屬性值作乘積運算後,如果結果會包含於 R1 中時,這些 R1 的 X 複合屬性值集合便是除法運算的結果。 為了說明的方便,假設 X 為複合屬性是由 X1, X2, X3......Xm 等屬性所組成;Y 為複合屬性是由 Y1, Y2, Y3......Yn 等屬性所組成。