基本概念
關系模型(表)
關系模型由關系數據結構、關系操作集合和關系完整性約束三部分組成。
關系模型的數據結構非常簡單:一張扁平的二維表。
元組:二維表中的具有相同數據類型的某一行
屬性:二維表中的具有相同數據類型的某一列
笛卡爾積(Cartesian product):又稱直積,分別用集合A和集合B的一個元素作第一、第二元素構成有序對,所有這樣的有序對的集合稱為A和B的笛卡爾積,記作A×B。
其符號化表示為:A×B = { | x∈A∧y∈B}。
易證:若|A| = m,|B| = n,則|AB| = m*n。(|A|表示集合A的模,即 集合A中元素的個數為m個)
例如:
A={a, b}, B={0, 1, 2},則
A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}
表:是實實在在地保存數據的實體,寫入的數據都保存在表中
視圖:是一個虛擬表,其內容由查詢定義。
同真實的表一樣,視圖包含一系列帶有名稱的列和行數據;但是,視圖并不在數據庫中以存儲的數據值集形式存在。
行和列數據來自由定義視圖的查詢所引用的表,并且在引用視圖時動態生成。
碼
候選碼:若關系中的一個屬性或屬性組的值能夠唯一地標識一個元組,且他的真子集不能唯一的標識一個元組,則稱這個屬性或屬性組做候選碼。
主鍵:如果在一個關系中,有多個候選碼可以選擇,則選定其中的一個作為該關系的主鍵。
它的值用于唯一地標識表中的某一條記錄。主關鍵字是一種唯一關鍵字。
碼:是一個或多個屬性的集合。
超碼:是一個或多個屬性的集合,超碼中的這些屬性可以讓我們在一個實體集中唯一地標識一個實體。
注意:雖然超碼可以唯一標識一個實體,但是可能大多數超碼中含有多余的屬性。所以我們需要候選碼。
候選碼:是極小的超碼集,也就是它的任意真子集都不是超碼,而他本身是超碼。
主碼:是被選中用來在一個關系中區分不同元組的候選碼。
我來舉個例子吧:
學生表(學號,身份證號,姓名,性別)
超碼:(學號,性別)→(姓名)。學號和性別能唯一標識姓名一點問題都沒有,但是其實標識姓名,只用學號就能標識了,不需要性別。
候選碼:(學號)→(姓名),(身份證號)→(姓名)。學號或身份證號都能唯一標識姓名。
主碼:(學號)→(姓名)。這是人為選擇的,其實身份證號也能做主碼。
連接
所謂"連接",就是兩張表根據關聯字段(就是ON后面的關聯條件),組合成一個數據集。
內連接(inner join):(以左右表內匹配的記錄為主)表示只包含匹配的記錄。只返回兩張表匹配的記錄。
外連接(outer join):表示還包含不匹配的記錄。
左連接(left join):(以左表所有的記錄為主)又稱左外連接,返回匹配的記錄,以及表A多余的記錄。
右連接(right join):(以右表所有的記錄為主)又稱右外連接,返回匹配的記錄,以及表B多余的記錄。
全連接(full join):(以兩個表所有的記錄為主)又稱全外連接,返回匹配的記錄,以及表A和表B各自的多余記錄。
交叉連接(cross join):即 做笛卡爾積運算。
表A和表B不存在關聯字段,這時表A(共有n條記錄)與表B(共有m條記錄)連接后,一對一組合配對,會產生一張包含n*m條記錄的新表,返回新表。
上圖中,表A的記錄是123,表B的記錄是ABC,顏色表示匹配關系。返回結果中,如果另一張表沒有匹配的記錄,則用null填充。
例子:
學生表:
s_id:學生學號
s_name:學生名稱
s_class:學生班級
老師表:
t_id:老師id
t_class:老師管理的班級
t_name:老師名稱
內連接(INNER JOIN)
/* 內連接 */
SELECT * FROM student INNER JOIN teacher ON s_class=t_class
/* 我比較喜歡這種 */
SELECT * FROM student,teacher WHERE s_class=t_class
外連接(OUTER JOIN)
左外連接(LEFT JOIN)
/* 左連接 */
SELECT * FROM student LEFT JOIN teacher ON s_class=t_class
右外連接(RIGHT JOIN)
/* 右連接 */
SELECT * FROM student RIGHT JOIN teacher ON s_class=t_class
全外連接(FULL JOIN)
注意:Oracle數據庫支持full join,mysql是不支持full join的,但仍然可以同過左外連接+union+右外連接實現。
/* 全連接(不適用于MYSQL) */
SELECT * FROM student FULL JOIN teacher ON s_class=t_class
/* 全連接 */
SELECT * FROM student LEFT JOIN teacher ON s_class=t_class
UNION
SELECT * FROM student RIGHT JOIN teacher ON s_class=t_class
交叉連接(笛卡爾積)(CROSS JOIN)
/* 交叉連接 */
SELECT * FROM student CROSS JOIN teacher