Upgrade to Pro — share decks privately, control downloads, hide ads and more …

実務家のためのSQL / SQL for Beginers

実務家のためのSQL / SQL for Beginers

社内勉強会用資料です。

Yoshitaka Okuda

August 01, 2016
Tweet

More Decks by Yoshitaka Okuda

Other Decks in Programming

Transcript

  1. About me • ԞాՂڗʢYoshitaka Okudaʣ • גࣜձࣾSocketʢKDDI Syn.ϗʔϧσΟϯάεάϧʔϓʣ
 ΞʔΩςΫτ •

    Twitter @yoskhdia • interested in DDD & Reactive System & Team Building & more !
  2. 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
  3. "ςʔϒϧ" ද ͱ ू߹ id name division 1 ೾ฏ Ӧۀ

    2 ւฏ ։ൃ 3 αβΤ ӡ༻ 4 ϚεΦ Ӧۀ Users ͜ͷ1ͭͷ఺͕σʔλ ྫ͑͹ɺ೾ฏ Users
  4. "ؔ܎" 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ͱؔ܎͍ͯ͠Δ
  5. ද͸ू߹͔ΒσʔλΛऔΓग़ͨ݁͠Ռ 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
  6. جૅߏจ ·ͣ͸͜Ε͚ͩ 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
  7. جૅߏจ + α 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
  8. 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ճҎ্ΫϦοΫͯ͠ Δ΋ͷʹߋʹߜͬͨ
  9. දࣔཤྺ clicked = TRUE COUNT(*) >= 2 Buttons 1.WHEREで絞る 2.GROUP

    BYでまとめる 今回はButtonごとに 4.JOINで関連づける 3.HAVINGで絞る
  10. JOINͷछྨ ·ͣ͸͜Ε͚ͩ INNER JOIN <A> INNER JOIN <B> ON <条件>としたとき、条

    件を満たさないデータは結果から除外される LEFT OUTER JOIN <A> LEFT OUTER JOIN <B> ON <条件>としたと き、条件を満たしていなくてもAのデータは全 て結果に含まれ、B側はNULLとなる
  11. ৚݅ࣜΛॻ͘ಓ۩ ·ͣ͸͜Ε͚ͩ =, !=, >, >=, <, <=, AND, OR,

    NOT != はExcelでいうと <> IS NULL, IS NOT NULL a = NULLはマッチしない。NULLは無。 IN (<値やサブクエリ>), EXISTS (<サブクエリ>) カッコ"()"の中を満たせばマッチ
  12. ྫ 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)
  13. 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式で場合分けをして、 一度の問い合わせで複数の 集計を行っている
  14. 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は続けて書くこと もできる
  15. αϒΫΤϦ 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 この例は同じテーブルで比較 して重複データの抽出をして いる(自己相関)
  16. දࣔཤྺ clicked = TRUE COUNT(*) >= 2 Buttons 1.WHEREで絞る 2.GROUP

    BYでまとめる 今回はButtonごとに 4.JOINで関連づける 3.HAVINGで絞る 0.FROMを決める 5.結果をSELECT