[Hexschool Backend experience camp] — 資料庫體驗營

Introduction & 前言

Banner

小節作業於摘要第五點,如果只想參照作業的部分可以快轉跳至 小節作業:家具店的菜雞銷售奇遇記

隔了好一段時間沒有自我進修,趁著最近六角學院在特價課程,去摸一下後端世界的樣子。

接下來會有幾篇紀錄上課的過程,以及中間的一些心得、作業筆記。

整篇文章是筆者自己的心得,如果文內有錯誤的地方,還請盡情指出。

Schedule

課程總共會有四堂直播課,其中不包含學院已經上傳的課程影片,約莫 50 個小短片。

Videos

本篇會從零開始記錄筆記,可能會分成幾篇紀錄,這篇會是前 25% 的部分。


Summary & 摘要

如果需要觀看小節作業,可以跳過前四章

另外本篇文章還不會實際操作到真實 DB,可以先透過線上網站去練習:線上練習網站 PG SQL

  1. 資料庫簡介
  2. 建立 SQL 資料表
  3. 資料的 CRUD
  4. 資料庫註解
  5. 小節作業:家具店的菜雞銷售奇遇記

資料庫簡介

資料庫組成可大致分為

  • Table(資料表) -> 整體資料,通常會是一個類型,如 users
  • Columns(欄位) -> 定義資料的屬性跟類型 Data Type
  • Rows(資料列) -> 是橫向單筆資料的集合,代表一整筆完整資料,例如 users 表,定義了 編號、用戶姓氏、名字、性別 等等四個欄位的 Data Type,那一整筆資料舉例就是 1, 王, 小明, 男

操作資料庫可使用 SQL(Structured Query Language) 語法,全名是『結構化查詢語言』,目前較多人使用為

  • PostgreSQL
  • MySQL
  • MS SQL Server
  • Oracle

建立 SQL 資料表

資料庫三劍客,透過下列方式,去定義出三劍客,就可以創建出資料表

1
2
3
4
5
CREATE TABLE users (
name VARCHAR(50),
email VARCHAR(100),
age INTEGER
)

Note:可透過 線上練習網站 PG SQL 嘗試建立

Excel Example

三劍客使用 Excel 舉例的話就是 Sheet 代表 TableColumnRow 的意思都一樣


資料的 CRUD

資料庫執行順序為下

  1. FROM 資料表名稱 -> 2. WHERE 篩選條件 -> 3. SELECT 欄位名稱

而資料庫類型 (Data Type) 常用有幾種

資料型態 描述 使用情境 範例 範例欄位
INTEGER 整數 ID、年齡、數量 1, 20, 100 age INTEGER
VARCHAR(n) 可辨長度字串 名稱、描述、普通文字欄位 “Rex Hung” name VARCHAR(50)
TIMESTAMP 日期時間 時間格式都適用 ‘2024-11-20 09:00:00 created_at TIMESTAMP
DECIMAL(p,s) 精確小數 金額、需要存放精確小數點的情況 3.141596, 2014.11 price DECIMAL(10,2)
BOOLEAN 真/假值、布林 狀態、開關 true, false is_active BOOLEAN
JSON JSON 資料 彈性資料結構 ‘{“name”: “Rex”}’ settings JSON

Note:更多可參考 w3school

INSERT 插入資料

字串需要單引號括起來

1
2
INSERT INTO users(name, email, age)
VALUES('王大明','abc1@gmail.com',18);

插入多筆資料

1
2
3
4
5
INSERT INTO users(name, email, age)
VALUES
('王大明','abc1@gmail.com',18),
('張小明','abc2@gmail.com',28),
('菜小明','abc3@gmail.com',38);

SELECT 查詢資料

  1. 普通查詢
1
2
3
4
— 查詢所有欄位
SELECT * FROM users;
— 查詢特定欄位
SELECT name, age FROM users;
  1. 別名查詢(AS)
1
2
3
4
5
6
7
8
9
10
11
12
— Columns 轉換為自定義別名查詢
SELECT
name AS 姓名,
age AS 年齡
FROM users;

— 透過 AS 使用計算,最終新欄位會回傳計算結果
SELECT
name AS 姓名,
age AS 年齡,
100 - age AS 距離成為人瑞年紀
FROM users;
  1. 篩出想要的資料

篩選資料(WHERE)

1
2
3
SELECT name,price
FROM products
WHERE category = '3C';

比較運算值

