一、什么是數據庫?
數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫。
每個數據庫都有一個或多個不同的 API 用于創建,訪問,管理,搜索和復制所保存的數據。
我們也可以將數據存儲在文件中,但是在文件中讀寫數據速度相對較慢。
所以,現在我們使用關系型數據庫管理系統(RDBMS)來存儲和管理大數據量。所謂的關系型數據庫,是建立在關系模型基礎上的數據庫,借助于集合代數等數學概念和方法來處理數據庫中的數據。
RDBMS 即關系數據庫管理系統(Relational Database Management System)的特點:
- 1.數據以表格的形式出現
- 2.每行為各種記錄名稱
- 3.每列為記錄名稱所對應的數據域
- 4.許多的行和列組成一張表單
- 5.若干的表單組成database
二、RDBMS 術語
在我們開始學習MySQL 數據庫前,讓我們先了解下RDBMS的一些術語:
- 數據庫:?數據庫是一些關聯表的集合。
- 數據表:?表是數據的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格。
- 列:?一列(數據元素) 包含了相同類型的數據, 例如郵政編碼的數據。
- 行:一行(元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據。
- 冗余:存儲兩倍數據,冗余降低了性能,但提高了數據的安全性。
- 主鍵:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢數據。
- 外鍵:外鍵用于關聯兩個表。
- 復合鍵:復合鍵(組合鍵)將多個列作為一個索引鍵,一般用于復合索引。
- 索引:使用索引可快速訪問數據庫表中的特定信息。索引是對數據庫表中一列或多列的值進行排序的一種結構。類似于書籍的目錄。
- 參照完整性:?參照的完整性要求關系中不允許引用不存在的實體。與實體完整性是關系模型必須滿足的完整性約束條件,目的是保證數據的一致性。
MySQL 為關系型數據庫(Relational Database Management System), 這種所謂的"關系型"可以理解為"表格"的概念, 一個關系型數據庫由一個或數個表格組成,
- 列(col): 具有相同數據類型的數據的集合;
- 行(row): 每一行用來描述某條記錄的具體信息;
- 值(value): 行的具體信息, 每個值必須與該列的數據類型相同;
- 鍵(key): 鍵的值在當前列中具有唯一性。
三、基礎概念
[1] 關系模式 對關系的邏輯結構和特征的描述。
[2] 關系代數 以關系作為運算對象的代數系統。在數據庫中用代數運算來定義關系查詢的一種形式化語言。
[3] 數據冗余 同一或同一批數據在同一存儲設備或同一系統中多處出現,容易造成數據變更時的不一致。
[4] 元組 與關系對應的二維表中的行。相當于數據文件中的記錄。
[5] 第二范式 每一個非主屬性完全函數依賴于鍵的關系模式。
[6] 第一范式 每個屬性均不能再分解的關系模式。它是關系模式最基本的規范形式。
[7] 主屬性 在關系中能夠唯一地標識一個元組的屬性組中的諸屬性。
[8] 函數依賴 如果一部分屬性的值由另外一部分屬性的值決定,則稱該部分屬性函數依賴于另一部分屬性。例如基本工資額函數依賴于工資級別。
[9] 第三范式 每一個非主屬性既不存在對鍵的部分函數依賴也不存在對鍵的傳遞函數依賴的關系模式。
[10] BC范式 每一個函數依賴的決定因素中均含有鍵的關系模式。
[11] 數據庫設計 對于一個給定的應用環境,構造最優的數據庫模式。建立數據庫及其應用系統,使之能夠有效地存儲和管理數據滿足各種用戶的應用需求。
[12] 關系演算 以一階謂詞演算為基礎定義的一種抽象的關系查詢語言。
四、函數依賴
在數據庫設計和規范化中,函數依賴是一個核心概念。它用于描述關系模式(即表結構)中屬性之間的依賴關系,幫助我們理解數據的完整性和冗余性,從而指導我們如何優化數據庫設計。
1.函數依賴的基本定義
假設有一個關系模式 R
,其中包含一組屬性集合 U
。如果對于 R
的所有可能的關系實例,只要兩個元組在屬性集 X
上的值相同,那么它們在屬性集 Y
上的值也必然相同,我們就說 X
函數決定 Y
,記作 X -> Y
。這里,X
是決定因子,Y
是被決定的屬性或屬性集。
例如,在一個學生信息表中,如果有屬性 StudentID
、Name
和 Major
,我們可以有函數依賴 StudentID -> Name
和 StudentID -> Major
,因為每個學生的學號決定了其名字和專業。
2.函數依賴的類型
-
平凡函數依賴:如果
Y
是X
的子集,則X -> Y
稱為平凡函數依賴。 -
非平凡函數依賴:如果
Y
不是X
的子集,則X -> Y
秢為非平凡函數依賴。 -
部分函數依賴:如果
X -> Y
,但存在X
的真子集Z
使得Z -> Y
,則稱Y
對X
部分函數依賴。 -
完全函數依賴:如果
X -> Y
,且不存在X
的真子集Z
使得Z -> Y
,則稱Y
對X
完全函數依賴。
3.函數依賴的性質
-
自反律:如果
Y
是X
的子集,則X -> Y
成立。 -
增廣律:如果
X -> Y
,則對于任何屬性集Z
,都有XZ -> YZ
。 -
傳遞律:如果
X -> Y
且Y -> Z
,則X -> Z
。
函數依賴是數據庫規范化理論的基礎,通過理解和應用這些規則,可以消除數據冗余,提高數據的一致性和完整性,從而構建更高效、更可靠的數據庫系統。
五、自然連接
自然連接(Natural Join)是一種特殊的數據庫操作,主要用于合并兩個具有公共屬性的關系(表)。它是SQL中最常見的連接類型之一,特別適用于當兩個表在某些列上擁有相同的屬性名時進行數據整合。
1.自然連接的特點:
-
自動匹配列名:自然連接會自動識別兩個表之間同名的列,并基于這些列進行連接。如果兩個表沒有共同的列,自然連接的結果將為空。
-
內連接類型:自然連接本質上是一種內連接(INNER JOIN),意味著只有當兩個表中的記錄在共同列上有匹配時,才會出現在結果集中。不匹配的記錄會被排除。
-
隱式條件:與使用顯式ON子句的JOIN不同,自然連接不需要指定連接條件,因為它會默認使用所有同名的列作為連接鍵。
2.SQL語法示例:
假設有兩個表 Employees
和 Departments
,它們都有一個名為 DepartmentID
的列。執行自然連接如下:
Sql
SELECT *
FROM Employees
NATURAL JOIN Departments;
這將返回一個新的表,其中包含了 Employees
和 Departments
表中 DepartmentID
相匹配的所有記錄。結果集中的每一行都表示一個員工及其所在部門的信息。
3.注意事項:
-
在使用自然連接時,應確保兩個表中的同名列具有相同的含義和數據類型,否則可能會導致錯誤或意外的結果。
-
如果兩個表中有多個同名列,自然連接會基于所有同名列進行匹配,這可能不是預期的行為。在需要精確控制連接條件的情況下,使用顯式的INNER JOIN語句并指定ON子句通常更為合適。
自然連接簡化了查詢編寫過程,特別是在處理具有明顯共享屬性的表時,但它也可能引入復雜性和不確定性,尤其是在大型數據庫系統中。因此,根據具體場景選擇合適的連接類型非常重要。
六、引用關系
引用關系(Referential Relationship)在數據庫設計中,尤其是關系型數據庫中,指的是實體之間的一種聯系,它確保了數據的完整性和一致性。這種關系通常是通過外鍵約束實現的,外鍵鏈接一個表的數據到另一個表的主鍵,從而建立起表與表之間的關聯。
1.主要組成部分:
-
主鍵(Primary Key):在關系型數據庫中,每個表至少有一個主鍵,它唯一標識表中的每一條記錄。主鍵可以由一個或多個字段組成,確保數據行的唯一性。
-
外鍵(Foreign Key):外鍵是參照另一個表主鍵的一個或多個字段,用于建立兩個表之間的鏈接。通過外鍵,一個表(子表)的某條記錄可以指向另一個表(父表)中的某條記錄。
2.引用關系的作用:
-
數據完整性:引用關系確保了數據庫中數據的一致性和完整性。例如,如果一個表中的記錄被刪除,那么所有引用該記錄的其他表中的相關記錄要么也被刪除(級聯刪除),要么保持不變(限制刪除)以避免出現孤兒記錄。
-
導航和查詢:引用關系允許從一個表的數據輕松導航到另一個表的相關數據,這對于復雜的查詢和報告非常有用。
3.實現引用關系:
在創建數據庫表時,可以通過定義外鍵約束來實現引用關系。例如,在SQL中,可以這樣定義:
Sql
CREATE TABLE Orders (OrderID int PRIMARY KEY,CustomerID int,OrderDate date,FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
在這個例子中,Orders
表的 CustomerID
字段是一個外鍵,它引用了 Customers
表的主鍵 CustomerID
。這意味著 Orders
表中的每一個 CustomerID
值必須在 Customers
表中找到對應的值。
引用關系是關系型數據庫設計的核心原則之一,它有助于維護數據的邏輯結構和業務規則,確保數據在不同表之間的一致性和相關性。
七、MySQL數據庫
MySQL 是一個關系型數據庫管理系統,由瑞典 MySQL AB 公司開發,目前屬于 Oracle 公司。MySQL 是一種關聯數據庫管理系統,關聯數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度并提高了靈活性。
- MySQL 是開源的,目前隸屬于 Oracle 旗下產品。
- MySQL 支持大型的數據庫。可以處理擁有上千萬條記錄的大型數據庫。
- MySQL 使用標準的 SQL 數據語言形式。
- MySQL 可以運行于多個系統上,并且支持多種語言。這些編程語言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
- MySQL 對 PHP 有很好的支持,PHP 是很適合用于 Web 程序開發。
- MySQL 支持大型數據庫,支持 5000 萬條記錄的數據倉庫,32 位系統表文件最大可支持 4GB,64 位系統支持最大的表文件為8TB。
- MySQL 是可以定制的,采用了 GPL 協議,你可以修改源碼來開發自己的 MySQL 系統