---
# System prepended metadata

title: 超入門資料庫教學

---

# 超入門資料庫教學
### 資料庫的四種語言
+ DML
  + INSERT, UPDATE, DELETE
+ DDL
  + CREATE, ALTER, DROP
+ DCL
  + GRANT, REVOKE, COMMIT, ROLLBACK
  + TRANSACTION 概念
+ DQL
  + SELECT
  + 輔助指令：GROUP BY, ORDER BY, WHERE, DISTINCT, COUNT... 等等
  + 進階查詢：INNER JOIN, LEFT JOIN, RIGHT JOIN
  ![](https://i.imgur.com/7A5ERr0.png)

### SQL vs ORM
+ ORM (Object Relational Mapping)，在『資料庫』和『 Model』兩者之間做關聯，讓使用者可以用熟悉的程式語言操作資料庫，而不用碰到 SQL
+ 優點
  + 安全性
  + 簡化性
  ```CSharp
  users = User.where(user => user.age == 30)
  ```
  + 通用性
+ 缺點
  + 效能
  + 學習曲線高
  + 複雜查詢維護性低
+ SQL、ORM 我該用哪一個？

### ER Model
### 關聯表的正規化
+ 為何要正規化
  1. 提昇儲存資料與資料庫操作效率
  2. 減少資料異常
  3. 使資料庫維護更容易
+ 正規化的資料庫特性
  1. 欄位唯一性：每個欄位只儲存一項資料
  2. 主關鍵欄位：每筆資料都擁有一個主鍵，來區別這些資料
  3. 功能關聯性：欄位之間的關聯應該要明確
  4. 欄位獨立性：欄位之間不應存在遞移相依

#### 開始正規化
+ 有一張資料表長這樣
![](https://i.imgur.com/Tp6GKTR.png)

+ 第一正規化
  + 一個欄位只能有單一值
  + 消除意義上重複的欄位
  + 決定主鍵

+ 第一正規化後
![](https://i.imgur.com/zMCDswJ.png)


+ 第二正規化：消除部分相依
+ 第二正規化後
![](https://i.imgur.com/hJeUWvd.png)

+ 第三正規化：消除遞移相依
+ 第三正規化後
![](https://i.imgur.com/zR3G7OJ.png)

### 資料表
+ 主鍵
+ 外來鍵
+ 資料類型
+ ISNULL

### 效能調校
+ 索引
+ SARG
+ Query plan

### 牛刀小試
+ 有一個線上課程網站，需要你幫忙開 table，描述如下
> 有很多老師在網站上開了很多堂課程，並且每一堂課都會有很多學生報名，每個學生報名課程的時候都會有訂單資料需要紀錄。