1. 程式人生 > >關系操作

關系操作

pac part 乘法 一個數 student 出現 wid 結果 加法

關系操作

源自:數據庫系統概論(第六版) 2.6關系操作

作者:Abraham Silberschatz Henry F.Korth S.Sudarshan

翻譯:劉瓊濱 謝雪妮 賴慧芳 許雅莉

譯文:

所有過程關系查詢語言都提供了一組操作,可以應用於單個關系或一對關系。這些操作具有所需的良好的屬性,它們的結果始終是單個關系。此屬性允許以模塊方式組合多個操作。具體來說,由於關系查詢的結果本身就是一個關系,因此關系操作可以應用於查詢以及給定關系集。

具體的關系操作以不同的語言表達,但是符合我們在本節中描述的一般框架。在第3章中,我們展示了用SQL表示的具體操作方式。

最常見的操作是選擇滿足某個特定謂詞的單個關系的特定元組(比如工資> $ 85,000)。結果是一個新的關系,它是原始關系的一個子集。(如圖2.10查詢的結果是選擇教練元組工資超過8500美元的關系)

技術分享

例如,如果我們從圖2.1的講師關系中選擇元組,滿足“工資大於$ 85000”,我們將得到如圖2.10所示的結果。

另一個常見的操作是從關系中選擇某些屬性(列)。結果是只有選定屬性的新關系。例如,假設我們想要一個教員ID和薪水列表,而不列出圖2.1的教員關系中的名稱和dept名稱值,那麽結果如圖2.11所示,有兩個屬性ID和salary。結果中的每個元組都來自於一個教師關系的元組,但只顯示所選的屬性。

連接操作允許通過合並雙元組結合兩個關系,分別來自每個關系,連接成一個元組。有許多不同的方式來連接關系(就像我們將在Chapter3中看到的那樣)。圖2 . 12顯示了從指導者和department表中加入元組的示例,其中顯示了每個教師和她工作的部門的信息。這一結果是由教師與系裏關系中的每個元組相結合而形成的。

在圖2.12中所示的連接形式(稱為“自然連接”)中,如果其dept名稱屬性的值相同,則來自教師關系的元組與department關系中的元組相匹配。所有這些匹配的元組都出現在連接結果中。一般來說,兩種關系的自然連接操作都匹配元組,它們的值對於兩種關系中的所有屬性名稱都是相同的。

技術分享圖2.11 從教師關系中查詢的屬性ID和工資的結果。

技術分享圖2.12 教師和部門關系的自然連接的結果

笛卡爾積結合了兩個關系中的元組,但不同於連接操作,笛卡爾積的結果包含了兩個關系中的所有元組,不管它們的屬性值是否匹配。

因為關系是集,我們可以在關系上執行正常的集操作。並操作執行了兩個“類似結構”表的集合(比如所有研究生的表和所有本科生的表)。例如,一個部門可以獲得所有學生的集合。其他的集合操作,例如intersection和set difference也可以執行。

如前所述,我們可以對查詢的結果執行操作。例如,如果我們想找到那些年薪超過8.5萬美元的教師的ID和薪水,我們將在上面的例子中執行前兩個操作。首先,我們從教師關系中選擇這些元組,其工資值大於85,000美元,然後從這個結果中選擇兩個屬性ID和工資,結果如圖2.13所示的關系

技術分享圖2.13選擇工資超過8.5萬美元的教師的屬性ID和工資

關系代數定義了一組對關系的操作,將通常的代數運算(如加法、減法或乘法)與數字運算。正如數字上的代數運算將一個或多個數字作為輸入,並作為輸出返回一個數字,關系代數運算通常以一或兩種關系作為輸入,並返回一個關系作為輸出。

關系代數在Chapter6中有詳細的介紹,但我們將概述了下面的一些操作。

符號(名稱)

使用例子

?(選擇)

? salary>=85000(instructor)

返回關系中滿足給定條件的諸元組

Π(投影)

Π ID,salary(instructor)

從輸入的關系中輸出指定屬性,移除重復的元組組成心的關系

技術分享(連接)

instructor技術分享department

在具有相同名稱的所有屬性上具有相同值的兩個輸入關系的輸出諸元組

X(笛卡爾積)

Instructor X department

輸出來自兩個關系的所有元組(不管它們是否具有相同的公共屬性值)

U(並)

Π name(instructor)u Π name(student)

從兩個輸入關系輸出元組的聯合。

在本例中,我們可以按任意順序執行操作,但正如我們將看到,不是在所有情況下都會這樣

有時,查詢的結果包含重復的元組。例如,如果我們從教師關系中選擇dept name屬性,就會出現一些重復的情況,如“Comp.Sci”出現了三次。某些關系語言嚴格遵循集合的數學定義,並會刪除重復。但考慮到從大型結果關系中刪除副本需要大量處理,保留副本。在後一種情況下,這種關系就不是純粹的數學意義上的關系。

當然,數據庫中的數據必須隨著時間的推移而改變。可以通過插入新元組、刪除現有元組或通過更改某些屬性的值修改元組來更新關系。整個關系可以被刪除,也可以創建新的關系。

我們將在第3至5章中使用SQL語言討論關系查詢和更新。

關系操作