# DBMS Test 4 (4/1) <style> .markdown-body li + li { padding-top: 0 !important; } </style> --- [TOC] --- ## 11. 關聯式代數與計算 ### 關聯式代數的基礎 - E. F. Codd 提出兩種存取關聯式資料庫的基礎查詢語言 - 關聯式代數(Relational Algebra):低階運算子導向語言(Operator-oriented Language) - 使用關聯式運算子和關聯表建立的運算式進行資料操作或運算 - 關聯式計算(Relational Calculus):高階宣告式語言(Declarative Language) - 建立的運算式主要是在描述所需結果 - 關聯式代數運算子: - 傳統集合論的運算子: - $\cap$:交集(Intersection) - $\cup$:聯集(Union) - $-$:差集(Difference) - $\times$:卡笛生乘積(Cartesian Production) - 特殊關聯式運算子: - $\sigma$:選取(Selection)==*(WTF 投影片後半一直用 $\delta$)*== - $\pi$:投影(Projection) - $\bowtie$:合併(Join) - $\div$:除法(Division) - 資料庫系統的查詢處理模組(Query Processor): - (SQL 指令敘述)$\rightarrow$【查詢處理模組】$\rightarrow$(關聯式代數)$\rightarrow$【執行查詢】 ### 關聯式代數的基本運算 - 符號: - $R,\ S$:關聯表(Relation) - $P$:謂詞(Predicate) - $t$:元組(Tuple)、值組、記錄 - $a,\ b$:屬性(Attribute) - $\omega$:空值(Null) - **選取(Selection)**:在關聯表選取指定條件的值組,預設包含所有屬性 - 單運算元(Unary)運算子 - 即:限制(Restriction)運算子、選擇運算子 - $$\sigma_P(R) = \{\ t \mid t \in R \land P(t)\ \}$$ - **投影(Projection)**:只取出部分關聯表的屬性,且刪除重複值組 - 單運算元(Unary)運算子 - $$\pi_{a_1,...,a_n}(R) = \{\ t[a_1,...,a_n] \mid t \in R\ \}$$ - **聯集(Union)**:將兩個關聯表的所有值組合併成一個關聯表,且刪除重複值組 - 二運算元(Binary)運算子 - 兩個關聯表的必須要有相同關聯表綱要: - 擁有相同屬性個數,即相同維度 - 對應屬性必須擁有相同的定義域 - $$R \cup S = \{\ t \mid t \in R \lor t \in S\ \}$$ - **差集(Difference)**:值組只在第一個關聯表,而不在第二個關聯表 - 二運算元(Binary)運算子 - 兩個關聯表的必須要有相同關聯表綱要: - 擁有相同屬性個數,即相同維度 - 對應屬性必須擁有相同的定義域 - $$R - S = \{\ t \mid t \in R \land t \notin S\ \}$$ - **卡笛生乘積(Cartesian Product)**:第一個關聯表值組結合第二個關聯表的所有值組 - 二運算元(Binary)運算子 - 即:交叉運算(`CROSS JOIN`)、廣義笛卡爾乘積 - $$\begin{aligned} R \times S = \{\ & (a_1,...,a_n,b_1,...,b_m)\ \\ & \mid (a_1,...,a_n)\in R \land (b_1,...,b_m)\in S\ \} \end{aligned}$$ ### 關聯式代數的非基本運算 - **交集(Intersection)**:將兩個關聯表的相同值組取出成一個關聯表 - 二運算元(Binary)運算子 - 兩個關聯表的必須要有相同關聯表綱要: - 擁有相同屬性個數,即相同維度 - 對應屬性必須擁有相同的定義域 - $$\begin{aligned} R \cap S & = \{\ t \mid t \in R \land t \in S\ \} \\ & = R - (R - S) \end{aligned}$$ - **合併(Join)**:在兩個關聯表使用相同定義域的屬性為條件合併兩個關聯表 - 二運算元(Binary)運算子 - 相當先執行卡笛生乘積運算,再配合選擇運算取出所需值組的關聯表 - **$\theta$ 合併($\theta$ Join)**:使用比較運算子的謂詞 - 謂詞 $P := A\ \theta\ B$ 使用比較運算子 $\theta \in \{=,>,<,\ge,\le,\ne\}$ - $$R \bowtie_P S = \sigma_P(R \times S)$$ - **等位合併(Equijoin)**:使用相等運算子的謂詞 - 謂詞 $P := A = B$ - $$R \bowtie_{a=b} S = \sigma_{a=b}(R \times S)$$ - **自然合併(Natural Join)**:使用主鍵和外來鍵相等的謂詞,且刪除多餘鍵欄位 - 無謂詞表示預設使用主鍵和外來鍵對應的條件,即所有共通屬性值(All Common Attributes)都需要相等 - 共通屬性部分在運算結果中只會顯示一次 - (投影片後半使用自然合併時,常用 $∗$ 代替 $\bowtie$) - $$R \bowtie S = \pi_{a \cup b}(R \bowtie_{a=b} S)$$ - **外部合併(Outer Join)**:使用關聯表主鍵和其關聯性(Relationship)關聯表的外來鍵為條件執行合併 - 是一種完全的值組合併,運算元的關聯表需要貢獻全部值組 - **左外部合併(Left Outer Join)**:取回左邊所有值組 - $$R \sideset{_{left}}{}\bowtie S = (R \bowtie S) \cup ((R - \pi_{a_1,...,a_n}(R \bowtie S)) \times \{\omega_1,...,\omega_m\})$$ - *(https://latex.org/forum/viewtopic.php?t=455/#p43968)* - **右外部合併(Right Outer Join)**:取回右邊所有值組 - $$R \bowtie_{right} S = (R \bowtie S) \cup (\{\omega_1,...,\omega_n\} \times ((S - \pi_{b_1,...,b_m}(R \bowtie S)))$$ - **完全外部合併(Full Outer Join)**:取回兩邊的所有值組 - $$R \sideset{_{left}}{_{right}}\bowtie S = (R \sideset{_{left}}{}\bowtie S) \cup (R \bowtie_{right} S)$$ - **除法(Division)**:找出除關聯表在被除關聯表中的所有值組,且刪除多餘除關聯表欄位 - 二運算元(Binary)運算子 - $$A := \{a_1,...,a_n\} - \{b_1,...,b_m\} \\ R \div S = \pi_A(R) - \pi_A((\pi_A(R) \times S) - R)$$ ### 關聯式代數運算式範例 ==(全略)== ### 關聯式代數的資料庫更新運算 - 關聯式代數主要用途: - 資料庫值組的增刪改等等 - 在資料庫定義視界(Views)、資料安全(所需保護資料)和完整性限制條件的範圍 - **指定運算子(Assignment Operator)**:在更新運算式中更改資料庫內容 - 可以將關連式代數的運算結果指定成一個暫存關聯表代數 - $$R \leftarrow S$$ - 新增運算範例 - 新增一筆值組:$R \leftarrow R \cup \{\ t\ \}$ - 新增多筆值組:$R \leftarrow R \cup S$ - 刪除運算範例 - 刪除符合條件之值組:$R \leftarrow R - \sigma_P(R)$ - 更新運算範例 - 更新一筆值組:$R \leftarrow R - (\sigma_P(R)) \cup \{\ t\ \}$ ## 12. 關聯式代數範例 ==(全略,部分合併至上面)==