透過「家具店的菜雞銷售奇遇記」來學 PostgreSQL 資料庫指令啦!再次參加六角學院體驗營,這次是學習後端?

距離上一次更新部落格竟然是兩年半前的事情了。說來慚愧,除了工作忙碌,其實就是很多理由 XD 一直有想回來更新的想法,但內心雜音、要做的事情太多,一直沒有成行。這一次再度參與六角學驗的體驗營,就趁好來趁這次的機會,更新一下學習筆記 XD

經歷了兩年前端工作的磨練,慢慢對於前端技能有了一些感覺。但其實我的初次工作經驗,也就是實習其實是寫 PHP 後端的,在後來的正職工作與接案上,其實也接觸了不少後端。這也讓我開始在思考說,是否可以往全端技能樹發展了?但其實資料庫是我的硬傷,尤其是在大學時,資料庫就是我最不拿手的科目沒有之一(誒),也是其中一個我為何後來想轉往前端的原因 XDD 但既然想往全端技能發展,勢必資料庫就是我不能逃避的技能了,剛好就趁這一次的體驗營,來好好重新梳理資料庫的內容吧!

事前準備

執行環境

我們會使用 PG SQL 這個線上平台來執行 PostgreSQL 指令。

初始語法

首先,要先建立 poducts 資料表,先定義資料表的欄位類型後,透過 INSERT INTO 新增指令建立預設資料。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
('北歐風雙人沙發', 39900, 35900, 3, '沙發', 'active'),
('貓抓皮L型沙發', 58900, 52900, 1, '沙發', 'active'),
('典雅三人座沙發', 42800, 42800, 5, '沙發', 'active'),
('工業風電視櫃', 5900, 4900, 12, '櫃子', 'active'),
('簡約書櫃', 3500, 3500, 8, '櫃子', 'active'),
('玄關鞋櫃', 2900, 2900, 15, '櫃子', 'active'),
('日式雙人床架', 12000, 11200, 6, '床架', 'active'),
('掀床五尺雙人床', 19900, 18900, 2, '床架', 'active'),
('兒童床架', 8900, 8900, 0, '床架', 'inactive'),
('電腦辦公椅', 4500, 3900, 20, '椅子', 'active'),
('餐椅四入組', 6000, 5200, 8, '椅子', 'active'),
('北歐風餐桌', 15800, 14800, 4, '桌子', 'active'),
('實木咖啡桌', 3200, 2900, 10, '桌子', 'active'),
('電競書桌', 8900, 8900, 0, '桌子', 'inactive');

事前都準備好後,接下來就進入「家具店的菜雞銷售奇遇記」的奇幻冒險吧!

P.S. 以下故事本身就是題目,所以如果有在其他地方看到同樣的故事,是正常的哦~

故事 … 開始!!

剛進入『築夢家居』當銷售顧問的小美,,沒想到第一天上班就遇到系統大當機,最扯的是這間老字號家具店只有 POS 機和資料庫,也沒有網站可以查詢。

偏偏今天是週年慶開跑,主管又在門市坐鎮,店裡生意好到不行,只好硬著頭皮詢問店裡的工程師大大…

(門市內)

客人:我要看那個貓抓皮沙發,你們還有貨嗎?

小美:(慌張)啊…貓抓皮沙發…

(急著用 LINE 問小明)

小美:學長救命!要怎麼查這個沙發?

小明:用等於就可以了:

1
2
3
SELECT name, price, stock
FROM products
WHERE name = '貓抓皮L型沙發';

小美:喔!就是以下這樣,對嗎?

1
2
3
選取 名字、價格、庫存
從 商品表
找 商品名等於貓抓皮L型沙發

小明:對!很快就上手了嘛!

小美:(快速輸入…)哇!真的查到了!只剩一張庫存耶…

客人:(不耐煩)小姐?到底有沒有啊?

小美: 這款 L 型沙發目前最後一張特價 52900,要幫您預訂嗎?

客人:哦?最後一張喔…那…就先訂起來好了!

小明:!!!這麼快就會了?根本是資料庫天才 == b

小明:那我再考你幾題,如果你都會了以後,那我就可以退休了ㄏㄏㄏ

小美:…..

基礎比較運算

情境 1:單品查詢

客人:「這張北歐風雙人沙發多少錢?」

小美想查:想找到這張沙發的價格和庫存

1
2
3
SELECT name, price, stock
FROM products
WHERE name = '北歐風雙人沙發'

首先,使用 select 語法來查詢 products 資料表裡面的內容,並且因為題目需要價格與庫存,因此撈了 price 與 stock 欄位,我這邊多撈了 name 欄位來幫助識別。

最後,加上 where 條件,將 name 鎖定在題目所指定的「北歐風雙人沙發」。

情境 2:價格比較

客人:「請列出 5000 元以下的櫃子有哪些?」

小美想查:找出櫃子類且價格在 5000 以下的商品

1
2
SELECT * FROM products
WHERE price < 5000

這次沒特別指定欄位,所以我就 select 星號把全部欄位給撈出來,並且透過 where 來撈出符合價格低於 5000 的商品出來。

情境 3:庫存確認

客人:「日式雙人床架還有貨嗎?」

小美想查:確認日式雙人床架的庫存狀況

1
2
3
SELECT name, status
FROM products
WHERE name = '日式雙人床架'

