[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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
情境 1:單品查詢
客人:「這張北歐風雙人沙發多少錢?」
小美想查:想找到這張沙發的價格和庫存

A: 39900
SELECT
name,
price
FROM
products
WHERE
name = '北歐風雙人沙發';

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

A: 簡約書櫃, 玄關鞋櫃
SELECT
name,
price
FROM
products
WHERE
category IN('櫃子')
AND price < 5000;

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

A: 剩下 6 個
SELECT
name,
stock
FROM
products
WHERE
name = '日式雙人床架';

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

A: 北歐風雙人沙發、工業風電視櫃、簡約書櫃、玄關鞋櫃、日式雙人床架、掀床五尺雙人床、電腦辦公椅、餐椅四入組、北歐風餐桌、實木咖啡桌
SELECT
name,
price,
stock
FROM
products
WHERE
price < 40000
AND stock > 0;

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

A: 北歐風雙人沙發、貓抓皮L型沙發、工業風電視櫃、日式雙人床架、掀床五尺雙人床、電腦辦公椅、餐椅四入組、北歐風餐桌、實木咖啡桌
SELECT
name,
price,
discount_price,
stock
FROM
products
WHERE
discount_price < price
AND stock > 0;

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

A: 工業風電視櫃、簡約書櫃、玄關鞋櫃、北歐風餐桌、實木咖啡桌、電競書桌
SELECT
name,
category
FROM
products
WHERE
category IN('櫃子', '桌子');

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

A:前者剩 3 個,後者勝 1 個,都有貨
SELECT
name,
stock
FROM
products
WHERE
name IN('北歐風雙人沙發', '貓抓皮L型沙發');

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

A: 北歐風雙人沙發、貓抓皮L型沙發、典雅三人座沙發、工業風電視櫃、簡約書櫃、玄關鞋櫃、北歐風餐桌、實木咖啡桌、電競書桌
SELECT
name,
category
FROM
products
WHERE
category IN('沙發', '櫃子', '桌子');

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

A: 3900, 5200 折扣後價格
SELECT
name,
price,
discount_price
FROM
products
WHERE
name IN('電腦辦公椅', '餐椅四入組');

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

A: 日式雙人床架、掀床五尺雙人床、北歐風餐桌
SELECT
name,
price
FROM
products
WHERE
price BETWEEN 10000 AND 20000;

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

A: 典雅三人座沙發、工業風電視櫃、簡約書櫃、玄關鞋櫃、日式雙人床架、餐椅四入組、實木咖啡桌
SELECT
name,
price
FROM
products
WHERE
stock BETWEEN 5 AND 15;

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

A: 工業風電視櫃、簡約書櫃、玄關鞋櫃、電腦辦公椅、餐椅四入組、北歐風餐桌、實木咖啡桌、電競書桌
SELECT
name,
price
FROM
products
WHERE
category NOT IN('沙發', '床架');

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

A: 37900
UPDATE products
SET price = price - 2000
WHERE name = '北歐風雙人沙發';

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

A: 25
UPDATE products
SET stock = stock + 5
WHERE name = '電腦辦公椅';

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

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 去鎖定訊息,另外分組也是臨時知道,過程中其實滿讓人會有焦慮感。


參考網站