---
# System prepended metadata

title: SQL 2
tags: [Database]

---

###### tags: `Database`
# SQL 2

<font color=red>ACID</font>

刪除資料問題解決方法
- 拒絕刪除
- 連動其他連結資料刪除
- 設定指向此資料的元素為 NULL

Update 問題
- 沒改到 primary/foreign key 大多沒事
- 如改到，比照刪除步驟，

---

## Relation Model 符號

### - 條件篩選

:::warning
進行條件篩選，相當於 `WHERE`
$$\sigma_{<slelect\_condition>}(R)$$
:::
:::info
ex : 
$\sigma_{salary>100\ and \ id=10}(employees)$
:::

<br>

### - 選擇 Column

:::warning
取 column，相當於 `SELECT FROM`

$$\pi_{<column>}(R)$$

:::
:::info
ex :
$\pi_{salary,id,name}(employees)$
:::

<br>

### - 連結其他 Table

:::warning
$[\ \bowtie\ ]$ 用來連結其他的 Table 資訊，相當於 `JOIN [Table_B] ON (col_a=col_b)`

$$(R_A)\bowtie_{col\_a=col\_b}(R_B)$$

:::

:::info
ex :
$(EMPLOYEES) \bowtie_{department\_id=department\_id} (DEPARTMENT)$
:::

<br>

### - 計算統計值 & Group By

:::warning
利用 function 可以計算統計值，
也可以加上 Group By 計算 group 過後的統計值
( 如不用 group by 可不加  )，相當於 `SELECT 統計值`、`GROUP BY`

$$_{<group \ 元素>}F_{<function\ \ list>}(R)$$
:::

:::info
$\leftarrow F_{\ MIN\ salary,\ AVG\ salary\ }(EMPLOYEES)$
:::

<br>

### - 子 Table 設置

:::warning
利用 $[\leftarrow]$ 代表將 SELECT 出的元素當作一個子表格，放置到變數中

$$子表格名稱\  \leftarrow\  <SELECT\ Attribute>$$

:::

:::info
ex : 
$EMDE \leftarrow (EMPLOYEES) \bowtie_{department\_id=department\_id} (DEPARTMENT)$
:::


---

<br>

## 資料庫的問題
### (1). Redundant 資訊 
- **Refundant 資訊** : 指兩 Attribute 包含相同意義的資訊
// ex : 居住地區 vs 郵遞區號

### (2). Update Anomalies
- **Update Anomalies** : 指在更新資料的時候發生的錯誤
    - Insert
    - Deletion
    - Modification
    
```
ex : KK 與 JJ 共用一支手機號碼，如果想刪除 KK 手機號碼資料，
     在查找做刪除時，可能會不小心刪除到 JJ 的資料
```

### (3). NULL 值
- **NULL 值** : 就是資料中包含 NULL，會浪費空間且無法對此 attribute 用 Join
- **避免方法** : 避免使用有 NULL 值的資料，如無法避免則不要讓此 attribute 代表的元素

### (4). Spurious Tuples

- **Spurious Tuples** : 指在對兩 Relation(Table) 做 Join 後，出現了因錯誤匹配而產生的多餘資料 - [詳細解說](https://www.geeksforgeeks.org/spurious-tuples-in-dbms/)
- **避免方法** : 避免 attribute 有相同重複的資料，因為當對重複資料做 Join，就很容易出現 Spurious Tuples

<br>

## Functional Dependency

- **用途** : 
    - 方便用來分析 Relation 中的關係
    - 可以容易的看出上述的"資料庫的問題"


- **定義** : 定義一個關係要找到一個 X 集合可以去對應到一個 Y 集合

$$X\rightarrow Y$$

```
ex : X={學號} -> Y={姓名、生日}
     X={學號、課程代碼} -> Y={分數}
```

---

<br>

## Normalize

**用途** : 可以利用正規化資料庫，來解決上述的"資料庫的問題"

### (1). Key 介紹 : 

- **Super Key** : 
具有 [唯一性] 的屬性集合，在 Tabel 中不會有重複的值
ex : {學號ID}、{學號+修課代碼}、{學號+姓名}

- **Candidate Key** : 
是 Super Key 的一種，但還要符合 [最小性]，就是不能有多餘的屬性
ex : {學號+姓名} 不是 Candidate Key，因為姓名是多餘的屬性

- **Primary Key** : 
算一種 Candidate Key 但每個 Tabel 只有一個，通常會要有以下條件
    - 不可有 NULL
    - 不太會改變。 ex : 身分證字號，但像住址可能會改變就無法做 Primary Key
    
    
- **Alternate Key** : 
通常不是 Primary Key 的 Candidate Key 就算是 Alternate Key

- **Foreign Key** : 
Tabel 中用來連結其他 Tabel 的 Key，
通常 Foreign Key 會是其他 Tabel 的 Primary Key

<br>

> <font color=blue>### Candidate 和 Primary Key 是相對性質的 ###
> ex : {學號+修課代碼} 對某些資料可能是 Candidate Key，但有些資料可能只用 {學號}
> </font>

<br>

### (2). 第一正規化 [ 1NF ]
- **定義** : 將有多個值的 attribute 做處理

- **方法** : 
    - 方法一 : 直接將每個值分割成一筆資料 Tuple，
但這個方法容易造成前面說的 "Spurious Tuples"
    - 方法二 : 將多值的資料分割出去為一個新的 Table

:::info
![](https://i.imgur.com/vwAL0yW.png)
:::
<br>
    
### (3). 第二正規化 [ 2NF ]

- **定義** : 消除 Candidate Key 的部分相依，就是移除多餘 Candidate Key 對應資料，某資料可能只需要 Candidate Key 集合中的其中一個 Key，
對他來說其餘都是多餘的 Key，所以要分割出去

- **方法** : 將相對應的 Candidate Key 與資料分隔出去

:::info
![](https://i.imgur.com/tBMrzpc.png)
:::
<br>

### (4). 第三正規化 [ 3NF ]

- **定義** : 消除 transitively dependency (傳遞相依)，
"傳遞相關"就是和非 Candidate Key 的 attribute 間的相關
( 但此關係是與 Candidate Key 間接相關 **Candi->X, X->Y** )

- **方法** : 把除 Candidate Key 以外的相關資料分割為新的 Table，
但與 Candidate Key 間接相關的那個 attribute 還是會保留

:::info
![](https://i.imgur.com/Mr4qgHu.png =350x200)
:::
<br>

### (5). 第 3.5 正規化 [ 3.5NF ] ( Boyce-Codd NF )

- **定義** : ~~移除叛徒~~，移除非 Key 獲取 Candidate Key 的關係
也就是當今天有非 Candidate Key 可用來得到 Candidate Key 時就要移除

- **方法** : 將非 Key 獲取 Candidate Key 的關係，分割成新的 Table

:::info
![](https://i.imgur.com/nTN3hUi.png)

:::
<br>
