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
- 697