---
# System prepended metadata

title: 第一堂：資料庫基礎與 PostgreSQL 簡介
tags: [2024 後端工程師 - 資料庫體驗營]

---

# 第一堂：資料庫基礎與 PostgreSQL 簡介

* 記得錄影
* [課程簡報連結](https://gamma.app/docs/SQL--23heyix4r93u5u0?__cf_chl_rt_tk=jr37zfbw_UEW72nN4L03IReOzWEHlYt8r3hvkdTIS.c-1732071651-1.0.1.1-9AFcJ.W1zN4qsZEufjwROSSx3OCCrau45yKlRpAkvcQ)


## 什麼是資料庫？

1. 學習資料庫就像是在操作 excel 一樣
2. 各行各業都會使用到資料庫
3. 常見資料庫種類：MySQL、MS SQL、**PostgreSQL**
4. 都共同會用到通識指令「SQL」全名是 **"Structured Query Language"**，中文是「結構化查詢語言」

![Jie-Tu-2024-10-12-Shang-Wu11.15.16](https://hackmd.io/_uploads/HJIvNA9fkx.png)


## 資料庫結構長怎樣？

**不好的版本**

* 王小明 (男) - 住台北市 電話：0912-345-678 備註：常客，VIP會員
* 李美玲小姐 性別 = 女 地址：台北市松山區 Email: lee@example.com 其他：1990年5月15日生

**好的版本**

* 資料表（Table）是整體資料，包含了所有相關的資料
* 欄位（Columns）定義資料的屬性和類型 (Data Type)
* 資料列（Rows）是橫向的資料集合，代表一筆完整資料
![Jie-Tu-2024-10-12-Shang-Wu11.36.06](https://hackmd.io/_uploads/SksHUAcfkx.png)



## 資料庫建立順序

![截圖 2024-11-20 上午11.27.06](https://hackmd.io/_uploads/H1wMvRqMye.png)

### 建立資料表 (Tables)
* [練習用資料庫網站(pg-sql)](https://pg-sql.com/)
``` SQL
CREATE TABLE users (
  name VARCHAR(50),
  email VARCHAR(100), 
  age INTEGER
);
```
**欄位用途：**
1. name: 會員姓名 (字串型別,最長50個字元)
2. email: 會員電子郵件 (字串型別,最長100個字元)
3. age: 會員年齡 (整數型別)

> 記得指令最後要加上分號「;」 來結束整個SQL指令。


**資料型態介紹**：

| 資料型態 | 描述 | 使用情境 | 範例 | 範例欄位 |
|----------|------|----------|-------|----------|
| INTEGER | 整數 | ID、年齡、數量 | 1, 42, -15 | `age INTEGER` |
| VARCHAR(n) | 可變長度字串 | 名稱、描述 | "John Doe" | `name VARCHAR(50)` |
| TIMESTAMP | 日期時間 | 建立/更新時間 | '2024-03-20 15:30:00' | `created_at TIMESTAMP` |
| DECIMAL(p,s) | 精確小數 | 金額計算 | 199.99 | `price DECIMAL(10,2)` |
| BOOLEAN | 真/假值 | 狀態、開關 | true, false | `is_active BOOLEAN` |
| JSON | JSON資料 | 彈性資料結構 | '{"name": "John"}' | `settings JSON` |

> 隨堂小考：考大家是什麼類型？
## 新增多筆資料


```sql
INSERT INTO users (name, email, age)
VALUES ('張小明', 'xiaoming@gmail.com', 25);

INSERT INTO users (name, email, age)
VALUES 
    ('張小明', 'xiaoming@gmail.com', 25),
    ('王大華', 'dahua@gmail.com', 30),
    ('林美玲', 'meiling@gmail.com', 28);
```

## 查詢多個欄位
```sql
SELECT * FROM users;
```
## 查詢特定欄位（只要姓名和年齡）
```sql 
SELECT name, age FROM users;
```
## 計算退休年數的查詢
```sql
SELECT 
    name AS 姓名,
    age AS 現在年齡,
    65 - age AS 距離退休年數
FROM users;
```
> 隨堂小考：我想顯示姓名、歲數的欄位
## 中場休息
* 抽書~
* 每日任務


## where 尋找資料

3C 電商網站模擬資料：

| name | price | discount_price | stock | category | status |
|------|--------|----------------|--------|-----------|---------|
| iPhone 16 | 25000 | 23000 | 50 | 3C | active |
| AirPods | 5000 | 5000 | 5 | 3C | inactive |
| iPad | 18000 | 16000 | 25 | 3C | active |
| 充電線 | 500 | 500 | 100 | 配件 | active |
| 手機殼 | 300 | 250 | 30 | 配件 | active |
| 螢幕保護貼 | 200 | 180 | 150 | 配件 | active |
| 手機支架 | 400 | 400 | 0 | 配件 | inactive |
```sql
-- 商品資料表
CREATE TABLE products (
    name VARCHAR(100),           -- 商品名稱
    price INTEGER,              -- 原價
    discount_price INTEGER,      -- 折扣價
    stock INTEGER,              -- 庫存數量
    category VARCHAR(50),        -- 商品類別
    status VARCHAR(20)          -- 商品狀態（上架、下架）
);

INSERT INTO products (name, price, discount_price, stock, category, status) VALUES
   ('iPhone 16', 25000, 23000, 50, '3C', 'active'),
   ('AirPods', 5000, 5000, 5, '3C', 'inactive'),
   ('iPad', 18000, 16000, 25, '3C', 'active'),
   ('充電線', 500, 500, 100, '配件', 'active'),
   ('手機殼', 300, 250, 30, '配件', 'active'),
   ('螢幕保護貼', 200, 180, 150, '配件', 'active'),
   ('手機支架', 400, 400, 0, '配件', 'inactive');
```
## where 資料庫指令

Where 語法

我想查找 3C 類別的產品
```sql
SELECT name, price
FROM products 
WHERE category = '3C';
```
![截圖 2024-11-20 下午12.13.09](https://hackmd.io/_uploads/rkMyz1sGye.png)
> 隨堂小考：我想查找已上架的產品
## 比較運算子



| 運算子 | 意義 | 範例 |
|--------|------|------|
| = | 等於 | WHERE price = 100 |
| > | 大於 | WHERE price > 100 |
| < | 小於 | WHERE price < 100 |
| >= | 大於等於 | WHERE price >= 100 |
| <= | 小於等於 | WHERE price <= 100 |




情境：想知道哪些商品快沒貨了，有沒有庫存小於 50 的產品？
```sql
SELECT name, stock
FROM products 
WHERE stock < 50;
```
## 邏輯運算子

| 運算子 | 意義 | 範例 |
|--------|------|------|
| AND | 且，兩個條件都要成立 | WHERE category = '3C' AND price > 1000 |
| OR | 或，其中一個條件成立 | WHERE category = '3C' OR category = '配件' |



**情境：尋找已上架的 3C 商品**
```sql
SELECT name, price, stock 
FROM products 
WHERE status = 'active' 
AND category = '3C';
```
**情境：尋找下架或無庫存商品**
```sql
SELECT name, status, stock
FROM products 
WHERE status = 'inactive' 
  OR stock = 0;
```
> 隨堂小考：我想查找 3C 類別大於 1000 的產品

## 刪除、更新

**更新：**
1. 調整特定商品的價格
2. 更新庫存：增加庫存數量
```sql
-- 1
UPDATE products
SET price = 28000
WHERE name = 'iPhone 16';
-- 1
UPDATE products
SET stock = stock + 50, name = '充電線-修正'
WHERE name = '充電線';
```
**刪除：**
1. 單筆刪除：刪除特定商品
2. 條件刪除：刪除類別為 3C 的商品
3. 多重條件刪除：刪除沒庫存且已下架的商品 


```sql
-- 1
DELETE FROM products
WHERE name = 'iPhone 16';
-- 2
DELETE FROM products
WHERE category = '3C';
-- 3

DELETE FROM products
WHERE 
  stock = 0
AND
  status = 'inactive';
```

## 22:00 活動報名連結


* [實體同學會報名處](https://chalk-freedom-ec6.notion.site/2025-6fd4405a6e80411bada8c1c0dcc872c5)


:::spoiler 報名預期欄位：
![截圖 2024-11-20 下午12.07.51](https://hackmd.io/_uploads/ByVTlkszyl.png)
![截圖 2024-11-20 下午12.07.54](https://hackmd.io/_uploads/HkEaeyizyx.png)

:::