关系代数——基本运算(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) 

 

 

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