運算子 意義 範例
= 等於 WHERE price = 100
> 大於 WHERE price > 100
< 小於 WHERE price < 100
>= 大於等於 WHERE price >= 100
<= 小於等於 WHERE price <= 100
1
2
3
SELECT *
FROM products
WHERE price <= 500;

Note: 更多比較運算子可參考 Microsoft Ignite

邏輯運算子

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

1
2
3
4
SELECT name, price, stock 
FROM products
WHERE status = 'active'
AND category = '3C';

Note: 更多邏輯運算子可參考 Microsoft Ignite

邏輯運算子的延伸集合與範圍運算子

運算子 意義 範例
BETWEEN 在指定範圍內 WHERE price BETWEEN 100 AND 500
IN 包含在列出的值中 WHERE category = ‘3C’ OR category = ‘配件’
1
2
SELECT * FROM products
WHERE discount_price BETWEEN 500 AND 1000;

UPDATE 更新欄位

UPDATE 資料表名稱 3
SET 欄位名稱 1
WHERE 篩選條件 2

1
2
3
4
5
UPDATE products
SET
price = 999999,
name = ‘iPhone 16 PLUS’
WHERE name = 'iPhone 16';

DELETE 刪除欄位

DELETE 資料表名稱 3
FROM 欄位名稱 1
WHERE 篩選條件 2

1
2
DELETE FROM products
WHERE name = 'iPad';

資料庫註解

資料庫可以透過使用兩個 - 去進行註解,就如同我們在 HTML 上也會使用註解一樣

1
2
3
4
5
6
7
8
9
10
11
— 這是一行註解,用來解釋以下這段 SQL 在做什麼
SELECT //...下略


/*
這是一段多行註解,下面會說明一些事項
1. 查詢xxx
2. 計算 xxx
3. 設定 xxx,需要注意 xxx
*/
SELECT //...下略

小節作業:家具店的菜雞銷售奇遇記

Discord Chat

因為小節內有作業,作業會回覆到六角學院的 Discord,也能對下一個同學發問,這邊先貼上小節作業的回答

小節作業回答

情境 1:單品查詢
客人:「這張北歐風雙人沙發多少錢?」
小美想查:想找到這張沙發的價格和庫存

A: 39900

1
2
3
4
5
6
7
SELECT
name,
price
FROM
products
WHERE
name = '北歐風雙人沙發';

情境 2:價格比較
客人:「請列出 5000 元以下的櫃子有哪些?」
小美想查:找出櫃子類且價格在 5000 以下的商品

A: 簡約書櫃, 玄關鞋櫃

1
2
3
4
5
6
7
8
SELECT
name,
price
FROM
products
WHERE
category IN('櫃子')
AND price < 5000;

情境 3:庫存確認
客人:「日式雙人床架還有貨嗎?」
小美想查:確認日式雙人床架的庫存狀況

A: 剩下 6 個

1
2
3
4
5
6
7
SELECT
name,
stock
FROM
products
WHERE
name = '日式雙人床架';

邏輯運算 AND:
情境 4:預算內的商品
客人:「想找 4 萬以下,而且有現貨的沙發」
小美想查:要同時符合:是沙發、4萬以下、有庫存

A: 北歐風雙人沙發、工業風電視櫃、簡約書櫃、玄關鞋櫃、日式雙人床架、掀床五尺雙人床、電腦辦公椅、餐椅四入組、北歐風餐桌、實木咖啡桌

1
2
3
4
5
6
7
8
9
SELECT
name,
price,
stock
FROM
products
WHERE
price < 40000
AND stock > 0;

情境 5:特價且有貨
客人:「沙發有哪些特價且現貨的品項?」
小美想查:要找到沙發類且有特價(原價大於優惠價)且還有庫存的商品

A: 北歐風雙人沙發、貓抓皮L型沙發、工業風電視櫃、日式雙人床架、掀床五尺雙人床、電腦辦公椅、餐椅四入組、北歐風餐桌、實木咖啡桌

1
2
3
4
5
6
7
8
9
10
SELECT
name,
price,
discount_price,
stock
FROM
products
WHERE
discount_price < price
AND stock > 0;

邏輯運算 OR:
情境 6:多分類查詢
客人:「我要找櫃子或桌子」
小美想查:要找出櫃子類或桌子類的商品

A: 工業風電視櫃、簡約書櫃、玄關鞋櫃、北歐風餐桌、實木咖啡桌、電競書桌

1
2
3
4
5
6
7
SELECT
name,
category
FROM
products
WHERE
category IN('櫃子', '桌子');

