概敘
關系數據庫的基本特征是使用關系模型的組織數據,20世紀80年代以后,在商用DBMS中,關系模型逐步取代早期的網狀模型和層次模型。
關系數據模型
作為數據模型,關系模型包含三個組成要素:關系數據結構、關系操作集合和關系完整性約束。
關系數據結構
結構只包含單一的數據結構(關系),現實世界的實體與實體間的各種聯系均用關系來表示。關系模型是吧數據庫表示為關系的集合,並以二維表格的形式組織數據。
錄入一張二維表格如:
學號 | 姓名 | 性別 | 籍貫 | 民族 | ... |
---|---|---|---|---|---|
001 | 張三 | 男 | 陝西 | 漢 | ... |
002 | 李四 | 男 | 湘西 | 苗 | ... |
003 | 王五 | 男 | 河北 | 漢 | ... |
004 | 趙六 | 男 | 東北 | 漢 | ... |
... | ... | ... | ... | ... | ... |
基本術語
表(Table)
:也稱為關系,是二維數據結構,由表名、構成表的各列及若干行數據組成,每個表由唯一的表名,每一行數據描述一條具體的記錄值。關系(Relation)
:一個關系邏輯上對應一張二維表,可以為每個關系取一個名稱來標識。關系有三種類型:基本關系(基表,實際存在的表,是實際存儲數據的邏輯表示)、查詢表(查詢結構對應的表)和視圖表(由基本表或其他視圖導出的表,不對應實際存儲的數據)。列(Column)
:稱為字段(Field)或屬性(Attribute)。每一列有一個名稱,表示實體屬性,具有相同數據類型。在一個數據庫中,表名,字段名必須唯一,不同的表可以有相同的字段名,且命名須有意義,簡單。屬性(Attribute)
:表列即屬性,給屬性起名即屬性名。屬性的個數稱為關系的元或度。列值為屬性值;取值范圍為值域。行(Row)
:稱為元組(Tuple)或記錄(Record)。表中的數據按行存儲,一行數據即一條記錄或元組,每行又若干個字段值組成。分量(Component)
:元組的屬性值為分量碼/鍵(key)
:在一個關系中,有一個屬性或屬性組,能用來標識該關系的元組,則為該關系的碼或鍵。超碼或超鍵(Super Key)
:從碼中去除某個屬性,它仍然是對應關系的碼,則為超碼;每個關系至少有一個默認的超碼(所有屬性的集合)。候選碼或鍵(Candidate Key)
:關系中的一個碼或鍵中,不能去除任何一個屬性,否則它就不是對應關系表的碼或鍵,則此碼為候選碼(鍵),它是關系表中最小的超碼或超鍵。主鍵/碼(Primary Key)
:在一張關系表中的若干候選鍵中指定一個用來唯一標識該關系的元組,則該候選鍵為主鍵。全鍵/碼(All-Key)
:一個關系中所有的屬性集合是是這個關系是主鍵/碼,則為全鍵/碼。主/非屬性(Primary Attribute/Nonprimary Attribute)
:關系中包含任何一個候選鍵/碼的屬性為主/碼屬性,不包含任何一個候選碼的屬性為非主/碼屬性。外鍵/碼(Foreign Key)
:關系中的某個屬性或屬性組不是這個關系的主鍵或候選鍵,而是另一個關系的主鍵,則該屬性(屬性組)為關系的外鍵/碼。參照關系(Referencing Relation)/被參照關系(Referenced Relation)
:參照關系也稱從關系,被參照關系又稱主關系,它們指以外碼相關聯的兩個關系。而以外碼為主碼的關系為被參照關系;外碼所在的關系為參照關系,這種聯系通常是一對多關聯。域(Domain)
:指屬性取值范圍。數據類型(Data Type)
:每列(元關系)都有相應的數據類型,用於限制該列中存儲的數據。關系模式(Relation Schema)
:通數據模型一樣,數據庫也有型和值,在關系數據庫中關系模式是型,關系是值,關系模式是對關系的描述。
中文字段名 | 數據類型 | 寬度 | ... |
---|---|---|---|
學號 | 字符類型 | 8 | ... |
姓名 | 字符類型 | 10 | ... |
身份證 | 字符類型 | 18 | ... |
... | ... | ... | ... |
上表是學生基本星系登記表關系的結構定義,關系則是元組的集合,是關系模式在某一時刻的狀態或內容
實際工作中關系模式和關系統稱為關系。
18.關系數據庫(Relation Database)
:以關系模型作為數據的邏輯模型,並采用關系作為數據組織方式的一類數據庫,其數據庫操作建立在關系代數的基礎上。在給定的應用領域中,所以關系的集合構成一個關系數據庫。
在實際的數據庫應用系統中,一般使用英文作為表名、字段名等。因為在編寫數據庫應用程序時,表名、字段名會作為變量名,使用中文不方便標識,且有些DBMS不能很好的兼容中文。
因此上表應該變更為:
含義 | 字段名 | 數據類型 | 寬度 | ... |
---|---|---|---|---|
學號 | studentNo | 字符類型 | 8 | ... |
姓名 | sutdentName | 字符類型 | 10 | ... |
身份證 | studentId | 字符類型 | 18 | ... |
... | ... | ... | ... | ... |
關系數據庫對關系的限定:
- 每個屬性都不可分解,是關系數據庫對關系的最基本的限定,要求關系的每個分量必須是一個不可分的數據項,即不允許表中有表
- 一個關系對應一種關系模式,模式中的屬性的數據類型及屬性的個數是相對固定的
- 每個關系模式中的屬性必須命名,在同一模式中,屬性名必須是不同的
- 同一關系中不允許出現候選碼或鍵值完全相同的元組
- 關系中的元組順序是可任意交換
- 關系中的屬性順序可以任意交換
關系操作集合
基本的關系操作
增(插入 Insert)、刪(Delete)、改(Update)、查(Query)。關系的查詢表達能力是關系操作最主要的部分。查又可分為選擇、投影、連接、除、並、差、交、笛卡爾積。集合操作方式(操作的對象和結果都是集合)。又稱為一次一集合(set-at-a-time)
關系數據語言的分類
通過關系語言實現關系操作。用戶不必請求DBM為其建立特殊的存取路徑,由 DBMS 的優化機制來完成。
- 代數方式:主要有關系代數,通過對關系的操作來表達查詢要求
- 邏輯方式:主要有關系演算,是用謂詞來表達查詢要求,關系演算又按謂詞變元的基本對象(元組變量或域變量),分為元組關系演算和域關系演算。
- 介於前兩者之間的結構化查詢語言(Structured Query Language,SQL):SQL具有豐富的查詢功能、數據定義和數據控制功能。集查詢、數據定義語言(DDL)、數據操作語言(DML)和數據控制語言(Data Control Language, DCL)於一體;是關系數據庫的標准語言。
關系代數
關系代數是關系操作語言中的傳統表示方式,以集合代數為基礎發展而來。任何一種操作都是將一定的操作符作用域一定的操作對象上,得到預期的操作結果。
而對象和結果均為關系。關系代數直接應用關系的運算來表達操作的目的,運算符包括集合運算符和專門的關系運算符。
{% raw %}
運算符 | 含義 | |
---|---|---|
集合運算符 | ∪ | 並 |
− | 差 | |
∩ | 交 | |
× | 笛卡爾積 | |
專門的關系運算符 | σ | 選擇 |
π | 投影 | |
⋈ | 連接 | |
÷ | 除 | |
比較操作符 | > | 大於 |
≥ | 大於等於 | |
< | 小於 | |
≤ | 小於等於 | |
= | 等於 | |
≠ | 不等於 | |
比較操作符 | ¬ | 非 |
∧ | 與 | |
∨ | 或 |
關系代數操作經過有限次復合的式子稱為關系代數操作表達式(關系代數表達式),可使用表達式表示所需要執行的各種數據查詢和修改處理,所有關系代數是一種抽象的查詢語言,通過對關系的操作來表達查詢。
按運算符分類,關系代數操作可分為:傳統的集合運算和專門的關系運算
集合運算
傳統集合運算是二目運算,將關系看成元組集合,運算從行的角度來進行,具有 並、差、交、迪卡爾積四種運算。
Example:
表 T1
學號(SNO) | 姓名(SNAME) | 性別(SSEX) | 宿舍(SROOM) |
---|---|---|---|
0001 | 張三 | 男 | N101 |
0002 | 王二 | 男 | N101 |
0003 | 李梅 | 女 | C101 |
表 T2
學號(SNO) | 姓名(SNAME) | 性別(SSEX) | 宿舍(SROOM) |
---|---|---|---|
0004 | 劉八 | 男 | D101 |
0005 | 趙二 | 男 | B201 |
0003 | 李梅 | 女 | C101 |
並(UNION)
表T1 和 表T2 使用並運算產生一個新表T3,(T3 = T1 ∪ T2)它是由T1和T2所有不同元組所組成,且 T1和T2屬性個數、值域相同。下表為 T1 ∪ T2的結果
表 T3
學號(SNO) | 姓名(SNAME) | 性別(SSEX) | 宿舍(SROOM) |
---|---|---|---|
0001 | 張三 | 男 | N101 |
0002 | 王二 | 男 | N101 |
0003 | 李梅 | 女 | C101 |
0004 | 劉八 | 男 | D101 |
0005 | 趙二 | 男 | B201 |
差(DIFFERENCE)
表T1 和 表T2 使用差運算產生一個新表T4,(T4 = T1 - T2)它有T1的所有元組但不包含T2的元組,且 T1和T2屬性個數、值域必須相同。下表為 T1 - T2的結果
表 T4
學號(SNO) | 姓名(SNAME) | 性別(SSEX) | 宿舍(SROOM) |
---|---|---|---|
0001 | 張三 | 男 | N101 |
0002 | 王二 | 男 | N101 |
交(INTERSECTION)
表T1 和 表T2 使用交運算產生一個新表T5,(T5 = T1 ∩ T2)它同時包含T1和T2相同的所有元組,且 T1和T2屬性個數、值域必須相同,交運算可由差運算表示(T1∩T2 = T1-(T1-T2))。下表為 T1 ∩ T2的結果
表 T5
學號(SNO) | 姓名(SNAME) | 性別(SSEX) | 宿舍(SROOM) |
---|---|---|---|
0003 | 李梅 | 女 | C101 |
笛卡爾積(CARTESIAN PRODUCT)
表T6 和 表T7 使用笛卡爾積運算產生一個新表T8,(T8 = T6 × T7)它是T6和T7的所有元組連接而成,即將兩張表的元關系合並,且T6的每一元組都對應T7所有的元組
下表為 T6 × T7的結果
表 T6
學號(SNO) | 姓名(SNAME) |
---|---|
0001 | 張三 |
0002 | 王二 |
表 T7
課程號(CNO) | 課程名(CNAME) | 教室(SSEX) |
---|---|---|
1 | 數據庫 | C-101 |
2 | 操作系統 | C-102 |
表 T8
學號(SNO) | 姓名(SNAME) | 課程號(CNO) | 課程名(CNAME) | 教室(SSEX) |
---|---|---|---|---|
0001 | 張三 | 1 | 數據庫 | C-101 |
0001 | 張三 | 2 | 操作系統 | C-102 |
0002 | 王二 | 1 | 數據庫 | C-101 |
0002 | 王二 | 2 | 操作系統 | C-102 |
專門的關系運算
此運算即涉及行,又涉及列,分為一元專門關系操作和二元專門關系操作
- 一元關系操作:對單個關系進行垂直分解的投影運算和進行水平分解選擇運算
- 二元關系操作:對兩個關系進行操作,包括連運算和除運算
選擇(SELECT)
選擇運算( $σ_F(R)$ ),F為條件表達式,R為指定的被運算關系名。 從指定關系中選取滿足條件的若干元組組成一個新關系
SELECT 關系名 WHERE 條件語句(表達式)
條件語句:由常數、屬性名或列名、比較操作符及邏輯操作符組成
Example:
SELECT T8 WHERE 姓名 = "張三"
表 T9
學號(SNO) | 姓名(SNAME) | 課程號(CNO) | 課程名(CNAME) | 教室(SSEX) |
---|---|---|---|---|
0001 | 張三 | 1 | 數據庫 | C-101 |
0001 | 張三 | 2 | 操作系統 | C-102 |
投影(PROJECTION)
投影運算( $π_A(R)$ ), R為被運算關系,A為屬性序列,從指定關系中選取指定的若干屬性值組成新關系
PROJECTION 關系名 ( 屬性名1, 屬性名2 ,... )
組成的新關系自動去重
Example:
PROJECTION T8 (課程號,課程名)
表 T10
課程號(CNO) | 課程名(CNAME) |
---|---|
1 | 數據庫 |
2 | 操作系統 |
θ連接(JOIN)
連接運算($R\cfrac{⋈}{xθy}S$),其中,R和S 代表兩個不同的關系;
x 和 y 分別表示R中的第x列和S中的第y列屬性;
θ表示比較運算符(>、≥、<、≤、=、≠)
從笛卡爾積 R × S 中選取R的第x列屬性值與S的第y列屬性值滿足θ 的那些元組組成一個新關系。
JOIN 關系1 AND 關系2 WHERE 條件語句
條件語句:由比較操作符和屬性名或列名組成的表達式
- 等值連接:θ值為 "=",從R和S的笛卡爾積中選取 x、y 屬性值相等的元組
Example:
表 T11
A | B | C |
---|---|---|
a | b | c |
d | e | f |
表 T12
D | E | A |
---|---|---|
g | h | a |
b | c | d |
JOIN T11 AND T12 WHERE C = E
T11 × T12
T11.A | B | C | D | E | T12.A |
---|---|---|---|---|---|
a | b | c | g | h | a |
a | b | c | b | c | d |
d | e | f | g | h | a |
d | e | f | b | c | d |
等值結果為:
表 T13
T11.A | B | C | D | E | T12.A |
---|---|---|---|---|---|
a | b | c | b | c | d |
- 自然連接:是一種特殊的等值連接,要求兩個關系中比較的分量必須是 相同的屬性組,且結果中去除重復的屬性列
JOIN T11 AND T12 WHERE A = A
表 T14
T11.A | B | C | D | E | T12.A |
---|---|---|---|---|---|
a | b | c | g | h | a |
d | e | f | b | c | d |
表 T14.2
A | B | C | D | E |
---|---|---|---|---|
a | b | c | g | h |
d | e | f | b | c |
自然連接是構造新關系的有效方法,投影和選擇是分解關系的有效方法,自然連接中如果兩個關系沒有公共屬性則變成笛卡爾積
除(DIVISION)
除運算(R÷S) R和S代表兩個不同的關系。
假如被除關系R 為 m 元關系,除關系S 為 n 元關系,則運算結果的新關系為 m-n元關系。
Example 1:
表 T15
A | B | C | D | E | F | G |
---|---|---|---|---|---|---|
a | b | c | d | e | f | g |
h | i | j | k | l | m | n |
a | b | c | d | e | c | d |
a | c | e | f | b | m | n |
a | b | c | d | e | b | h |
a | b | c | d | e | g | h |
表 T16
H | F | G |
---|---|---|
b | f | g |
c | m | n |
b | c | d |
c | b | h |
T15 ÷ T16
運算步驟:
- 被除關系R對除關系S不同的屬性 X 進行投影
X 投影
A | B | C | D | E |
---|---|---|---|---|
a | b | c | d | e |
h | i | j | k | l |
a | b | c | d | e |
a | c | e | f | b |
a | b | c | d | e |
a | b | c | d | e |
// 列出 x 集合中的值 和對應象集
{
"a,b,c,d,e":{(f,g),(c,d),(b,h),(g,h)},
"h,i,j,k,l":{(m,n)},
"a,c,e,f,b":{(m,n)}
}
// 列出 表 T16 中與 T15相同的列的投影
{
(f,g),(c,d),(b,h)
}
通過對比發現 只有a,b,c,d,e值對應的象集包含關系T16的投影集,所以結果接
A | B | C | D | E |
---|---|---|---|---|
a | b | c | d | e |