关系代数是关系数据库的基础,但是很多书籍对关系代数的讲解都偏向理论,本系列文章试图通过将理论结合sql语句方式,让读者轻松理解关系代数的运算,并进而更好的理解关系数据库。

本篇的内容主要包括以下三个方面:

  1. 关系代数的概念
  2. 关系代数的运算简介
  3. 银行数据库系统的表(定义和数据)

关系代数是一种抽象的查询语言,是关系数据操纵语言的一种传统表达方式。它是用对系的运算来表达查询的。

关系运算符有四类:集合运算符,专门的关系运算符,算术比较符和逻辑运算符,如下表所示:

运算符

含义

运算符

含义

集合

运算符

-

 

 

比较

运算符

>

 

= 

大于

大于等于

小于

小于等于

等(不等)于

专门的关系运算符

×

 

 

÷

笛卡尔积

选择

投影

连接

逻辑

运算符

 

其中选择、投影、笛卡尔积、集合的交、并和差运算可以简单图示如下:
关系代数运算图示

 

根据运算符的不同,关系代数运算可分为基本运算、附加的关系运算和扩展的关系运算。

为了说明关系代数运算,我们除了给出形式化的定义以外,还会给出一个mysql的具体例子。

首先,我们定义一个银行数据库系统,具体包括如下一些表:  

 
  
  1. mysql> show tables; 
  2. +----------------+ 
  3. | Tables_in_test | 
  4. +----------------+ 
  5. | account        | 
  6. | borrower       | 
  7. | branch         | 
  8. | customer       | 
  9. | depositor      | 
  10. | loan           | 
  11. +----------------+ 

这些表的定义如下:

 
  
  1. create table customer  
  2.     (customer_name char(20),  
  3.      customer_street char(30),  
  4.      customer_city char(30),  
  5.      primary key (customer_name))  
  6. create table branch  
  7.     (branch_name char(15),  
  8.      branch_city char(30),  
  9.      assets numeric(16,2),  
  10.      primary key (branch_name))   
  11. create table account  
  12.     (account_number char(10),  
  13.      branch_name char(15),  
  14.      balance numeric(12,2),  
  15.      primary key (account_number),  
  16.      foreign key (branch_name) references branch (branch_name) )      
  17. create table depositor  
  18.     (customer_name char(20),  
  19.      account_number char(10),  
  20.      primary key (customer_name, account_number),  
  21.      foreign key (account_number) references account (account_number),      
  22.      foreign key (customer_name) references customer (customer_name))   
  23. create table loan  
  24.     (loan_number char(10),  
  25.      branch_name char(15),  
  26.      amount numeric(12,2),  
  27.      primary key (loan_number),  
  28.      foreign key (branch_name) references branch (branch_name))  
  29. create table borrower  
  30.     (customer_name char(20),  
  31.      loan_number char(10),  
  32.      primary key (customer_name, loan_number),  
  33.      foreign key (customer_name) references customer (customer_name),  
  34.      foreign key (loan_number) references loan (loan_number))  

下面给出每个表的一些数据例子,从表和列的名称以及数据中我们可以知道其含义,因此这里不再具体说明。

 

 
  
  1. mysql> select * from account; 
  2. +----------------+-------------+---------+ 
  3. | account_number | branch_name | balance | 
  4. +----------------+-------------+---------+ 
  5. | A-101          | Downtown    |     500 | 
  6. | A-102          | Perryridge  |     400 | 
  7. | A-201          | Brighton    |     900 | 
  8. | A-215          | Mianus      |     700 | 
  9. | A-217          | Brighton    |     750 | 
  10. | A-222          | Redwood     |     700 | 
  11. | A-305          | Round Hill  |     350 | 
  12. +----------------+-------------+---------+ 
  13. 7 rows in set (0.00 sec) 
  14.  
  15. mysql> select * from borrower; 
  16. +---------------+-------------+ 
  17. | customer_name | loan_number | 
  18. +---------------+-------------+ 
  19. | Admas         | L-16        | 
  20. | Curry         | L-93        | 
  21. | Hayes         | L-15        | 
  22. | Jackson       | L-14        | 
  23. | Jones         | L-17        | 
  24. | Smith         | L-11        | 
  25. | Smith         | L-23        | 
  26. | Williams      | L-17        | 
  27. +---------------+-------------+ 
  28. 8 rows in set (0.00 sec) 
  29.  
  30. mysql> select * from branch; 
  31. +-------------+-------------+---------+ 
  32. | branch_name | branch_city | assets  | 
  33. +-------------+-------------+---------+ 
  34. | Brighton    | Brooklyn    | 7100000 | 
  35. | Downtown    | Brooklyn    | 9000000 | 
  36. | Mianus      | Horseneck   |  400000 | 
  37. | North Town  | Rye         | 3700000 | 
  38. | Perryridge  | Horseneck   | 1700000 | 
  39. | Pownal      | Bennington  |  300000 | 
  40. | Redwood     | Palo Alto   | 2100000 | 
  41. | Round Hill  | Horseneck   | 8000000 | 
  42. +-------------+-------------+---------+ 
  43. 8 rows in set (0.00 sec) 
  44.  
  45. mysql> select * from customer; 
  46. +---------------+-----------------+---------------+ 
  47. | customer_name | customer_street | customer_city | 
  48. +---------------+-----------------+---------------+ 
  49. | Adams         | Spring          | Pittsfield    | 
  50. | Brooks        | Senator         | Brooklyn      | 
  51. | Curry         | North           | Rye           | 
  52. | Green         | Walnut          | Stamford      | 
  53. | Hayes         | Main            | Harrison      | 
  54. | Johnson       | Alma            | Palo Alto     | 
  55. | Jones         | Main            | Harrison      | 
  56. | Lindsay       | Park            | Pittsfield    | 
  57. | Smith         | North           | Rye           | 
  58. | Turner        | Putnam          | Stamford      | 
  59. | Williams      | Nassau          | Princeton     | 
  60. +---------------+-----------------+---------------+ 
  61. 11 rows in set (0.00 sec) 
  62.  
  63. mysql> select * from depositor; 
  64. +---------------+----------------+ 
  65. | customer_name | account_number | 
  66. +---------------+----------------+ 
  67. | Hayes         | A-102          | 
  68. | Johnson       | A-101          | 
  69. | Johnson       | A-201          | 
  70. | Jones         | A-217          | 
  71. | Lindsay       | A-222          | 
  72. | Smith         | A-215          | 
  73. | Turner        | A-305          | 
  74. +---------------+----------------+ 
  75. 7 rows in set (0.00 sec) 
  76.  
  77. mysql> select * from loan; 
  78. +-------------+-------------+--------+ 
  79. | loan_number | branch_name | amount | 
  80. +-------------+-------------+--------+ 
  81. | L-11        | Round Hill  |    900 | 
  82. | L-14        | Downtown    |   1500 | 
  83. | L-15        | Perryridge  |   1500 | 
  84. | L-16        | Perryridge  |   1300 | 
  85. | L-17        | Downtown    |   1000 | 
  86. | L-23        | Redwood     |   2000 | 
  87. | L-93        | Mianus      |    500 | 
  88. +-------------+-------------+--------+ 
  89. 7 rows in set (0.00 sec) 

本篇已经较长,下一篇结合银行数据库的例子,给出关系代数的每种运算的形式化定义及其在mysql中的实现。