關係代數——基本運算(1)

關係代數的基本運算主要包括選擇、投影、並、集合差、笛卡爾積和更名運算。

選擇、投影和更名運算是一元運算。另外三個是二元運算。 

選擇 (σ)

廣義選擇是寫爲 \sigma_\varphi(R) 的一元運算,這裏的 \varphi 是由正常選擇中所允許的原子和邏輯算子 \and(與)、\or(或) 和 \lnot(非)構成的命題公式。這種選擇選出 R 中使 \varphi 成立的所有元組。 

爲了選擇loan關係中支行名稱爲"Perryridge"的那些元組,我們寫作 

σbranch_name="Perryridge"(loan)

其相應的查詢語句爲:

  1. mysql> select * from loan where branch_name="Perryridge"
  2. +-------------+-------------+--------+ 
  3. | loan_number | branch_name | amount | 
  4. +-------------+-------------+--------+ 
  5. | L-15        | Perryridge  |   1500 | 
  6. | L-16        | Perryridge  |   1300 | 
  7. +-------------+-------------+--------+ 
  8. 2 rows in set (0.01 sec)  

投影 (π)

投影是寫爲 \pi_{a_1, ...,a_n}( R ) 的一元運算,這裏的a_1,...,a_n 是屬性名字的集合。這種投影的結果定義爲當所有在 R 中的元組被限制爲集合 \{a_1,...,a_n\} 的時候所獲得的集合。

假設我們想要列出所有貸款的號碼和金額,而不關心支行名稱。我們可以用下面的運算

πloan_name,amount(loan)

其相應的查詢語句爲:

 

  1. mysql> select loan_number,amount from loan; 
  2. +-------------+--------+ 
  3. | loan_number | amount | 
  4. +-------------+--------+ 
  5. | L-11        |    900 | 
  6. | L-14        |   1500 | 
  7. | L-15        |   1500 | 
  8. | L-16        |   1300 | 
  9. | L-17        |   1000 | 
  10. | L-23        |   2000 | 
  11. | L-93        |    500 | 
  12. +-------------+--------+ 
  13. 7 rows in set (0.00 sec) 

並運算(∪)

 

並運算跟集合中並運算相仿:AB 定義爲 {e|eA eB}

假設有一個查詢要找出所有的有貸款或有賬戶或二者兼具的銀行賬戶。

請注意customer關係中並不能包含該信息,因爲客戶在該銀行可以既無賬戶又無貸款。

爲了回答這一查詢,我們需要depositor關係和borrower關係中的信息。

我們知道如何找出所有在此銀行有貸款的客戶:

πcustomer_name(borrower)

我們還知道如何找出所有在此銀行有賬戶的客戶:

πcustomer_name(depositor)

爲了回答這個查詢,我們需要將這兩個集合並(union)起來;即我們需要所有出現在這兩個集合之一的或同事出現在這兩個集合中的客戶姓名。

其表達式爲:

πcustomer_name(borrower) πcustomer_name(depositor)

其相應的查詢語句爲:

  1. mysql> select customer_name from borrower union select customer_name from depositor; 
  2. +---------------+ 
  3. | customer_name | 
  4. +---------------+ 
  5. | Admas         | 
  6. | Curry         | 
  7. | Hayes         | 
  8. | Jackson       | 
  9. | Jones         | 
  10. | Smith         | 
  11. | Williams      | 
  12. | Johnson       | 
  13. | Lindsay       | 
  14. | Turner        | 
  15. +---------------+ 
  16. 10 rows in set (0.00 sec) 

集合差

集合差運算使得我們可以找出在一個關係中而不在另一個關係中的那些元組。

我們可以通過如下表達式來找出所有有賬戶而無貸款的客戶:

πcustomer_name(depositor)customer_name(borrower)

其相應的查詢語句爲: 

  1. mysql> select distinct customer_name 
  2.     -> from depositor 
  3.     -> where customer_name not in 
  4.     -> (select customer_name from borrower); 
  5. +---------------+ 
  6. | customer_name | 
  7. +---------------+ 
  8. | Johnson       | 
  9. | Lindsay       | 
  10. | Turner        | 
  11. +---------------+ 
  12. 3 rows in set (0.00 sec) 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章