生活随笔
收集整理的這篇文章主要介紹了
关系代数——附加的关系运算(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關系代數的基本運算足以表達任何關系代數查詢。但是如果只用這些運算,有時候某些查詢的表達會顯得無比冗長。為了簡化查詢,我們定義附加的一些運算,它們不能增加關系代數的表達能力,卻可以簡化一些常用的查詢。
這些附加的關系代數運算包括集合交、自然連接和除運算。
集合交(∩)
假設我們希望找出所有既有賬戶又有貨款的客戶,我們可以使用集合交表示如下:
πcustomer_name(borrower) ∩ πcustomer_name(depositor)
集合交可以通過集合差來替代:
r∩s = r – (r – s)
其相應的查詢語句和查詢結果為:
mysql>?select?distinct?customer_name?from?borrower?????->?where?customer_name?not?in?????->??(select?distinct?customer_name?from?borrower?????->???where?customer_name??not?in?????->????(select?customer_name?from?depositor)?????->???);?+---------------+?|?customer_name?|?+---------------+?|?Hayes?????????|?|?Jones?????????|?|?Smith?????????|?+---------------+?3?rows?in?set?(0.00?sec)??
自然連接(?)
?
更形式的說,自然連接的語義定義為:
R?S?= {?t??s?:?t??R,?s??S, fun (t??s) }
這里的 fun(r) 是對于二元關系?r?為真的謂詞,當且僅當當?r?是函數二元關系。通常要求?R?和?S?必須至少有一個公共屬性,但是如果省略了這個約束則在那種特殊情況下自然連接就完全變成上面定義的笛卡爾積。
自然連接運算首先形成它的兩個參數的笛卡爾積,然后基于兩個關系模式中都出現的屬性上的相等性進行選擇,最后還要去除重復性。?
例1:找出所有在銀行中有貸款的客戶姓名及相應帶括號和貸款金額 用自然連接表述如下:?
πcustomer_name, loan_number, amount (borrower ?loan)
由于borrwoer和loan的模式中具有相同屬性loan_number, 自然連接運算只考慮在loan_number上值相同的元組對。它將每個這樣的元組對合并為單一的元組,其模式為兩個模式的并(即customer_name, branch_name, loan_number和amount)。針對這個例子,最后還要執行投影。
其相應的查詢語句和查詢結果為: mysql>?select?customer_name,?borrower.loan_number,?amount?????->?from?borrower?left?join?loan?????->?using(loan_number);?+---------------+-------------+--------+?|?customer_name?|?loan_number?|?amount?|?+---------------+-------------+--------+?|?Admas?????????|?L-16????????|???1300?|?|?Curry?????????|?L-93????????|????500?|?|?Hayes?????????|?L-15????????|???1500?|?|?Jackson???????|?L-14????????|???1500?|?|?Jones?????????|?L-17????????|???1000?|?|?Smith?????????|?L-11????????|????900?|?|?Smith?????????|?L-23????????|???2000?|?|?Williams??????|?L-17????????|???1000?|?+---------------+-------------+--------+?8?rows?in?set?(0.00?sec)? 例2:找出有居住在Harrison并在銀行中有賬戶的客戶的所有支行的名稱
用自然連接表述如下:πbranch_name
σcustomer_city= "Harrison" (customer account depositor)
其相應的查詢語句和查詢結果為:
mysql> select distinct branch_name -> from customer inner join account inner join depositor -> using(customer_name, account_number) -> where customer_city="Harrison"; +-------------+ | branch_name | +-------------+ | Brighton | | Perryridge | +-------------+ 2 rows in set (0.00 sec) 例3:找出所有在銀行中既有貸款又有賬戶的客戶
用自然連接表述如下: πcustomer_name (borrower??depositor)
其相應的查詢語句和查詢結果為:
mysql> select distinct borrower.customer_name -> from borrower inner join depositor -> using(customer_name); +---------------+ | customer_name | +---------------+ | Hayes | | Jones | | Smith | +---------------+ 3 rows in set (0.00 sec) 如果我們要組合來自兩個關系的元組,而組合條件不是簡單的共享屬性上的相等,則有一種更一般形式的連接算子才方便,這就是 θ-連接(或 theta-連接)。θ-連接是寫為??或??的二元算子,這里的?a?和?b?是屬性名字,θ 是在集合 {<, ≤, =, >, ≥} 中的二元關系,v?是值常量,而?R?和?S?是關系。這個運算的結果由在?R和?S?中滿足關系 θ 的元素的所有組合構成。只有?S?和?R?的表頭是不相交的,即不包含公共屬性的情況下,θ-連接的結果才是有定義的。 ?
這個運算可以用基本運算模擬如下:
R?
φ?S?= σ
φ(R?×?S)在算子 θ 是等號算子 (=) 的時候這個連接也相等連接。
但是要注意,支持自然連接和重命名的計算機語言可以不需要 θ-連接,因為它可以通過對自然連接(在沒有公共屬性的時候的它退化為笛卡爾積)的選擇來完成。
?
轉載于:https://blog.51cto.com/leander/1094054
總結
以上是生活随笔為你收集整理的关系代数——附加的关系运算(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。