概述
關係代數不是一種成熟的 SQL 語言,而是一種獲得理論上對關係處理理解的方法。因此,它不應該引用表,記錄和欄位等物理實體; 它應該引用抽象結構,如關係,元組和屬性。說這些,我不會使用本文件中的學術術語,並將堅持更廣為人知的外行術語 - 表格,記錄和欄位。
我們開始之前的幾個關係代數規則:
- 關係代數中使用的運算子在整個表而不是單個記錄上工作。
- 關係表示式的結果將始終是一個表(這稱為閉包屬性 )
在本文件中,我將參考以下兩個表:
選擇
在選擇運算子返回主表的子集。
選擇 <table> where <condition>
例如,檢查表示式:
選擇人**,其中** DepartmentID 的= 2
這可以寫成:
這將導致表的記錄包含 People 表中 DepartmentID 值等於 2 的所有記錄 :
條件也可以加入以進一步限制表示式:
選擇人**,其中** StartYear> 2005 年和 DepartmentID 的= 2
將產生下表:
專案
該專案的運算子將會從表中返回不同的欄位值。
專案 <table> over <field list>
例如,檢查以下表示式:
project People over StartYear
這可以寫成:
這將導致一個表包含 People 表的 StartYear 欄位中儲存的不同值。 **
由於 closure 屬性建立了一個關係表,因此從結果表中刪除了重複值 :關係表中的所有記錄都必須是不同的。
如果欄位列表包含多個單個欄位,則結果表是這些欄位的不同版本。
專案人員超過 StartYear,DepartmentID 將返回: 由於 2006 StartYear 和 1 DepartmentID 的重複,刪除了一條記錄。
GIVING
可以通過使用 giving 關鍵字命名單個表示式,或通過將一個表示式嵌入另一個表示式中來將關係表示式連結在一起。
<關係代數表示式> 給出 <別名>
例如,考慮下面的表示式:
選擇人**,其中** DepartmentID 的= 2 給出一個
專案一個在 PERSONNAME 給B
這將導致下面的表 B,表 A 是第一個表示式的結果。
計算第一個表示式,併為結果表提供別名 A.然後在第二個表示式中使用該表,為最終表提供別名 B.
編寫此表示式的另一種方法是將第二個表示式中的表別名替換為括號內的第一個表示式的整個文字:
project ( 選擇 People ,其中 DepartmentID = 2)而不是 PersonName 給出 B
這稱為巢狀表示式。
天然加入
自然連線使用表之間共享的公共欄位將兩個表粘在一起。
假設<field 1>在<table 1>中並且<field 2>在<table 2>中,加入 <table 1> 和 <table 2> ,其中 <field 1> = <field 2>。
例如,下面的聯接表示式將加入人們和部門基於所述 DepartmentID 的和 ID 列中的各表中:
加入人及部門其中 DepartmentID 的 ID =
請注意,只有 DepartmentID 的從人表示,而不是 ID 從部門表。只需要顯示一個要比較的欄位,這通常是連線操作中第一個表的欄位名稱。
儘管在該示例中未示出,但是連線表可能導致兩個欄位具有相同的標題。例如,如果我使用標題 Name 來標識 PersonName 和 Dept 欄位(即標識 Person Name 和 Department Name)。出現這種情況時,我們使用表名來使用點表示法限定欄位名稱: People.Name 和 Departments.Name
加入結合 select 和 project 可以一起使用來拉取資訊:
加入 DepartmentID = ID 的人員和部門*,給** A
選擇 A ,其中 StartYear = 2005 , Dept =‘Production’ 給 B
專案 B over PersonName 給 C*
或作為組合表示式:
專案 ( 選擇 ( 參加人及部門*,其中** DepartmentID 的= ID) ,其中 StartYear = 2005 和部門=生產) 在 PERSONNAME 給 Ç*
這將導致此表: