# Database Management System # Preface 如何學習資料庫以及如何使用這些學習資源 ### Terminlogy - Entity Relationship Diagram ERD - Entity Relationship Model ERM - Database Administrator DBA - Precedence Graph 優先順序圖、先行圖 - Super Key 指在該 Table 中為 Unique 的 Key,可為複合的 - Candidate Key 指在該 Table 中為 Unique 且 Minimal 的 Key - Primary Key 指從 Candidate Key 中挑選其中一個,也就是最具有識別意義的 Key - Alternate Key 指沒有被選為 Primary Key 的其他 Candidate Key - Foreign Key 指將目前 Table 關聯至其它 Table Primary Key 的 Key - Surrogate Key 指 Table 中的 Candidate Key 都不適合當 Primary Key 的情況下,如資料太長等等,就會用一個無意義的但唯一的 Column 來代作 Primary Key - Full Functional Dependency 完全功能相依 - Partial Functional Dependency 部分功能相依 - Transitive Dependency 遞移相依、間接相依 - Alter 修改 - Collation 定序 - Cardinality 基數 - Ascending 升序 - Descending 降序 - Relational Algebra 關聯式代數 - Workbench 工作臺 - Software Bundle 軟體安裝包 - Constraints 限制、約束 - Extended Form of BNF Notation 擴展巴科斯範式 - Object Relational Mapping ORM 物件至關係的映射 - Schema 指 DB 中 資料在 Table 中如何被儲存的格式 - Data Definition Language DDL 資料描述語言,描述資料表中各欄位的內容 - Data Manipulation Language DML 資料庫操作語言,操作資料庫進行寫入動作 - Data Control Language DCL 資料庫控制語言,操作資料庫的權限 - Data Query Language DQL 資料庫查詢語言,操作資料庫進行讀取動作 - CRUD Create、Read、Update、Delete 增刪改查的縮寫 - DBCP Database Connection Pool 資料庫連接池 - ODBC Open Database Connectivity 開放資料庫互聯 - Java Database Connectivity Java 資料庫互聯 - Lossless Decomposition 無損失分解 - JavaServer Pages JSP - Transaction Tx 指資料庫執行過程中的一個邏輯單位,一個 Tx 中含多個對 DB 的操作,且只能有兩種結果:全部執行成功或全部不執行,即只要其一行失敗就 Rollback - Servlet Server Applet # Introduction ### The Benefits of Using Databases - 降低資料的重複性 Redundancy Database 的核心精神即是在相同的資料情況下,只需儲存一次,而之間則以關聯連接,以減少資料的重複性 - 達成資料的一致性 Consistency 相同的資料(如學籍資料)在資料庫中可能是各部門共用的(教務處、學務處),若有某一項資料更新,則其他單位必須同時更新資料,則資料有一致性 - 達成資料的共享性 Data Sharing 指同一份資料可在同一時間提供給多位使用者同時 Access Data - 達成資料的獨立性 Data Independence 指 Data 與 Program 之間無關、獨立,當使用者對 API 有新增、修改需求時,可以修改外部的 Program,並不影響 Data 的儲存結構 - 達成資料的完整性 Integrity 即透過 Integrity Constraint 可以防止 Database 產生 Abnormal - 避免紙張與空間浪費 Reduce Paper and Space 原始的資料庫都是使用紙本儲存,搜尋慢以外還需要極大的儲存空間 - 達成資料的安全性 Security 資料庫方便備份,且帶有權限管理功能,能夠保障資料的安全性 ### ACID 指 DBMS 在寫入、更新或刪除資料的過程中,為保證 Transaction 是正確可靠所必須具備的四項特性 - 原子性 Atomicity 又稱不可分割性,一個 Transaction 中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節,Transaction 在執行過程中若發生錯誤,會被恢復(Rollback)到 Transaction 開始前的狀態,就像這個 Transaction 從來沒有執行過一樣 - 一致性 Consistency 在 Transaction 開始前和 Transaction 結束以後,Database 的完整性沒有被破壞,這表示寫入的資料須完全符合所有的預設 Integrity Constraint、Trigger、Cascading Rollback - 隔離性 Isolation 數據庫允許多個 Transaction 以 Concurrency 的方式同時對其 Database 的內容進行 Read、Write、Update,而具有隔離性可以防止多個 Transaction Concurrency 時由於交叉執行而導致數據的不一致,在修改資料時必須要取得 Lock,使其他 Transaction 不會與現在正在修改資料的 Transaction 衝突,例如 A、B Transaction 皆正在執行時,它們進行的時候所使用的資料庫應該要長的一模一樣,不會發生 B 抓到的資料是 A 進行到一半的資料庫 - 持久性 Durability Transaction 結束後,對數據的修改就是永久的,即便系統故障也不會丟失 ### Integrity Constraints Integrity Constraint 可確保資料庫的 Integrity,避免資料經過 Create、Delete、Update(也就是 Write 行為)會產生 Abnormal,若嘗試將錯誤、不合法的 Record 存入 Database 之中會被阻擋 - 實體完整性 Entity Integrity 每個單一 Table,都必須要有 Primary Key,Primary Key 必須為 Unique 且 Not Null - 參考完整性 Referential Integrity 如果一個 Foreign Key 存在一個 Table 之中,則 Foreign Key 必須要 Match 到其他 Table 中的 Candidate Key or Primary Key,且對應到的 Key 必須一定要存在,不可對應到 Null - 值域完整性 Domain Integrity 每個單一 Table,同一 Column 的資料屬性必須要相同 ### DDL、DML and DCL - Data Definition Language DDL 資料描述語言,描述資料表中各欄位的內容 - Data Manipulation Language DML 資料庫操作語言,操作資料庫進行寫入動作 - Data Query Language DQL 資料庫查詢語言,操作資料庫進行讀取動作 - Data Control Language DCL 資料庫控制語言,管理、設定使用者的權限 其中 DML 又可分為以下兩種: - High Level DML = Non-Procedural DML - Low Level DML = Procedure DML Non-Procedural DML 需要使用者去指定要取得哪些資料,但不需要指定如何取得資料,SQL 就是一種 Non-Procedural DML,而 Procedural DML 不只需要指定要取得哪些資料,還要一步一步地指定如何取得資料的步驟,舉例說 Relational Algebra 就是一種 Procedural DML 此外,有些書籍將 DML 以及 DQL 合併當成 DML,即包含完整的 CRUD 四種操作 # Entity Relationship Model ### Attributed 一個 Entity 即是由 Attributes 所組成,E.g. Student is Composed By Name、ID、Age... 而Attribute Types 有以下幾種分類方式: - Single-Valued and Multi-Valued Attributes(E.g. Phone is a Multi-Valued Attributed, Everyone Can Have Multiple Phones) - Simple、Composite Attributes and Derived Attributes(Can be Computed From Other Attributes E.g. Age、Given Date Of Birth) ### Entity 在 ERM 之中,Entity 通常被視為真實世界的物件,含有各種 Attribute,E.g. Name、ID、Age,而 Entity 又可分為 Regular Entity、Weak Entity ### Entity Sets Entity Set 即是多個擁有相同 Attribute 的 Entities 的集合 ### Relationship Relationship 指 Entity 之間的關係,通常含有動詞意義,E.g. "Amy Chooses Digital Logic Design Course" is a Relationship Between Amy(Student's Entity) and Digital Logic Design(Course's Entity) ${(e_1, e_2, … e_n) | e_1 ∈ E_1, e_2 ∈ E_2, …, e_n ∈ E_n}, (e_1, e_2, …, e_n)$ is a Relationship, Every Entity(e) are the Attribute of Every Respective Entity Set Relationship 又可分為四種類型: - One to One - One to Many - Many to One - Many to Many ### Relationship Sets Relationship Set 即是多個 Relationship 的集合,可根據連出去的數量,即 Degree of a Relationship Set,分為 Unary、Binary、Ternary、N-ary Relationship ### Keys - Super Key 指選出兩個或兩個以上的 Column 組合起來,以作為 Unique 的資料欄位 - Candidate Key 即 Minial 的 Super Key - Primary Key 由 Candidate Key 中依據語意,選出一個 Candidate Key 作為 Primary Key,剩下的則稱作 Alternative Key - Alternative Key 指所有 Candidate Key 中除了 Primary Key 以外所剩下的 - Composite Key 指是由兩個或兩個 Column 以上所組成的 Primary Key - Foreign Key 任兩 Table 要進行關聯時,須透過 Foreign Key 參考 Primary Key 才能建立,其中持有 Primary Key 的 Table 稱作 Parent,持有 Foreign Key 的 Table 則稱作 Child, Foreign Key 的存在是為了要保證 Referential Integrity 而給予的一種限制 ### How to Convert ERD into Table - 將每個 Entity 名稱轉為 Table 名稱 - 將每個 Entity 的 Attribute 名稱轉為該 Table 的 Column 名稱 - 將每個 Entity 中含有底線的 Key Attribute 在 Table 中設為 Primary Key,如果這個 Key 是 Composite Attribute,則這個 Composite Attribute 所含的 Columns 皆為 Primary Key 的一部分 - 如果兩 Enity 以 One to One 連接,則在其一 Table 加入 Foreign Key 連接至另一 Table - 如果兩 Enity 以 One to Many、Many to One 連接,則在 Cardinalty 為 Many 的 Table 加入 Foreign Key 連接至 Cardinalty 為 One 的 Table # Normalization 想法上是將一個大 Table 分解成小的各個 Table,讓 Table 的 Data 能夠 Reuse,目的是將 Database 所需的儲存空間更小(Data Redundancy)、避免資料更新異常(Anomalies)發生的機會,一般而言,正規化的精神就是讓資料庫中重複的欄位資料減少到最少,並且能快速的找到資料,以提高 Database 的性能 Normalization 共可分為六種階段,分別為: - First Normal Form 1 NF 即所有紀錄中的屬性的內含值都是單一的,未包含重複項目群 - Second Normal Form 2 NF 符合 1 NF 且每一非 Primary Key 的 Column 都必須是 Full Dependece on Primary Key,即代表不可 Partial Dependence on Primary Key - Third Normal Form 3 NF 符合 2 NF 且每一非 Primary Key 欄位非 Transitive Dependence on Primary Key 即去除 Transitive Dependence - Boyce-Codd Normal Form BCNF 符合 3 NF 且每一決定因素皆是 Candidate Key - Fouth Normal Form 4 NF 實務上不使用 - Fifth Normal Form 5 NF 實務上不使用 ### What is Data Anomalies 資料異常可分為三種: - 新增異常 Insert Anomalies 新增某些資料時必須同時新增其它資料,否則會產生新增異常,,亦即因 Integrity Constraint,另一個 Entity 的資料尚未插入之前,無法插入目前這個 Entity 的資料 - 修改異常 Update Anomalies 修改某些資料時必須一併修改其它的資料,亦即因 Integrity Constraint,修改的資料不符合規則而產生的異常現象 - 刪除異常 Delete Anomalies 刪除某些資料時必須同時刪除其它的資料,否則會產生刪除異常,亦即刪除單一資料列造成其它 Table 中的 Record 遺失,需使用 Integrity Constraint 限制 ### Lossless Decomposition Lossless Decomposition 無損失分解,代表將原先關聯的 Table 的所有資訊,在分解成多個 Table 後,仍能經過 Join 得到原先未分解前的資訊 ### Functional Dependence 假設 R 代表一個 Table,X、Y 是該 Table 中的 Column,若 X → Y(X Mapping to Y)即代表 X 的值決定 Y 的值,這就稱做 Y is Functionally Dependency on X,或也可以稱為 X Funcitonally Determines Y,X 也可被稱作 Determinant Functional Dependence 又可分為以下三種: - Full Functional Dependency 完全功能相依 R(X,Y,Z)包含一組 Functional Dependecy(X,Y) → Z,若我們從 R 中移除任一屬性 X 或 Y,則此 Mapping 不存在,即為 Full Functional Dependecy - Partial Functional Dependency 部分功能相依 R(X,Y,Z)包含一組 Functional Dependecy(X,Y) → Z,若我們從 R 中移除任一屬性 X 或 Y,則此 Mapping 依舊存在,即為 Partial Functional Dependecy,代表其中有一屬性為冗餘 - Transitive Dependency 遞移相依: 指兩 Column 間並非 Direct Dependecy,而是藉由中間的 Column 來達成間接 Mapping 的關係,例如 R(X,Y,Z),X → Y,Y → Z,則 X → Z ### 1 Normal Form 定義:在一個 Table 內,欄位的內容都是 Atomic Value,且沒有任何兩筆以上的 Record 是完全重覆,而 Atomic 的意思是指:屬性必須要是單值屬性,不能是複合、多值或巢狀多值 | student_id | name | sex | course_id | course_name | credit | required/elective| grade | teacjer_id | teacher_name | | ---- | ----- | ---- | -------------------- | ---------------------------------------------------------------------- | ----------- | -------------------------------- | ------ | -------------------- | --------------------- | | 001 | John | Male | C001<br>C002 | Programming Language <br> Web Design | 4<br>3 | Required<br>Elective | B<br>C | T001<br>T002 | Nancy<br>Amy | | 002 | David | Male | C002<br>C003<br>C005 | Web Design<br>Introduction Of Computer Science<br>Digital Logic Design | 3<br>2<br>4 | Elective<br>Required<br>Elective | ABA | T002<br>T003<br>T005 | Amy<br>Kevin<br>Brian | 具體作法是將多值屬性的部分拆成另一個 Table,並且多該的 Table 的 Key 還要加入原 Table 的 PK,以上述 Table 來說將分解為:student(<u>student_id</u>, name, sex), course(<u>course_id, student_id</u>, course_name, credit, required/elective, teacher_id, teacher_name) ### 2 Normal Form 定義:符合 1NF,且 Primary Key 以外的 Column 都必須 Full Functionally Depend on Primary Key,而不能是 Partial Dependence,例如 RentalLine(<u>TransID, VideoID</u>, Copy, Title, Rent),Copy Depend on TransID、VideoID,而 Title、Rent 則只 Partial Depend on Video ID,因此該 Table 可分解成 Videos(VideoID, Title, Rent)以及 VideosRented(TransID, VideoID, Copy) ### 3 Normal Form 定義:符合 2NF,且 Primary Key 以外的 Column 都不能是 Transitive Dependence,例如 RentalForm(<u>TransID</u>, RentDate, CustomerID, Phone, Name, Address, City, State, ZipCode),之鍾的 Phone、Name、Address、City、State、ZipCode 與 TransID 之間的關係都是 Transitive Dependency,中間還夾了一個 CustomerID,因此經過 3NF 可分解為 Rentals(TransID, RentDate, CustomerID)、Customers(CustomerID, Phone, Name, Address, City, State, ZipCode) ### Boyce-Codd Normal Form 定義:又稱作 3.5 NF,須符合 3NF,且若某個 Table 的由多個欄位所組成,則可以再進行 BCNF(只有單一屬性的 Primary Key 必定符合 BCNF),原則即 Primary Key 中的各欄位不可 Depend on 他非主鍵的欄位 BCNF 與 3NF 的不同之處在於:3NF 中不允許 non-Primary Attribute 被另一個 non-Primary Attribute 決定,但 3NF 允許 Primary Attribute 被 non-Primary Attribute 所決定,但在BCNF中,任何 Attribute(包括 non-Primary Attribute 和 Primary Attribute)都不能被 non-Primary Attribute 所決定,即 Table 中的所有 Determinant 都是 Candidate Key 在某個 Relation 的 Candidate Key 之中包含的屬性就稱作 Primary Attribute,反之稱作 non-Primary Attribute 任何一個BCNF必然滿足: BCNF 必滿足: - 所有非 Primary Key 的 Column 都 Full FD 於每個 Candidate Key - 所有 Primary Key 都 Full FD 於每個不包含它的 Candidate Key - 沒有任何 Column Full FD 於非 Candidate Key 的任何一組屬性,即沒有 Partial Dependence ### 4 Normal Form # Structured Query Language # Relational Algebra Relational Algebra 常用的 Operator 共有八種,其中五個為 Primitive Operators,另外三個則為 Non-Primitive Operators ### Primitive Operators 共有五種 Primitive Operators,為 Relational Algebra 中最基礎、不可取代的五種最基本的 Operator,該五種 Primitive Operators 無法由其他 Operator 導出: - Union 聯集 - Difference 差集 - Cartesian Product 笛卡爾積、卡式積、乘積 - Select 選擇 - Project 投影 只要有以上五種 Operator 就能建構出關聯式資料庫的查表所有功能(不包含 Aggregation Function) ### Non-Primitive Operators 可由 Primitive Operators 推出,但由於經常使用,因此賦予特定的名稱以及符號給予這些操作 - Join 合併 - Intersection 交集 - Division 除法 以上八種 Operator 除了 Project、Select 外,其餘的運算為 Binary Operator 二元運算子,它們具有以下的性質: - Closure 封閉性 任何 Relation 經過了上面的運算後,其輸出結果仍是一個 Relation - Nested 巢狀性 Operand 的輸出可以做為下一個 Operand 的輸入,即代表可以做連續的操作,其結果仍是 Relation ### Relationally Complete 以 Relational Calculus 這個查詢語言為基準,若有某一種關聯式語言可以處理與 Relational Calculus 一樣的功能時,即 Relationally Complete,Relational Algebra 以及 SQL 都屬於 Relational Complete ### How to Use Primitive Operators to Form Intersection Operator $R \cap T = R1 - (R1 - R2) = R2 - (R2 - R1)$,所以只要有 Union Operation、Difference Operation 就可以做出 Intersection Operation ### How to Use Primitive Operators to Form Division Operator ### Unary Operation - Selection:$\sigma_{condition}(R)$,將 Relation 中符合 Condition 的 Tuple 合成一個新的 Relation - Projection:$\pi_{attribute\_list}(R)$,將 Relation 中的各個 Tuple 的屬性篩選,只取在 Attribute List 的部分,重新組成新 Relation 的 Tuple - Rename(Special):$\rho_{S(attr1,attr2,attr3)}(R)$,將 Tuple 中的特定 Attribute Name 重新命名,S 代表 New Relation Name,attr1、attr2 為 New Attribute Name,若只要修改 Relation Name 可改寫為 $\rho_{S}(R)$,若只要修改 Attribute Name 可改寫為 $\rho_{(attr1,attr2)}(R)$,這個運算通常不會被包含在正統的 Relational Algebra 之中 ### Binary Operation - Union:$S\ \cup \ T$,將兩個 Relation 聯集 - Intersection:$S\ \cap \ T$,將兩個 Relation 交集 - Difference:$S\ - \ T$,將兩個 Relation 差集 - Product:$S\ \times\ T$,將兩個 Relation 中的兩組 Tuple 交叉組合,合成為一個新的 Relation 的 Tuple,New Relation 中含有的 Tuple 數量為 $\mid S\mid * \mid T \mid$ 個 - Division:$S\ \div\ T$,等價於 $π_{x}(S_{x,y})-\sigma_{x}(S_{x,y}\times T_{y}))$,通常用於以 T 為條件,從 S 中查詢符合的 Tuple - Join:$S\Join_{condition}T$,等價於 $\sigma_{<condition>}(S\times T)$,將兩個 Relation 中的 Tuple,根據某個 Condition 而 Join 為一個 Relation,Join Operation 實際上就是先將兩個 Relation 做 Product 後再 Selection,Join 又可再分為兩類: - Inner Join:用於使用給定的 Condition 將 Relation 篩選,且得出的 Relation 必定是原兩個 Relation 的 Intersection,Outer Join 則相反 - Natural Join: 將兩個 Relation 中各 Tuple 的 Attribute Name 相同的 Column 合併,通常 Natural Join 的運算會另外使用 Star 這個 Operator 表示(\*),E.g. $S * T$ - Theta Join: 將兩個 Relation 中各 Tuple 合併時,若 Condition 的 Compare Operator 為 >、<、=、!=、>=、<= 時即為 Theta Join,E.g. $S\Join_{attr1\ \theta\ attr2}T$ - Equi Join: 將兩個 Relation 中各 Tuple 合併時,若 Condition 的 Compare Operator 為 = 時,即為 Equi Join,同時也是 Theta Join 的特例 - Outer Join: 在 Outer Join 中,即使 Relation 與另一個 Relation 不見得 Match,產出的 New Relation 仍會保留它,即 New Relation 除了原兩個 Relation 都 Match 的 Record 外還包含 Unmatch 的 Record,共有以下三種: - Left Outer Join - Right Outer Join - Full Outer Join 目前所提到的 Relational Algebra 只是提供最基本的功能,尚無法做到 Outer Join,只能做 Inner Join,而 Outer Join 的部分之後篇章再深入描述 ### Properties of Relational Algebra - 結合律 (Associativity) - 交換律 (Commutativity) - 分配律 (Distributivity) # Extended Relational Operations 實務上商業應用的 RDBMS 不能使用 Relational Algebra 操作,因此在此段落我們會定義 Extended Relational Operations 以表達這些需求,這些功能可以增強 Relational Algebra 的表達能力,新增的功能共有五項: - Generalized Projection - Aggregate Function - Recursive Closure Operations - Outer Join - Outer Union Join ### Generalized Projection Projection Operation 的擴展讓 Projection 可以使用以 Attribute 為輸入的 Function,通常以 $\pi_{F_1,F_2,F_3...F_n}(R)$ 表示,Function 之中的操作可以有 Arthmetic Operator and Constant E.g. Employee(ID, Salary, Deduction, Years_Serviced),若想求出各員工的 Net Salary、Bonus、Tax,則以 $REPORT = \rho_{ID,\ Net Salary,\ Bonus,\ Tax}(\pi_{ID, Salary\ -\ Deduction,\ 2000\ *\ Years\_Serviced,\ 0.2\ *\ Salary})(EMPLOYEE)$ 這個 Generalized Projection表示 ### Aggregate Function Aggregate Function 即為類似 Excel 中的 SUM、AVG、COUNT、MAX、MIN... 等,用於輸入一組 Relation,但輸出並非 Relation,而是 Value,這與舊有的 Relational Algebra 不同 Aggregate Function Operation 通常以 $_{grouping\_attributes}F_{function\_list}(R)$ 表示,Grouping Attribute 代表要以那個 Attribute 進行 Grouping,Function_list 的元素為 <Func, Attr>,Func 代表 Aggregate Function Name,Attr 則代表該 Function 所需作為參數的 Attribute 該函數以 Relations 作為輸入,以 Grouping Attribute 分組後,分別依據各 Aggregate Function 所需的 Attribute 分別輸入後的輸出的 Value 再組成 Relations 後輸出 E.g. 若我想得到所有員工數量以及平均薪資,則 Aggregate Function 可表示為:$F_{COUNT_{employee}, AVG_{salary}}(R)$ E.g. 若我想得到各部門的員工數量以及平均薪資,則 Aggregate Function 可表示為:$_{departmentID}F_{COUNT_{employee}, AVG_{salary}}(R)$ # MySQL ### Software Bundle 建立資料庫後若要應用,可能會用於架設網站、手機應用程式等等,因此會需要多種軟體、程式語言等交互使用,而發展成一個生態系,而這些軟體、程式語言要分開安裝過於麻煩,因此我們常常會用組合包的方式去快速建立環境,而這些組合包主流有以下幾類: - XAMPP:X(意旨跨平台)、Apache、MariaDB、Php、Perl - MAMP:MacOS、Apache、MySQL、PHP、Python、Perl - LAMP:Linux、Apache、MySQL、Php - WAMP:Winodws、Apache、MySQL、Php 原則上命名都是來自使用的語言、軟體、平台的首字元組成,但組合包中也不會僅僅只含有這些東西,例如 MAMP 的 Web-Server 除了 Apache 以外也含有 Nginx ### Collation 指 Database 將資料 Sorting 的方式,可分為以下幾種: - Case Sensetivity(CS) 區分大小寫,如果是 Case Insensitive(CI)的話 A、a 在排序或者查詢時就會被視為相同,都會被一起查詢到 - Accent Sensitivity(AS) 代表的是腔調上的差別,a 跟 a、o 跟 o 在腔調上是相同的,那查詢時是要視為相同,反之也有 Accent Insensitive(AI) - Kana Sensitivity(KS) 日文中的片假名與平假名如果被視為相同,那就是 Kana Insensitive(KI),反之就是 Kane Sensitive(KS) - Width Sensitivity(WS) 當半形與全型被視為相同(A跟A),就是Width Insensitive(WI),反之就是 Width Sensitive(WS) ### Comments MySQL 共有三種註解方式: - 以 # 開頭直到行尾 - 以 -- 開頭直到行尾 - 以 /* */ 開頭及結尾,可多行註解 ### Type Table 的各個 Column 中通常使用的各種型別: - Int:整數 - Decimal(m, n):即浮點數,m 代表總共有幾位數,n 代表有幾位小數 - Char(n):固定長度字串,n 代表最多能存放多少字元 - Varchar(n):不定長度字串,n 代表最多能存放多少字元 - Blob:Binary Large Object:用於存放圖片、影片、檔案 - Date:紀錄日期 - TimeStamp:紀錄時間 ### DDL Data Definition Language 此類指令針對 Database、Table、View 的定義進行建立、修改、刪除 ||Databases |Table|View| |---|---|---|---| |Create|Create Database|Create Table|Create View| |Alter|Alter Database|Alter Table|Alter View| |Drop|Drop Database|Drop Table|Drop View| 符號說明: - \{ | \}:代表必填,且擇一即可 - \[ | \]:代表選填,且擇一即可,也可不選 ```sql -- Database -- 以下指令的 DATABASE 這個 Keyword 都可改為使用 SCHEMA CREATE DATABASE [IF NOT EXISTS] `Database_Name`; -- 建立 DATABASE,如果沒有加上 IF NOT EXISTS 且已經存在該 Database_Name,則會產生錯誤 ALTER DATABASE `Database_Name` [CHARACTER SET `Character_Set_Name`] [COLLATE `Collation_Name`]; -- 修改 DATABASE,並且可修改它所使用的 Character_Set 以及 Collation DROP DATABASE [IF EXISTS] `Database_Name`; -- 刪除 DATABASE,如果沒有加上 IF EXISTS 且不存在該 Database_Name,則會產生錯誤 ``` ```sql -- Table CREATE TABLE [IF NOT EXISTS] `Table_Name` ( `Column_Name` {Type | Domain} [NULL | NOT NULL] [DEFUALT Default_Value] [AUTO INCREAMENT] ..., ..., ... PRIMARY KEY (Column_Name_Set) UNIQUE (Column_Name_Set) FOREIGN KEY (Column_Name_Set) Reference `Table_Name` (Attribute_Name_Set ) [ON DELETE CASCADE|RESTRICT|NO ACTION|SET NULL] [ON UPDATE CASCADE|RESTRICT|NO ACTION|SET NULL] ); -- 建立 Table,建立 Column 的部分可以有多筆,使用逗號分隔 ALTER TABLE `Table_Name` ( [ ADD `Column_Name` {Type | Domain} [NULL | NOT NULL] [Default_Value] [Integral_Constraint] | MODIFY `Column_Name` {Type | Domain} [NULL | NOT NULL] [Default_Value] [Integral_Constraint] | DROP [COLUMN] `Column_Name` -- DROP 後面的 COLUMN 可加可不加 ] ) -- 修改 Table DROP TABLE [IF EXISTS] `Table_Name` -- 刪除 Table ``` ```sql -- View VIEW 待補 ``` ### DML Data Manimuplate Language 針對 Table 操作的語言,將其之中的 Record 做增刪改查,因此主要有以下四種指令: - INSERT - UPDATE - DELETE - SELECT ```sql INSERT INTO `Table_Name` VALUES (<Sequence_of_Record_Value> | <Select_Command>), ..., ..., ... ; -- 對 Table_Name 新增資料,Values 後面可接上多筆 Data 使用逗號分隔 UPDATE `Table_Name` SET {<`Column_Name`> = <Value>} [WHERE <Condition>]; -- 對 Table_Name 更新資料 DELETE FROM `Table_Name` [WHERE <Condition>] -- 對 Table_Name 刪除資料 SELECT `Sequence_of_Columns_Name` --- 欲投影的欄位名稱 FROM `Table_Name` [WHERE <Condition>] [GROUP BY <Sequence_of_Columns_Name>] [HAVING] [ORDER BY <Columns_Name>[ASC|DESC]] [LIMIT Number] --- 限制顯示的數量 -- 對 Table_Name 查詢資料 ``` ### Join 可以將兩個表格連接在一起 ```sql Select * From `employee` Join `branch` on `emp_id` = `manager_id` # 選擇 employee 的 Table Join branch 以 emp_id = manager_id 作為媒介 ``` Join 實際上分為三種,一般 Join、Left Join、Right Join,一般 Join 就是指兩邊 Join 的表格一定要左右互相匹配才會 Print 出來,Left Join 則代表左邊的資料會全部 Print 出來,但是右邊的要有匹配到才會,否則就顯示空,Right Join 也是同理 ```sql select * from `employee` left join `branch` on `emp_id`=`manager_id`; # 將 employee 的資料全部 Print 出來,並且有匹配到的 branch 資料也 Print 出來,沒有則 Null ``` ### Subquery 假設你要使用一個查詢結果再次查詢,那該怎麼做 ```sql Select `name` From `employee` Where `emp_id` = ???; Select `manager_id` From `branch` Where `branch_name` = '研發'; # 假設我要以第二行查詢到 manager_id,然後我又要使用它做為第一行的查詢參數 # 我就可以使用以下的子查詢語法 Select `name` From `employee` Where `emp_id`=( Select `manager_id` From `branch` Where `branch_name` = '研發' ); ``` ### On Delete、On Update 當 Table A 透過 Foreign Key 對外連接上 Table B 的 Primary Key 時,即 Table A 的資料依賴於 Table B 的 Primary Key,若 Table B 的 Primary Key 不存在某項資料,則 Table A 的 Foreign Key 必定也不包含該資料,因此 Table B 的 Primary Key 的修改會影響 Table A,而設定 On Delete、On Update 的設定即是決定當 Table B 的 Primary Key Update、Delete 時,要如何同步 Table A 的 Record,以達成 Referential Constraint ```sql FOREIGN KEY ('manager_id') REFERENCE `employee`(`employee_id`) ON DELETE SET NULL -- 當 employee_id 被刪除時,則 manager_id 欄位就設置為 NULL FOREIGN KEY ('manager_id') REFEREMCE `employee`(`employee_id`) ON DELETE CASCADE -- 當 employee_id 被刪除時,則其他有對應到 employee_id 的 Record 會整筆刪除 ``` ### Syntax Convention - 使用大寫字表示 Keyword - 使用小寫字表示 User-Defined Word - Command 的結尾都要加上分號 - 字串通常會需要使用 \` 括起來,Ex:Create Database \`sql_tutorial\`,使用該符號可以避免名稱與 Keyword 衝突 - 通常 Keywork 會習慣以大寫字體表示,但實際上無論大小寫都是可以運作的 - INNER JOIN 通常會省略 INNER,只寫成 FROM r1 JOIN r2 ON...,另一種寫法則是只用逗號隔開多個 Table,然後用 WHERE 取代 ON,寫成 FROM r1, r2 WHERE ...,但由於語意問題,雖然說 JOIN 可以使用 FROM WHERE 做到,但為了語意上直覺,建議使用 FROM JOIN ON 會比較好,WHERE 才是真的邏輯上需要的判斷式 - LEFT/RIGHT OUTER JOIN 通常會省略 OUTER,寫成 LEFT/RIGHT JOIN,而大多數情況下會用 LEFT JOIN,只要把 Table 的順序對調,RIGHT JOIN 就會變成 LEFT JOIN,因此實務上較少會用 RIGHT JOIN ### Execution Order of SQL 1. FROM:指定所需表格,如果有兩個或兩個表格以上,則先進行乘積再 JOIN 2. ON:透過 ON 所含的 Table 的條件進行篩選 3. JOIN:Join Table 4. WHERE:透過 Condition 篩選 Record,一般都不包含 Aggregate Function 5. GROUP BY:根據指定欄位進行分群 6. HAVING:找出符合指定條件的所有群組,都一定要是使用 Aggregate Function 7. SELECT:指定欄位 Projection 8. DISTINCT:指定為列出不重複的 Record 9. ORDER BY:排序 10. LIMIT IN:指定只列出 N 筆紀錄 # Transaction ### Syntax savepoint 中斷點 ### Memo - Single-Valued Attribute 使用橢圓形表示 - Multi-Valued Attributes 使用雙圈橢圓形表示 - Derived Attributes 使用虛線橢圓形表示 - Entity Set 使用長方形表示 - Relationship Set 使用菱形表示 - Unique Attribute 使用底線表示,因此 Primary Key 必定有底線 - Partial Key 使用底線虛線表示 - Partial Participation 使用 Single Line 表示關係 - Total Participation 使用 Double Line 表示關係 - 資料庫系統 Index 是從 1 開始而不是 0,寫程式處理時須注意 - Cardinalty 描述 Relationship 之間連結的最大的可能性 - Relation Schema 以及 Relation 的差異相當於 Class 與 Instance 的差異 - Weak Entities 一定是 Total Participation - 水平的資料即為 Entity,又可稱作 Row、Tuple、Record - 垂直的屬性即為 Attributes,又可稱作 Column、Field - Relation 中每個 Attribute 所有允許的值而成的 Set 稱做 Domain - CREATE DATABASE test DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4__unicode_ci:創建 Table 的時候順便設定之後 Table 預設的 Charset 以及 Collation - Table 又可稱作 Relation,且 Relation Model 與 Entity Relation Model 的 Relation 意義不相同,前者是指 Table,後者是指 Entity 之間的關係,前者的 Relation 同時是後者的 Entity 以及 Relation - A Left Join B 的數量不一定等於 A,A Right Join B 的數量也不一定等於 B - 在 ERM 之中 Relationship 指的是 Entity 之間的關系,在 Relation Model 中 Relation 指的是 Table 也對應到 ERM 的 Entity 以及 Relationship - 當 Modify 欄位時,如果修改時有任意 Record 被 Turncate 則視為錯誤,例如 address CHAR(10) 被修改成 CHAR(6) 時,有任意的 Record address 超過六個字元即錯誤 - 如果某個 Column 同時是 PK,又是對外的 FK,則該 FK 對外的 Referential Integraity 的 ON DELETE 處理不能是 SET NULL,若為 NULL 則違反 PK,會導致錯誤 - 要檢查某個欄位是否是 NULL,必須要用 IS / IS NOT 檢查,例如 age IS NULL,不可使用等號! - NATURAL JOIN 的時候相同的欄位會被刪除 - 一對多、多對一的 relationship 要將關聯的欄位加在多的地方 - AS 可以省略 - 多值屬性實作成 Table 通常為多對多,例如在 Employee 的描述 Expertise 的 Column 中可能員工 A、B 都會有會計專長,且會計專長也會對應到多位員工,因此為 M:N,但如果是對應到 Unique 的,例如員工對到手機號碼,雖然為多值屬性,但反而變成 M:1 了 - BEGIN TRANSACTION COMMMIT 若沒有包含在 TRANSACTION BLOCK 中,每句 statement 視為一個獨立的 transaction - SQL statement 中注意不要有全形空白 看起來是對的,但實際上是錯的 - 網址的構成:scheme:[//[user:password@]host[:port]][/]path[?query][#fragment],因此不一定需要 set username 以及 set password,scheme 通訊協議 ?query 參數,以 Key-Value 呈現,且以 & 分隔,fragment 片段,用法是在 # 號後面加上文字,類似書籤,會導向特定錨點,HTML 來說,會定到特定瀏覽的位置,對影片來說,會跳到對應的時間點 - table 要 union 只要欄位數量相同即可,即使欄位名稱不同也可以 - 使用 @ 代表使用者變數 而不是系統變數 ![Join](https://i.imgur.com/VGOCD93.png) ### Reference https://www.mysql.tw/2018/05/sqlrelational-algebra.html http://120.105.184.250/lwcheng/961Access/textbook/kidpps/CHAP05.pdf https://www.lis.ntu.edu.tw/~khchen/course/db/db2007/DBCh06RAlgebra.pdf https://www.youtube.com/watch?v=OMwgGL3lHlI&list=PLBlnK6fEyqRiyryTrbKHX1Sh9luYI0dhX https://www.books.com.tw/products/0010720461