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

第2回 SQL勉強会 (社外公開用)

第2回 SQL勉強会 (社外公開用)

社内向けに実施した第2回 SQL勉強会の内容を社外公開用に一部加工したものです。

Saiid Al-Halawi

December 06, 2021
Tweet

More Decks by Saiid Al-Halawi

Other Decks in Technology

Transcript

  1. 7 基本的なSELECT文 SELECT ID, 名前, メールアドレス, 作成日時 FROM ユーザー WHERE

    名前 LIKE ‘佐藤%’ ORDER BY 作成日時 DESC LIMIT 10 ユーザーの中から「佐藤」という名前で始まる 人を最新10名分ください
  2. 8 基本的なSELECT文 SELECT ID, 名前, メールアドレス, 作成日時 FROM ユーザー WHERE

    名前 LIKE ‘佐藤%’ ORDER BY 作成日時 DESC LIMIT 10 ユーザーの中から (対象のテーブル) 「佐藤」から始まる名前の人を (抽出条件) 「作成日時」新しい順に (結果の取得順序の指定 ) 10件まで (結果の最大取得件数 )
  3. 12 例えばこんなデータがあったとします とあるECサイト ID 名前 メアド 1 田中 tanaka@... 2

    佐藤 sato@... 3 高橋 takahashi@... ユーザー ID 名前 価格 1 シャツ 3,500 2 ズボン 4,000 3 くつ 8,500 商品
  4. 15 注文データの登場 ECサイトなのでユーザーの注文もデータとして記録しなければならないのでした ID 名前 メアド 1 田中 tanak... 2

    佐藤 sato@... 3 高橋 takaha... ユーザー ID 名前 価格 1 シャツ 3,500 2 ズボン 4,000 3 くつ 8,500 商品 ユーザーID 商品ID 購入日 1 2 2021-10-30 1 2 2021-10-30 3 1 2021-11-04 注文 New!
  5. 17 そうじゃないんです こうじゃないの??? ユーザー名 商品名 購入日 田中 ズボン 2021-10-30 田中

    ズボン 2021-10-30 高橋 シャツ 2021-11-04 注文 同姓同名の人がいると異なるユーザーが混ざってしまったり、逆に注文時に別名を入 力されたら別ユーザーとして扱われてしまったり … 「1人のユーザー」として追跡するためには、ひとりひとりのユーザーが独立した1レ コードとして存在する必要があるのです。
  6. 18 テーブル同士の「関連付け」 ECサイトなのでユーザーの注文も記録しなければならないのでした ID 名前 メアド 1 田中 tanak... 2

    佐藤 sato@... 3 高橋 takaha... ユーザー ID 名前 価格 1 シャツ 3,500 2 ズボン 4,000 3 くつ 8,500 商品 ユーザーID 商品ID 購入日 1 2 2021-10-30 1 2 2021-10-30 3 1 2021-11-04 注文 注文とユーザーの関連付けを表す 注文と商品の関連付けを表す
  7. 20 注文データを取り出してみた SELECT ユーザーID, 商品ID, 購入日 FROM 購入 ORDER BY

    購入日 DESC LIMIT 10 ユーザーID 商品ID 購入日 1 2 2021-11-20 1 3 2021-11-11 3 1 2021-11-10 2 2 2021-11-10 1 1 2021-11-08 3 3 2021-11-06
  8. 21 注文データを取り出してみた、結果 SELECT ユーザーID, 商品ID, 購入日 FROM 購入 ORDER BY

    購入日 DESC LIMIT 10 ユーザーID 商品ID 購入日 1 2 2021-11-20 1 3 2021-11-11 3 1 2021-11-10 2 2 2021-11-10 1 1 2021-11-08 3 3 2021-11-06 え、誰? え、何?
  9. 24 今回やりたいこと ユーザー、商品、注文のすべてをつなげて一緒に見れればよさそう ID 名前 メアド 1 田中 tanak... 2

    佐藤 sato@... 3 高橋 takaha... ユーザー ID 名前 価格 1 シャツ 3,500 2 ズボン 4,000 3 くつ 8,500 商品 ユーザーID 商品ID 購入日 1 2 2021-10-30 1 2 2021-10-30 3 1 2021-11-04 注文
  10. 26 今回のケースでいうと ... SELECT ユーザー.名前, 商品.名前, 注文.購入日 FROM 注文 INNER

    JOIN ユーザー ON ユーザー.ID = 注文.ユーザーID INNER JOIN 商品 ON 商品.ID = 注文.商品ID
  11. 27 結合させてる箇所 SELECT ユーザー.名前, 商品.名前, 注文.購入日 FROM 注文 INNER JOIN

    ユーザー ON ユーザー.ID = 注文.ユーザーID INNER JOIN 商品 ON 商品.ID = 注文.商品ID この部分が結合のための記述
  12. 28 注文 - ユーザーの結合 SELECT ユーザー.名前, 商品.名前, 注文.購入日 FROM 注文

    INNER JOIN ユーザー ON ユーザー.ID = 注文.ユーザーID INNER JOIN 商品 ON 商品.ID = 注文.商品ID ユーザーテーブルの「 ID」 注文テーブルの「ユーザー ID」 の二つは、どちらもユーザーに割り当てられた固有の ID を表すフィールドで、同じものなのでこの二つを結び付 けてユーザーと注文を結合しますよ
  13. 29 注文 - 商品の結合 SELECT ユーザー.名前, 商品.名前, 注文.購入日 FROM 注文

    INNER JOIN ユーザー ON ユーザー.ID = 注文.ユーザーID INNER JOIN 商品 ON 商品.ID = 注文.商品ID 商品テーブルの「ID」 注文テーブルの「商品 ID」 は、どちらも商品ごとに割り当てられた固有の IDを 表すフィールドで、同じものなのでこの二つを結び 付けて商品と注文を結合しますよ
  14. 30 総じて ... SELECT ユーザー.名前, 商品.名前, 注文.購入日 FROM 注文 INNER

    JOIN ユーザー ON ユーザー.ID = 注文.ユーザーID INNER JOIN 商品 ON 商品.ID = 注文.商品ID 注文テーブルを「起点」に ユーザーと商品を結び付けて 結果を取得しますよ
  15. 31 取得結果 SELECT ユーザー.名前, 商品.名前, 注文.購入日 FROM 注文 INNER JOIN

    ユーザー ON ユーザー.ID = 注文.ユーザーID INNER JOIN 商品 ON 商品.ID = 注文.商品ID ユーザー.名前 商品.名前 注文.購入日 田中 ズボン 2021-11-20 田中 くつ 2021-11-11 高橋 シャツ 2021-11-10 佐藤 ズボン 2021-11-10 田中 シャツ 2021-11-08 高橋 くつ 2021-11-06
  16. 33 SELECTの中身について SELECT ユーザー.名前, 商品.名前, 注文.購入日 FROM 注文 INNER JOIN

    ユーザー ON ユーザー.ID = 注文.ユーザーID INNER JOIN 商品 ON 商品.ID = 注文.商品ID ユーザー.名前 商品.名前 注文.購入日 田中 ズボン 2021-11-20 田中 くつ 2021-11-11 高橋 シャツ 2021-11-10 佐藤 ズボン 2021-11-10 田中 シャツ 2021-11-08 高橋 くつ 2021-11-06 この部分について見ていきます
  17. 34 元のデータベース ID 名前 メアド 1 田中 tanak... 2 佐藤

    sato@... 3 高橋 takaha... ユーザー ID 名前 価格 1 シャツ 3,500 2 ズボン 4,000 3 くつ 8,500 商品 ユーザーID 商品ID 購入日 1 2 2021-10-30 1 2 2021-10-30 3 1 2021-11-04 注文
  18. 35 注文. ユー ザーID 注文. 商品ID 注文. 購入日 ユーザー .ID

    ユーザー. 名前 ユーザー. メアド 商品.ID 商品.名前 商品.価格 1 2 2021-10-30 1 田中 tanaka@. .. 2 ズボン 4,000 1 2 2021-10-30 1 田中 tanaka@. .. 2 ズボン 4,000 3 1 2021-11-04 2 高橋 takahashi @... 1 シャツ 3,500 JOINされるとこういう形になります 注文を起点に結合された擬似テーブル
  19. 36 注文. ユー ザーID 注文. 商品ID 注文. 購入日 ユーザー .ID

    ユーザー. 名前 ユーザー. メアド 商品.ID 商品.名前 商品.価格 1 2 2021-10-30 1 田中 tanaka@. .. 2 ズボン 4,000 1 2 2021-10-30 1 田中 tanaka@. .. 2 ズボン 4,000 3 1 2021-11-04 2 高橋 takahashi @... 1 シャツ 3,500 擬似テーブルの内訳 注文を起点に結合された擬似テーブル 注文テーブルの属性 ユーザーテーブルの属性 商品テーブルの属性
  20. 37 注文. ユー ザーID 注文. 商品ID 注文. 購入日 ユーザー .ID

    ユーザー. 名前 ユーザー. メアド 商品.ID 商品.名前 商品.価格 1 2 2021-10-30 1 田中 tanaka@. .. 2 ズボン 4,000 1 2 2021-10-30 1 田中 tanaka@. .. 2 ズボン 4,000 3 1 2021-11-04 2 高橋 takahashi @... 1 シャツ 3,500 先のselect句の中身はつまりこういうこと SELECT ユーザー.名前, 商品.名前, 注文.購入日
  21. 38 (ちなみに) 参照カラムをIDに変えると ... SELECT ユーザー.ID, 商品.ID, 注文.購入日 FROM 注文

    INNER JOIN ユーザー ON ユーザー.ID = 注文.ユーザーID INNER JOIN 商品 ON 商品.ID = 注文.商品ID ユーザー.ID 商品.ID 注文.購入日 1 2 2021-11-20 1 3 2021-11-11 3 1 2021-11-10 2 2 2021-11-10 1 1 2021-11-08 3 3 2021-11-06
  22. 41 基本的な集計関数 COUNT() … 指定フィールドの総件数を取得 SUM() … 指定フィールドの合計値を取得 AVG() …

    指定フィールドの平均値を取得 MAX() … 指定フィールドの最大値を取得 MIN() … 指定フィールドの最小値を取得
  23. 42 使うデータ 先ほどのECサイトのDB ID 名前 メアド 1 田中 tanak... 2

    佐藤 sato@... 3 高橋 takaha... ユーザー ID 名前 価格 1 シャツ 3,500 2 ズボン 4,000 3 くつ 8,500 商品 ユーザーID 商品ID 購入日 1 2 2021-10-30 1 2 2021-10-30 3 1 2021-11-04 注文
  24. 44 SELECT COUNT(ID) FROM ユーザー 集計関数の例 1. - COUNT() COUNT(ID)

    3 このクエリからわかること : このECサイトのユーザー総数は 3人!
  25. 46 SELECT AVG(価格) FROM 商品 集計関数の例 2. - AVG() AVG(価格)

    5,333.3333 .... このクエリからわかること : このECサイトの平均商品価格は 5,3333.3333 ...円
  26. 48 SELECT SUM(商品.価格) FROM 注文 INNER JOIN 商品 ON 商品.ID

    = 注文.商品ID WHRE 注文.購入日 BETWEEN ‘2021-11-01’ AND ‘2021-11-31’ 余裕 SUM(商品.価格) 32,000
  27. 49 SELECT SUM(商品.価格) FROM 注文 INNER JOIN 商品 ON 商品.ID

    = 注文.商品ID WHRE 注文.購入日 BETWEEN ‘2021-11-01’ AND ‘2021-11-31’ 余裕 SUM(商品.価格) 32,000 注文ごとに買われた商品の価格を引っ張り出して合計している感じ (ズボン価格 + ズボン価格 + シャツ価格 + くつ価格 … etc)