## 課堂筆記
[Postgres SQL指令](https://hackmd.io/@HCZvma86RdqPySqRGogXRA/ryZHj-v-yl)
##### 資料類型 (Data Type)

**新增資料:**
```
INSERT INTO users(name,email,age)
VALUES
('王曉明','abc@gmail.com',20),
('張小華','efg@gmail.com',15);
```
:::info
➊ INSERT INTO + 資料表名稱 ->把資料新增到這張資料表裡面
➋ (name,email,age) ->要新增這三個欄位的資料
➌ VALUES + 資料內容 ->可一次新增多筆資料
:::
## 練習方式
這次學習的章節「資料庫簡介」、「建立SQL資料表」。
將下方的模擬資料倒入[資料庫練習環境 PG SQL](https://pg-sql.com/),再開始回答問題!
:::spoiler 模擬資料
```postgres=
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');
```
:::
## 題目
**基礎比較運算:**

>[!TIP]情境 1:單品查詢
客人:「這張北歐風雙人沙發多少錢?」
小美想查:想找到這張沙發的價格和庫存
```
SELECT
name AS 商品名稱,
price AS 價錢,
stock AS 庫存
FROM products
WHERE name='北歐風雙人沙發';
```
:::info
➊ SELECT + 欄位名稱
➋ FROM + 資料表名稱
➌ WHERE + 篩選條件
➍ AS 可更改欄位名稱
:::
>[!TIP]情境 2:價格比較
客人:「請列出 5000 元以下的櫃子有哪些?」
小美想查:找出櫃子類且價格在 5000 以下的商品
```
SELECT *
FROM products
WHERE category='櫃子'
AND discount_price<5000;
```
:::info
➊ SELECT * 全部欄位都要顯示
➋ '櫃子' 字串前面加引號
:::
>[!TIP]情境 3:庫存確認
客人:「日式雙人床架還有貨嗎?」
小美想查:確認日式雙人床架的庫存狀況
```
SELECT name,stock
FROM products
WHERE name='日式雙人床架';
```
<br>
**邏輯運算 AND:**

>[!TIP]情境 4:預算內的商品
客人:「想找 4 萬以下,而且有現貨的沙發」
小美想查:要同時符合:是沙發、4萬以下、有庫存
```
SELECT name,stock,discount_price
FROM products
WHERE category='沙發'
AND discount_price<40000
AND status='active';
```
>[!TIP]情境 5:特價且有貨
客人:「沙發有哪些特價且現貨的品項?」
小美想查:要找到沙發類且有特價(原價大於優惠價)且還有庫存的商品
```
SELECT name,discount_price,stock
FROM products
WHERE category='沙發'
AND discount_price<price
AND stock>0;
-- AND status='active';
```
<br>
**邏輯運算 OR:**

>[!TIP]情境 6:多分類查詢
客人:「我要找櫃子或桌子」
小美想查:要找出櫃子類或桌子類的商品
```
SELECT *
FROM products
WHERE category ='櫃子'
OR category ='桌子';
```
>[!TIP]情境 7:指定商品
客人:「北歐風雙人沙發和貓抓皮L型沙發哪個還有貨?」
小美想查:要找出這兩張特定沙發的庫存狀況
```
SELECT name,stock
FROM products
WHERE name ='北歐風雙人沙發'
OR name ='貓抓皮L型沙發';
```
<br>
**IN 運算:**

>[!TIP]情境 8:多分類查詢
客人:「客廳的家具有哪些?我要看沙發、櫃子跟桌子」
小美想查:要找出沙發、櫃子和桌子這三種分類的商品
```
SELECT *
FROM products
WHERE category IN ('沙發','櫃子','桌子');
```
>[!TIP]情境 9:特定商品
客人:「電腦辦公椅和餐椅四入組的價格是多少?」
小美想查:要找出這兩款椅子的價格
```
SELECT name,price,discount_price
FROM products
WHERE name IN('電腦辦公椅','餐椅四入組');
```
<br>
**BETWEEN:**

>[!TIP]情境 10:價格區間
客人:「想找 10000 到 20000 之間的商品有哪些?」
小美想查:列出這個價格區間的所有商品
```
SELECT *
FROM products
WHERE discount_price
BETWEEN 10000 AND 20000;
```
>[!TIP]情境 11:庫存區間
主管:「請列出庫存在 5 到 15 之間的商品」
小美想查:列出庫存數量在這個範圍的商品
```
SELECT *
FROM products
WHERE stock
BETWEEN 5 AND 15;
```
<br>
**NOT IN:**

>[!TIP]情境 12:排除商品
主管:「列出除了沙發和床架以外的商品」
小美想查:要找出不是沙發和床架的商品
```
SELECT *
FROM products
WHERE category NOT IN ('沙發','床架');
```
<br>
**更新和刪除:**
>[!TIP]情境 13:調整價格
主管:「北歐風雙人沙發要調降 2000 元」
小美想查:要如何更新這張沙發的價格
```
UPDATE products
SET price=price-2000
WHERE name='北歐風雙人沙發';
```
:::info
➊ UPDATE 資料表名稱
➋ SET 欄位資料修改設定
➌ WHERE 篩選條件
:::
>[!TIP]情境 14:更新庫存
主管:「電腦辦公椅進了 5 張」
小美想查:要如何增加這款椅子的庫存數量
```
UPDATE products
SET stock=stock+5
WHERE name='電腦辦公椅';
```
>[!TIP]情境 15:清除資料
主管:「要清掉兒童床架和電競書桌的資料」
小美想查:要如何刪除這兩項商品
```
DELETE FROM products
WHERE
name IN('兒童床架','電競書桌');
```
:::info
➊ DELETE FROM 資料表名稱
➋ WHERE 篩選條件
:::