---
# System prepended metadata

title: Database Management System

---

# 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跟Ａ），就是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 Ｏrder 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