データベーススペシャリスト資格|2022年10月挑戦ログ 5月7日|SQLによるテーブルの結合(1/3)

高度IT・基礎知識

この記事は「データベーススペシャリスト資格に興味はあるが、どのようなものか?どう学ぶのか?」という方向けに、具体的な内容と私自身の挑戦ログをお伝えする。学び中の方や、これから学ぼうとされる方の参考になれば幸いだ。

今回はSQLによるテーブルの結合(1/3)について書く。

※注意点として、SQLはDBMSによって作法が異なる。この記事はGoogle Big Queryに準拠するものであることをお含みおき願いたい。

なぜ、テーブルは複数あるのか

前回のおさらい

  • 分析とは「分類し比較する」ことで、SQLではグループ化と集計関数を用いる。前回までで「group byと基本的な集計関数(sum,avg,max,min)」および「集計結果の絞り込み(havig)と柔軟なグループ化(if,case)」を学んだ。
  • ここまでの学びにより、例えば「webログを用いたユーザーごと訪問回数の調査」や統計学的な使い方も学べた。すなわちあるグループごとの該当する数を取得した結果をSQLで求め、BIツールに読み込んでヒストグラムにするなど。
  • ただし、今まではあくまで一つのテーブルに対する列・行・グループ化の操作だった。今回から複数テーブルの操作を学んでいく。

テーブルとは(おさらい)

  • テーブルは集合であり関数。意味のあるデータのまとまりであり、ある入力に対し一意の結果が求まる。
  • この原則に基づき、テーブルを扱いやすいように切っていく(いつでも戻せるように)のが正規化。
  • 単一のごった煮テーブルで管理すると、更新のとき非常に扱いづらい。
  • このあたりは4月29日一次まとめにて整理済。

複数のテーブルがある意味

  • 複数のテーブルにわける原則は前述のとおり。もう少し実務的に言うと「複数のテーブルがある意味は、単一のテーブルで扱うよりメリットがある」から。
  • メリット①、異なる性質のデータを扱いやすい。実務は通常、見積⇒発注⇒納品⇒支払のように一連の業務フローからなり、それぞれ手順も、担当者も、扱うデータも異なる。よってそれぞれの業務工程ごとにテーブルも分けたほうが管理が簡単で良い(必要な要素が小さなひとまとまりになってるイメージ)。ただし、後から必要に応じて統合できるよう、外部キーなどを用いて関係を整理する必要はある。
  • メリット②、一定期間ごとに集計されたデータを扱いやすい。例えばGoogleアナリティクスのデータは自動的に日別のテーブルが作成される。これは、24時間365日レコードを取得するので、きりの良い所で区切らないとテーブルが巨大で扱いづらくなるから。

分析では複数テーブルをつなげる

  • そして、分析においては複数のテーブルをつなげる必要がある。なぜなら、筋の良い論点を導くためには、より多様で幅広い(たくさんの切り口・列を持つ)、より大量で長期間の(たくさんのレコード・行を持つ)データを扱う必要があるから。
  • なお、メリット①で「異なる性質(列)で分けたデータ」を、“横”につなげる操作を「結合(join)」と言う。”横”と表現したのは、表で見ると横に列が追加されていくイメージだから。
  • メリット②で「一定期間ごとに集計されたデータ」を、“縦”につなげる操作を「集合演算(union)」と言う。”縦”と表現したのは、表で見ると縦に行が追加されていくイメージだから。

テーブルの結合(基本)

もっとも基本のパターン

  • まずは「異なる性質(列)で分けたデータ」を、”横”につなげる操作「結合(join)」について
  • もっとも基本のパターンは「2つのテーブルの値が重なっているレコードを残して結合」する「内部結合(inner join)」。これは、今後の他のjoinの基本となるためぜひ覚えておきたい

構文

  • select フィールド名
  • from テーブル名①
  • inner join テーブル名②
  • on テーブル名①.テーブル名①の結合に使うフィールド名 = テーブル名②.テーブル名②の結合に使うフィールド名

事例

  • サンプルとして「small_sales_1」という販売テーブルと、「small_master」という商品マスタテーブルを用意。それを結合するSQL例。
  • ポイントとして「inner joinのinnerは省略可能」「asによる別名付与は便利。テーブルを短い名前で表現できるため」「SQL1行目のselectにおけるproduct_idの前にhanbai.とつけている。joinで2つのテーブルに共通の列名を指定するときはテーブル名も必須。なぜならどちらのテーブルの列なのか示す必要があるから」

using句の利用

  • joinにおいて結合する列名が同じ場合、usingでシンプルに代用可。
  • その場合、on以降を「using(列名)」と記述する。

テーブルの結合(その他)

先に指定したテーブルの値を残す(left outer join)

  • fromで先に読み込むテーブルを「左側」と解釈し、これは全て活かしたうえで、left outer joinとして指定するテーブルを結合するやり方。
  • 構文は「inner join」部分を「left outer join」に置き換えるのみ。
  • 事例は以下のとおり。inner joinと異なるのは、product_idがdの売り上げも記載される点。これは先に指定したsmall_sales_1が活かされるため。

後に指定したテーブルの値を残す(right outer join)

  • right outer joinとして後から指定するテーブルを「右側」と解釈し、これは全て活かし結合するやり方。
  • 構文は「inner join」部分を「right outer join」に置き換えるのみ。
  • 事例は以下のとおり。inner joinと異なるのは、product_idがaのマスター情報も記載される点。これは後に指定したsmall_masterが活かされるため。

2つのテーブルの全レコードを残す(full outer join)

  • fromで先に指定するテーブルを「左側」、full outer joinとして後から指定するテーブルを「右側」と解釈し、両方を全て活かし結合するやり方。
  • 構文および事例は以下のとおりでかなりシンプルに書ける。inner joinと異なるのは、product_idがdの販売情報も、aのマスター情報も記載される点。これは両方のテーブル情報が活かされるため。

考察

  • 今までは単一テーブルの操作を学習。今回から複数テーブルの操作を学んでいる。
  • これは、実務では「扱いやすさ」の観点から複数テーブルに分かれているが、分析においては「幅広く見る」ためにテーブルをつなげる必要があるから。
  • ようやくここで、データベーススペシャリスト資格の優先学習ポイントである「①論理設計(業務で扱うデータを整理し、ER図で書く)」と「②SQL」が意味を持って紐づいてきた。

参考書籍

  • 集中演習 SQL入門/木田和廣/株式会社インプレス
  • データベーススペシャリスト2022年版/三好康之/翔泳社
  • おうちで学べるデータベースのきほん/ミック,木村明治/翔泳社

コメント

タイトルとURLをコピーしました