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 email
0911222333 abc@pklotcorp.com
0911222444
0911555666 cdf@pklotcorp.com

SELECT ... FROM ...

SELECT * FROM users LIMIT 3

撈取 users 的資料,撈取所有欄位(不建議正式情況使用)

id mobile email ...
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 email
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?