---
# System prepended metadata

title: 建資料庫

---

## 1. 資料庫介紹
資料庫是用來儲存和管理資料的工具，常見的類型有以下幾種：

* **SQLite**

    一種輕量級的嵌入式資料庫，適合小型專案或單機應用。
不需要伺服器，資料直接存儲在檔案中。
優點：簡單易用、無需安裝伺服器、佔用資源少。
用途：手機應用、桌面應用、快速測試。
* **MySQL**

    一種關聯式資料庫管理系統，需要伺服器支持。
    適合中大型專案，支援多用戶並發操作。
    優點：穩定、性能優越、廣泛支持。
    用途：網站後端、企業應用系統。
* **NoSQL（如 MongoDB）**

    非關聯式資料庫，使用文件、鍵值對等格式儲存資料。
    適合處理結構多變或非結構化資料。
    優點：擴展性高、靈活性強。
    用途：即時數據分析、大規模分散式應用。

## 2. SQLite 資料庫結構

* **資料庫 (Database)**
SQLite 的資料庫是一個單一的檔案，所有資料都儲存在這個檔案中
ex: **my_database.db**

    特點：資料庫檔案可以直接拷貝、備份，跨平台兼容性強。
* **資料表 (Table)**
資料表是儲存數據的核心單位，每個資料表類似於一個 **Excel 的工作表**，由行 (row) 和列 (column) 組成。

    結構：
    列 (Column)：定義資料的屬性或欄位，例如 id, name, email。
    行 (Row)：表示具體的數據，例如一名用戶的資訊。
![image](https://hackmd.io/_uploads/r1m3bK8V1l.png)


* **標題的資料型態** (Data Types)

    **INTEGER**：整數，例如 1, 42。
    **REAL**：浮點數，例如 3.14, 2.71。
    **TEXT**：文字，例如 'Hello', 'SQLite'。
    **BLOB**：二進制資料，例如圖片、音頻文件。
    **NULL**：空值。
* **主鍵 (Primary Key)**
每個資料表通常會有一個Primary Key來唯一標識每一行數據。SQLite 支援自動生成主鍵值。
ex: 上面圖片中的**id**

## 3.創建資料庫


```
import sqlite3

# 連接 SQLite 資料庫（若無檔案則會自動建立）
conn = sqlite3.connect("sample.db")
cursor = conn.cursor()

# 建立資料表
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL
)
""")
```
執行後可以看到資料夾下多了一個sample.db
![image](https://hackmd.io/_uploads/H1KDmK8V1g.png)

### DB Browser for SQLite
一般來說需要在終端機輸入sqlite的語法才能查看資料庫的內容
但如果使用DB Browser就可以直接將資料庫可視化並做一些操作
https://sqlitebrowser.org/dl/

### 點選開啟資料庫後選擇剛才新增的db
![image](https://hackmd.io/_uploads/SJpLVKU4yx.png)

### 點選"瀏覽資料"後就可以看到我們剛才新增的資料庫內容
但因為一開始只有先將標題的名字和資料型態定義好，內容需要再依據自己想要的資料做存放
![image](https://hackmd.io/_uploads/rywqNtUEyg.png)

## 4. 讀取excel資料到資料庫
### excel中的資料:
![image](https://hackmd.io/_uploads/BkgZDPK8EJl.png)


### 將excel和db的名字和路徑改成自己的樣子
Ex:
![image](https://hackmd.io/_uploads/Sys0wtUNye.png)

先在終端機中安裝pandas
`pip install pandas openpyxl`

```
import sqlite3
import pandas as pd

# 讀取 Excel 檔案
excel_file = "sample.xlsx"
df = pd.read_excel(excel_file)

# 連接 SQLite 資料庫（若無檔案則會自動建立）
conn = sqlite3.connect("sample.db")
cursor = conn.cursor()

# 建立資料表
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL
)
""")

# 插入資料到資料表
for _, row in df.iterrows():
    cursor.execute(
        """
    INSERT OR IGNORE INTO users (id, name, email)
    VALUES (?, ?, ?)
    """,
        (row["ID"], row["Name"], row["Email"]),
    )

# 確認變更
conn.commit()
conn.close()

print("資料已成功插入資料庫")
```
最後到DB Brower中可以看到資料已經新增上去了:
如果沒有的話，可以按一下重新整理的按鈕
![image](https://hackmd.io/_uploads/H1wdqKUVyg.png)
