關係代數是關係數據庫的基礎,但是很多書籍對關係代數的講解都偏向理論,本系列文章試圖通過將理論結合sql語句方式,讓讀者輕鬆理解關係代數的運算,並進而更好的理解關係數據庫。
本篇的內容主要包括以下三個方面:
- 關係代數的概念
- 關係代數的運算簡介
- 銀行數據庫系統的表(定義和數據)
關係代數是一種抽象的查詢語言,是關係數據操縱語言的一種傳統表達方式。它是用對系的運算來表達查詢的。
關係運算符有四類:集合運算符,專門的關係運算符,算術比較符和邏輯運算符,如下表所示:
含義 |
運算符 |
含義 |
|||
運算符 |
- |
並 差 交 |
比較 運算符 |
> ≥ < ≤ = ≠ |
大於 大於等於 小於 小於等於 等(不等)於 |
專門的關係運算符 |
×
÷ |
笛卡爾積 選擇 投影 連接 除 |
邏輯 運算符 |
┐ ∧ ∨ |
非 與 或 |
其中選擇、投影、笛卡爾積、集合的交、並和差運算可以簡單圖示如下:
根據運算符的不同,關係代數運算可分爲基本運算、附加的關係運算和擴展的關係運算。
爲了說明關係代數運算,我們除了給出形式化的定義以外,還會給出一個mysql的具體例子。
首先,我們定義一個銀行數據庫系統,具體包括如下一些表:
- mysql> show tables;
- +----------------+
- | Tables_in_test |
- +----------------+
- | account |
- | borrower |
- | branch |
- | customer |
- | depositor |
- | loan |
- +----------------+
這些表的定義如下:
- create table customer
- (customer_name char(20),
- customer_street char(30),
- customer_city char(30),
- primary key (customer_name))
- create table branch
- (branch_name char(15),
- branch_city char(30),
- assets numeric(16,2),
- primary key (branch_name))
- create table account
- (account_number char(10),
- branch_name char(15),
- balance numeric(12,2),
- primary key (account_number),
- foreign key (branch_name) references branch (branch_name) )
- create table depositor
- (customer_name char(20),
- account_number char(10),
- primary key (customer_name, account_number),
- foreign key (account_number) references account (account_number),
- foreign key (customer_name) references customer (customer_name))
- create table loan
- (loan_number char(10),
- branch_name char(15),
- amount numeric(12,2),
- primary key (loan_number),
- foreign key (branch_name) references branch (branch_name))
- create table borrower
- (customer_name char(20),
- loan_number char(10),
- primary key (customer_name, loan_number),
- foreign key (customer_name) references customer (customer_name),
- foreign key (loan_number) references loan (loan_number))
下面給出每個表的一些數據例子,從表和列的名稱以及數據中我們可以知道其含義,因此這裏不再具體說明。
- mysql> select * from account;
- +----------------+-------------+---------+
- | account_number | branch_name | balance |
- +----------------+-------------+---------+
- | A-101 | Downtown | 500 |
- | A-102 | Perryridge | 400 |
- | A-201 | Brighton | 900 |
- | A-215 | Mianus | 700 |
- | A-217 | Brighton | 750 |
- | A-222 | Redwood | 700 |
- | A-305 | Round Hill | 350 |
- +----------------+-------------+---------+
- 7 rows in set (0.00 sec)
- mysql> select * from borrower;
- +---------------+-------------+
- | customer_name | loan_number |
- +---------------+-------------+
- | Admas | L-16 |
- | Curry | L-93 |
- | Hayes | L-15 |
- | Jackson | L-14 |
- | Jones | L-17 |
- | Smith | L-11 |
- | Smith | L-23 |
- | Williams | L-17 |
- +---------------+-------------+
- 8 rows in set (0.00 sec)
- mysql> select * from branch;
- +-------------+-------------+---------+
- | branch_name | branch_city | assets |
- +-------------+-------------+---------+
- | Brighton | Brooklyn | 7100000 |
- | Downtown | Brooklyn | 9000000 |
- | Mianus | Horseneck | 400000 |
- | North Town | Rye | 3700000 |
- | Perryridge | Horseneck | 1700000 |
- | Pownal | Bennington | 300000 |
- | Redwood | Palo Alto | 2100000 |
- | Round Hill | Horseneck | 8000000 |
- +-------------+-------------+---------+
- 8 rows in set (0.00 sec)
- mysql> select * from customer;
- +---------------+-----------------+---------------+
- | customer_name | customer_street | customer_city |
- +---------------+-----------------+---------------+
- | Adams | Spring | Pittsfield |
- | Brooks | Senator | Brooklyn |
- | Curry | North | Rye |
- | Green | Walnut | Stamford |
- | Hayes | Main | Harrison |
- | Johnson | Alma | Palo Alto |
- | Jones | Main | Harrison |
- | Lindsay | Park | Pittsfield |
- | Smith | North | Rye |
- | Turner | Putnam | Stamford |
- | Williams | Nassau | Princeton |
- +---------------+-----------------+---------------+
- 11 rows in set (0.00 sec)
- mysql> select * from depositor;
- +---------------+----------------+
- | customer_name | account_number |
- +---------------+----------------+
- | Hayes | A-102 |
- | Johnson | A-101 |
- | Johnson | A-201 |
- | Jones | A-217 |
- | Lindsay | A-222 |
- | Smith | A-215 |
- | Turner | A-305 |
- +---------------+----------------+
- 7 rows in set (0.00 sec)
- mysql> select * from loan;
- +-------------+-------------+--------+
- | loan_number | branch_name | amount |
- +-------------+-------------+--------+
- | L-11 | Round Hill | 900 |
- | L-14 | Downtown | 1500 |
- | L-15 | Perryridge | 1500 |
- | L-16 | Perryridge | 1300 |
- | L-17 | Downtown | 1000 |
- | L-23 | Redwood | 2000 |
- | L-93 | Mianus | 500 |
- +-------------+-------------+--------+
- 7 rows in set (0.00 sec)
本篇已經較長,下一篇結合銀行數據庫的例子,給出關係代數的每種運算的形式化定義及其在mysql中的實現。