SQL WORKSHOP
Become a Mochi that writes SQL!
SELECT ...
FROM...
1
Fumi 2022/04
Who is FUMI
- 麻吉村的後端工程師之一
- 喜歡茶、咖啡、涼涼的山、看動畫、唱日卡(宅
- 之後有問題都可以敲敲 slack or 找我討論
基本概念
fundamentals
RDBMS
關聯式資料庫
資料庫
Databases
資料表
Tables
欄位
Columns
- RDBMS (Relational Database Management System) ,關聯式資料庫管理系統
關聯式資料庫
Instance
關聯式資料庫
Database
關聯式資料庫
Tables
關聯式資料庫
Columns
關聯式資料庫
Tables
Columns
SERVER / CLIENT
- 等待用戶端的請求
- 處理請求,回傳結果
- DB 資料在這邊
Server
- 送出請求
- 等待收到回應
Client
SERVER / CLIENT
eg.
資料庫在
Google 雲端平台
的機器上
我們透過 metabase 等
工具連線,
取用資料
schema
- 資料庫的結構
- 例如:每個欄位的名稱跟型別的定義
- 可以用類似試算表的方式理解 Table 的結構
id | name | birth |
---|---|---|
1 | Andy | 2000-01-01 |
2 | Carter | 2001-12-31 |
users
結構
資料
schema
id | name | birth |
---|---|---|
1 | Andy | 2000-01-01 |
2 | Carter | 2001-12-31 |
結構
id | name | birth |
---|---|---|
1 | Andy | 2000-01-01 |
2 | Carter | 2001-12-31 |
資料
column name | type |
---|---|
id | 整數 |
name | 字串 |
birth | 日期 |
基礎 SQL 語法
SQL Basics
RDBMS
- SQL(Structured Query Language),結構化查詢語言
- 分成兩個部分
- 操作 schema,eg. 加 Table 加欄位
- 操作 content / records,eg. 查詢
- workshop 只會提到查詢的指令
what is SQL?
- 不同的關聯式資料庫的 SQL 語法也會有差異
- Autoplus 使用 PostgreSQL 13
REMINDER
SELECT ... FROM ...
SELECT mobile, email FROM users LIMIT 3
撈取 users 的資料,只撈取 mobile 和 email 欄位
限回傳三筆資料
mobile | |
---|---|
0911222333 | abc@pklotcorp.com |
0911222444 | |
0911555666 | cdf@pklotcorp.com |
SELECT ... FROM ...
SELECT * FROM users LIMIT 3
撈取 users 的資料,撈取所有欄位(不建議正式情況使用)
id | mobile | ... | |
---|---|---|---|
2 | 0911222333 | abc@pklotcorp.com | ... |
3 | 0911222444 | ... | |
4 | 0911222456 | meowmeow@pklotcorp.com | ... |
COLUMN Alias
SELECT mobile AS 手機, email AS 電子信箱
FROM users
LIMIT 3
欄位名稱可以取別名
手機 | 電子信箱 |
---|---|
0911222333 | abc@pklotcorp.com |
0911222444 | |
0911222456 | meowmeow@pklotcorp.com |
WHERE
SELECT id, mobile, distributor_id
FROM users
WHERE mobile = '0911222333'
撈取手機為 0911222333 的使用者的資料
id | mobile | distributor_id |
---|---|---|
2 | 0911222333 | 1 |
3 | 0911222333 | 7 |
WHERE
SELECT id, mobile, distributor_id
FROM users
WHERE mobile = '0911222333'
AND distributor_id = 1
撈取手機為 0911222333,通路 ID 為「1」的使用者的資料
id | mobile | distributor_id |
---|---|---|
2 | 0911222333 | 1 |
WHERE
SELECT id, mobile, distributor_id
FROM users
WHERE created_at >= '2022-04-01'
撈取 2022-04-01 以後新增的使用者
id | mobile | distributor_id |
---|---|---|
2 | 0911222333 | 1 |
WHERE
SELECT id, type, income_amount
FROM orders
WHERE income_amount > 2000
撈取金額大於 2000 的訂單
id | type | income_amount |
---|---|---|
33 | refueling | 2200 |
WHERE ... IN
SELECT id, mobile, email
FROM users
WHERE mobile IN ('0911222333', '0911222456')
撈取手機在清單中(0911222333、0911222456)的資料
id | mobile | |
---|---|---|
2 | 0911222333 | abc@pklotcorp.com |
4 | 0911222456 | meowmeow@pklotcorp.com |
聚合
Aggregation
SUM
SELECT SUM(income_amount)
FROM orders
計算所有訂單金額的加總
SUM(income_amount) |
---|
36500 |
COUNT
SELECT COUNT(1)
FROM orders
計算訂單總數
COUNT(1) |
---|
17 |
SUM with WHERE
SELECT SUM(income_amount)
FROM orders
WHERE type = 'parking'
計算所有停車訂單金額的加總
SUM(income_amount) |
---|
17500 |
GROUP BY
SELECT type, SUM(income_amount)
FROM orders
GROUP BY type
計算所有停車訂單金額的加總
type | SUM(income_amount) |
---|---|
parking | 17500 |
refueling | 18500 |
on_street_parking | 500 |
AGGREGATE FUNCTIONS
常見的聚合函式有:
- SUM 總和
- COUNT 資料筆數
- AVG 平均
- MAX 最大值
- MIN 最小值
排序
Sorting
ORDER BY
SELECT id, income_amount
FROM orders
WHERE type = 'parking'
ORDER BY income_amount
撈出所有停車訂單,按照金額排序(由小至大)
id | income_amount |
---|---|
1 | 20 |
2 | 30 |
ORDER BY
SELECT id, income_amount
FROM orders
WHERE type = 'parking'
ORDER BY orders.income_amount DESC
撈出所有停車訂單,按照金額排序(由大至小)
id | income_amount |
---|---|
2 | 30 |
1 | 20 |
下回預告
跨兩張表的資料如何處理?
QuestionS?
SQL workshop 1
By Meng-Ying Tsai
SQL workshop 1
- 550