Introduction & 前言
小節作業於摘要第五點,如果只想參照作業的部分可以快轉跳至 小節作業:家具店的菜雞銷售奇遇記
隔了好一段時間沒有自我進修,趁著最近六角學院在特價課程,去摸一下後端世界的樣子。
接下來會有幾篇紀錄上課的過程,以及中間的一些心得、作業筆記。
整篇文章是筆者自己的心得,如果文內有錯誤的地方,還請盡情指出。
課程總共會有四堂直播課,其中不包含學院已經上傳的課程影片,約莫 50 個小短片。
本篇會從零開始記錄筆記,可能會分成幾篇紀錄,這篇會是前 25% 的部分。
Summary & 摘要
如果需要觀看小節作業,可以跳過前四章
另外本篇文章還不會實際操作到真實 DB,可以先透過線上網站去練習:線上練習網站 PG SQL
- 資料庫簡介
- 建立 SQL 資料表
- 資料的 CRUD
- 資料庫註解
- 小節作業:家具店的菜雞銷售奇遇記
資料庫簡介
資料庫組成可大致分為
- 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 舉例的話就是 Sheet 代表 Table,Column 跟 Row 的意思都一樣
資料的 CRUD
資料庫執行順序為下
- 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 2 3 4
| — 查詢所有欄位 SELECT * FROM users; — 查詢特定欄位 SELECT name, age FROM users;
|
- 別名查詢(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;
|
- 篩出想要的資料
篩選資料(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,也能對下一個同學發問,這邊先貼上小節作業的回答
小節作業回答
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('兒童床架', '電競書桌');
|
上一位同學的問題
上一位同學題目:庫存為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 去鎖定訊息,另外分組也是臨時知道,過程中其實滿讓人會有焦慮感。
參考網站