因為是確認庫存狀況,所以撈了 status 以及提供識別的 name,並且透過 where 篩選出 name 等於日式雙人床架的欄位,來確認庫存狀況。

邏輯運算 AND

情境 4:預算內的商品

客人:「想找 4 萬以下,而且有現貨的沙發」

小美想查:要同時符合:是沙發、4萬以下、有庫存

1
2
3
4
SELECT * FROM products
WHERE category = '沙發'
AND price < 40000
AND status = 'active'

首先透過 select 查詢 products 資料表後,where 的判斷分別下了 category 等於沙發、price 要小於 40000、status 等於 active 的三個條件式,並且透過 AND 來串接條件式,表示這三個條件同時需要符合,不然就不會回傳該筆資料。

情境 5:特價且有貨

客人:「沙發有哪些特價且現貨的品項?」

小美想查:要找到沙發類且有特價(原價大於優惠價)且還有庫存的商品

1
2
3
SELECT * FROM products
WHERE price > discount_price
AND status = 'active'

此題需要符合價格 price 要大於優惠價 discount_price,表示該商品目前有折扣,如果兩者相等代表這個商品目前沒有折扣。因此 where 的條件下了 price 要大於 discount_price,直接透過欄位比較來下條件,並且同時需要符合 status 等於 active 才能撈出所需條件的筆數。

邏輯運算 OR

情境 6:多分類查詢

客人:「我要找櫃子或桌子」

小美想查:要找出櫃子類或桌子類的商品

1
2
SELECT * FROM products
WHERE category = '沙發' or category = '桌子'

此題要撈分類等於「沙發」與「卓子」的欄位,但如果使用 AND 就變成要同時符合,但是題目設計上分類只會分別等於沙發、卓子,所以就會與題目要求不相符。所以此時就需要使用到 OR,這樣只要 OR 前後有其中一項符合,就會撈出該筆資料,如此一來就會將分類等於沙發或是桌子的筆數撈出來。

情境 7:指定商品

客人:「北歐風雙人沙發和貓抓皮L型沙發哪個還有貨?」

小美想查:要找出這兩張特定沙發的庫存狀況

1
2
3
SELECT name, status
FROM products
WHERE name = '北歐風雙人沙發' OR name = '貓抓皮L型沙發'

這次撈出題目指定的庫存狀況 status 與方便識別的商品名稱 name,在 where 讀不份透過 OR 來將商品名稱為「北歐風雙人沙發」與「貓抓皮L型沙發」資料撈出來。

IN 運算

情境 8:多分類查詢

客人:「客廳的家具有哪些?我要看沙發、櫃子跟桌子」

小美想查:要找出沙發、櫃子和桌子這三種分類的商品

1
2
SELECT * FROM products
WHERE category IN ('沙發', '櫃子', '桌子')

如果照情境 6 的做法,就會是要透過兩個 or 將上面三個分類的條件式列出來,如果條件一多其實滿累人,程式碼又很冗長 XD 但是透過 in 的方式,等於是只要 category 有符合右邊括號內的其中一個元素(可以理解成陣列元素)就會將資料撈出來。

情境 9:特定商品

客人:「電腦辦公椅和餐椅四入組的價格是多少?」

小美想查:要找出這兩款椅子的價格

1
2
3
SELECT name, price
FROM products
WHERE name IN ('電腦辦公椅', '餐椅四入組')

邏輯基本上跟上面一樣,撈出商品名稱為「電腦辦公椅」與「餐椅四入組」的商品名稱與價格。

BETWEEN

情境 10:價格區間

客人:「想找 10000 到 20000 之間的商品有哪些?」

小美想查:列出這個價格區間的所有商品

1
2
SELECT * FROM products
WHERE price BETWEEN 10000 AND 20000

透過 BETWEEN 數字一 AND 數字二 可以撈出價格在這兩個數字之間的資料,所以透過這個語法來撈出價格在 10000 到 20000 之間的資料。

情境 11:庫存區間

主管:「請列出庫存在 5 到 15 之間的商品」

小美想查:列出庫存數量在這個範圍的商品

1
2
SELECT * FROM products
WHERE stock BETWEEN 5 AND 15

將庫存在 5 到 15 之間的商品撈出來。

NOT IN

情境 12:排除商品

1
2
SELECT * FROM products
WHERE category NOT IN ('沙發', '床架')

這個指令會將分類是「分類」與「床架」以外的資料撈出來。

更新和刪除

情境 13:調整價格

主管:「北歐風雙人沙發要調降 2000 元」

小美想查:要如何更新這張沙發的價格

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

透過 Update 指令可以更新 products 資料表內的 price 欄位,以題目來說會將商品名稱為「北歐風雙人沙發」的價格 price 更新為 price 在減 2000

情境 14:更新庫存

主管:「電腦辦公椅進了 5 張」

小美想查:要如何增加這款椅子的庫存數量

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

這個題目會將原本電腦辦公椅的庫存再加上 5 筆庫存。

情境 15:清除資料

主管:「要清掉兒童床架和電競書桌的資料」

小美想查:要如何刪除這兩項商品

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

這個題目結合了上面提到的 IN,會將商品名稱為「兒童床架」與「電競書桌」的資料給刪除。

故事結束

發現透過情境來學習,增加了一些有趣程度寫起來會有種不一樣的感覺 XDD 尤其是在資料庫這種我不擅長的科目,開心不少(?)希望可以趁這次機會把一直沒機會學好的資料庫理解更深入!


本站所有文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處!