情境 7:指定商品
客人:「北歐風雙人沙發和貓抓皮L型沙發哪個還有貨?」
小美想查:要找出這兩張特定沙發的庫存狀況

A:前者剩 3 個,後者勝 1 個,都有貨

1
2
3
4
5
6
7
SELECT
name,
stock
FROM
products
WHERE
name IN('北歐風雙人沙發', '貓抓皮L型沙發');

IN 運算:
情境 8:多分類查詢
客人:「客廳的家具有哪些?我要看沙發、櫃子跟桌子」
小美想查:要找出沙發、櫃子和桌子這三種分類的商品

A: 北歐風雙人沙發、貓抓皮L型沙發、典雅三人座沙發、工業風電視櫃、簡約書櫃、玄關鞋櫃、北歐風餐桌、實木咖啡桌、電競書桌

1
2
3
4
5
6
7
SELECT
name,
category
FROM
products
WHERE
category IN('沙發', '櫃子', '桌子');

情境 9:特定商品
客人:「電腦辦公椅和餐椅四入組的價格是多少?」
小美想查:要找出這兩款椅子的價格

A: 3900, 5200 折扣後價格

1
2
3
4
5
6
7
8
SELECT
name,
price,
discount_price
FROM
products
WHERE
name IN('電腦辦公椅', '餐椅四入組');

BETWEEN:
情境 10:價格區間
客人:「想找 10000 到 20000 之間的商品有哪些?」
小美想查:列出這個價格區間的所有商品

A: 日式雙人床架、掀床五尺雙人床、北歐風餐桌

1
2
3
4
5
6
7
SELECT
name,
price
FROM
products
WHERE
price BETWEEN 10000 AND 20000;

情境 11:庫存區間
主管:「請列出庫存在 5 到 15 之間的商品」
小美想查:列出庫存數量在這個範圍的商品

A: 典雅三人座沙發、工業風電視櫃、簡約書櫃、玄關鞋櫃、日式雙人床架、餐椅四入組、實木咖啡桌

1
2
3
4
5
6
7
SELECT
name,
price
FROM
products
WHERE
stock BETWEEN 5 AND 15;

NOT IN:
情境 12:排除商品
主管:「列出除了沙發和床架以外的商品」
小美想查:要找出不是沙發和床架的商品

A: 工業風電視櫃、簡約書櫃、玄關鞋櫃、電腦辦公椅、餐椅四入組、北歐風餐桌、實木咖啡桌、電競書桌

1
2
3
4
5
6
7
SELECT
name,
price
FROM
products
WHERE
category NOT IN('沙發', '床架');

更新和刪除:
情境 13:調整價格
主管:「北歐風雙人沙發要調降 2000 元」
小美想查:要如何更新這張沙發的價格

A: 37900

1
2
3
UPDATE products
SET price = price - 2000
WHERE name = '北歐風雙人沙發';

情境 14:更新庫存
主管:「電腦辦公椅進了 5 張」
小美想查:要如何增加這款椅子的庫存數量

A: 25

1
2
3
UPDATE products
SET stock = stock + 5
WHERE name = '電腦辦公椅';

情境 15:清除資料
主管:「要清掉兒童床架和電競書桌的資料」
小美想查:要如何刪除這兩項商品

1
2
3
A: 
DELETE FROM products
WHERE name IN('兒童床架', '電競書桌');

上一位同學的問題

Question

上一位同學題目:庫存為0的商品,補貨數量10件。

1
2
3
4
A:
UPDATE products
SET stock = stock + 5
WHERE stock = 0;

出給下位同學的問題

如果路過的朋友也可以嘗試回答看看哦

1
Q: 請找出所有存貨低於五件的商品,將折扣價提升至原價的 10%,並且這些商品種類不包含床架,再將存貨多於十件的商品狀態改為 inactive,請列出所有被更新過價格及更改過狀態的 商品名稱、庫存、狀態,最後將狀態為 inactive 的商品刪除。

Conclusion & 結論

雖然之前有胡亂摸過 Sequelize,但大致上都是透過 ORM 直接性的操作 SQL,並不是真的完全懂資料庫,希望能藉由這次的體驗營一虧資料庫的世界。

這次的節奏還是很符合一貫的六角風格,進度緩慢但是能充分吸收,只是還是希望散落在各地的資訊可以統一整合,這過程除了要跑到直播平台網站去解任務,還要到 Discord 去鎖定訊息,另外分組也是臨時知道,過程中其實滿讓人會有焦慮感。


參考網站