About me
• ԞాՂڗʢYoshitaka Okudaʣ
• גࣜձࣾSocketʢKDDI Syn.ϗʔϧσΟϯάεάϧʔϓʣ
ΞʔΩςΫτ
• Twitter @yoskhdia
• interested in DDD & Reactive System & Team
Building & more !
id name division
1 ฏ Ӧۀ
2 ւฏ ։ൃ
3 αβΤ ӡ༻
4 ϚεΦ Ӧۀ
Users
id user_id button_id clicked
1 10 A TRUE
2 11 A TRUE
3 10 B FALSE
4 20 B TRUE
දࣔཤྺ
id title
A Happy Birthday!
B Welcome!
Buttons
"ؔ" Relation
id user_id button_id clicked
1 10 A TRUE
2 11 A TRUE
3 10 B FALSE
4 20 B TRUE
දࣔཤྺ
Buttons
Users
දࣔཤྺ
ू߹ͱू߹ͷؔ
ྫ͑ɺදࣔཤྺuser_idͰ
Usersͱ͍ؔͯ͠Δ
Slide 11
Slide 11 text
දू߹͔ΒσʔλΛऔΓग़ͨ݁͠Ռ
w w
͘Β͍ʹͱΒ͑Δ
id user_id button_id clicked title
1 10 A TRUE Happy Birthday!
2 11 A TRUE Happy Birthday!
3 10 B FALSE Welcome!
4 20 B TRUE Welcome!
SELECT දࣔཤྺ.*, Buttons.title
FROM දࣔཤྺ INNER JOIN Buttons
ON දࣔཤྺ.button_id = Buttons.id
جૅߏจ
·ͣ͜Ε͚ͩ
SELECT
何を
FROM
どこから
JOIN ~ ON
関連させて
WHERE
どれを
SELECT Buttons.id, Buttons.title,
表示履歴.clicked
FROM 表示履歴
INNER JOIN Buttons
ON 表示履歴.button_id = Buttons.id
WHERE 表示履歴.clicked = TRUE
id title clicked
A Happy Birthday! TRUE
A Happy Birthday! TRUE
B Welcome! TRUE
Slide 15
Slide 15 text
جૅߏจ + α
AS
名前付け
GROUP BY
再集合化
HAVING
再集合の
どれを
SELECT Buttons.id, Buttons.title,
COUNT(*) AS click_count
FROM 表示履歴
INNER JOIN Buttons
ON 表示履歴.button_id = Buttons.id
WHERE 表示履歴.clicked = TRUE
GROUP BY Buttons.id, Buttons.title
HAVING COUNT(*) >= 2
id title click_count
A Happy Birthday! 2
Slide 16
Slide 16 text
id user_id button_id clicked title
1 10 A TRUE Happy Birthday!
2 11 A TRUE Happy Birthday!
3 10 B FALSE Welcome!
4 20 B TRUE Welcome!
id title clicked
A Happy Birthday! TRUE
A Happy Birthday! TRUE
B Welcome! TRUE
id title click_count
A Happy Birthday! 2
ΫϦοΫͨ͠
ͷʹߜͬͯ
2ճҎ্ΫϦοΫͯ͠
Δͷʹߋʹߜͬͨ
݅ࣜΛॻ͘ಓ۩
·ͣ͜Ε͚ͩ
=, !=, >, >=, <, <=, AND, OR, NOT
!= はExcelでいうと <>
IS NULL, IS NOT NULL
a = NULLはマッチしない。NULLは無。
IN (<値やサブクエリ>), EXISTS (<サブクエリ>)
カッコ"()"の中を満たせばマッチ
Slide 24
Slide 24 text
ྫ
WHERE id = 1
WHERE title = 'Welcome!' OR title = 'Thanks!'
WHERE name IS NULL
WHERE button_id IN ('A', 'B', 'C')
WHERE EXISTS (SELECT 1 FROM Buttons WHERE
Buttons.id = button_id)
CASEࣜ
ʢSELECTͷதͰ͏ྫʣ
SELECT button_id,
SUM(CASE WHEN clicked = TRUE
THEN 1 ELSE 0
END) AS clicked,
SUM(CASE WHEN clicked = TRUE
THEN 0 ELSE 1
END) AS not_clicked
FROM 表示履歴
GROUP BY button_id
id clicked not_clicked
A 2 0
B 1 1
CASE式で場合分けをして、
一度の問い合わせで複数の
集計を行っている
Slide 27
Slide 27 text
CASEࣜ
ʢGROUP BYͰ͏ྫʣ
SELECT COUNT(*) AS clicked
FROM 表示履歴
WHERE clicked = TRUE
GROUP BY
(CASE WHEN button_id IN ('A', 'C')
THEN 0
ELSE 1
END)
clicked
2
1
CASE式で場合分けをして、任意の
ボタンでグルーピングしている
※この例は数だけしか取得していないので
見分けがつかず微妙…
CASE button_id
WHEN 'A' THEN 0
WHEN 'C' THEN 0
ELSE 1 END
のようにWHENは続けて書くこと
もできる
Slide 28
Slide 28 text
αϒΫΤϦ
SELECT id, button_id,
(SELECT title FROM Buttons
WHERE button_id = Buttons.id)
AS button_title
FROM 表示履歴
SELECT id
FROM 表示履歴 AS H1
WHERE EXISTS
(SELECT 1 FROM 表示履歴 AS H2
WHERE
H1.button_id = H2.button_id
AND H1.id < H2.id)
id button_id button_title
1 A Happy Birthday!
2 A Happy Birthday!
3 B Welcome!
4 B Welcome!
id
1
3
この例は同じテーブルで比較
して重複データの抽出をして
いる(自己相関)