「スッキリわかるSQL入門」読書会レポート vol.7

株式会社リゾーム 技術部 システム開発 第4グループの平松です。今回は「スッキリわかるSQL入門」読書会の第7回のレポートです。

「スッキリわかるSQL入門」の過去のレポートや他の読書会のレポートはカテゴリーでまとめていますので、こちらからご覧いただけます。

tech.rhizome-e.com

読書会の題材

前回に引き続き「スッキリわかるSQL入門」を題材としています。

7回目レポート

7回目は第8章「複数テーブルの結合」のレポートになります。参加者は4名でした。

それぞれの感想・意見交換

「リレーショナル」の意味

  • 基本情報の勉強でやったところ
  • テスターは自分でテーブルを設計する機会はないが、テスト用に各テーブルを結合して抽出して…とやっていると、根本的な設計の大事さはなんとなくわかる
  • データの関係性によって、どのようなテーブルにするのかは分かれる
  • どのテーブルに外部キーを持たせるかは目的によって変わる
  • テーブルを複数持てることの恩恵が改めて分かった
  • 単一のテーブルでデータを管理するのは考えたくないな…。絶対どこかで不整合が生まれそう
  • 複数テーブルに分けるメリットは座学で習うだけだとあやふやだったけど、実際に業務でSQLを触っていくうちに感覚として納得した

テーブルの結合

  • SQLで一番初めに躓いたところ
  • 初めて使った時は表計算ソフトっぽいというのが頭の中にあったため、結合のイメージがしづらかった覚えがある
  • 初めて習った時は「おおー」となった。データベースを扱ってるという実感があった
  • 結合はイメージが湧き難いので、書籍では紙工作で結合を体験できるようになっていて初学者には非常に分かりやすくて良いと思った
  • 当たり前のことだけど、結合結果を頭の中でイメージするのは難しいので、実際に結合結果を見て理解するのが確実
  • 結合も種類があるため、必要なデータによって内部結合を使うか、外部結合を使うか変わってくる
  • 条件を満たしている行に繋がっていくイメージはうまくできている
  • 製品内部にも必ずと言っていいほど使われているし、テストでも使う
  • テーブルの結合は業務でよく使う
  • 「INNER JOIN」を省略して「JOIN」と書くことは滅多に無い

結合条件の取り扱い

  • 完全外部結合(FULL OUTER JOIN)は使ったことがない
  • 例で出た「WHERE NULL = …」みたいなことはさすがにやらないが、「この書き方だったらNULLはどうなるか」はやはり気を付けないといけないところ
  • INNER JOIN と LEFT JOIN の2つを覚えておけば大体の状況に対応できそう
  • 内部結合の動作がややこしい
    • 内部結合の説明を読んだ後だとLEFT JOIN, RIGHT JOIN, FULL JOINの動作に納得した
  • 結合相手が複数行の場合、結合前より行数が増えるというのが混乱する原因な気がする
  • INNER JOIN, RIGHT JOIN, LEFT JOINとかの違いはベン図で考えるのが一番理解しやすかった
  • JOINにいろいろ種類があるのがややこしい
    • 特に省略表記できるのが逆に厄介だと思う
    • 個人的には混乱しがちなポイント
  • 業務では結合条件の列がNULLであってもデータを取得したいことが多いので主に LEFT JOIN を使う
  • 混乱を避けるため RIGHT JOIN は使わず、LEFT JOIN のテーブルの順番を入れ替えるようにしている
    • そういうルールで運用しているチームは多いイメージ
  • FULL JOINじゃなくてUNIONを使うことのほうが多い
  • 個人的にINNER JOIN, LEFT JOIN, RIGHT JOINには「OUTER」は付けないが、何故か完全外部結合のときだけ「FULL OUTER JOIN」にしてしまう

結合に関するさまざまな構文

  • カラム名にテーブル名がなくてエラーになるのはよくやる(エディタの下線に助けられている)
  • 3テーブル以上やサブクエリを結合すると、どうしても見づらくなるので、インデントやコメントをしっかりつけたい
  • 特定のカラムだけを抜き出したテーブルを結合させたことがある
  • 同じテーブルを結合するのはしたことないかもしれない
  • 自己結合で同じ家計簿同士を繋げたいことはあるのか?と考えながら読んでいたらテキストの例を見てなるほどなってなった
  • 3テーブル以上の結合や、サブクエリ結果との結合、同じテーブル同士での結合は使う機会はなかった
  • 同じテーブルを結合するのは自分で書いたことはないがPull Requestなどでよく見る
  • 基本的に結合する場合は、テーブル名を明示的に指定している
    • 列名を記述する際もエイリアス名を必ず書くようにしている
    • 個人的にその方が読みやすいし、自分の想定していないテーブルの列が参照されるような想定外の挙動になることを防ぐことができる
  • 副問い合わせの結果を結合するのはよくやる

まとめ

今回は、RDBMSの目玉の結合に関する章でした。意見交換の場でも実際の業務に関わる話が多かった印象です。結合について学ぶことでSQLでできることの幅が一気に広がると思います。結合はよく使う機能ですが私自身も知らなかった使い方があったので今後、SQLを触る際に活用していきたいと思います。

次回は、第9章「トランザクション」になります。次章から第三部「データベースの知識を深めよう」の内容になっていきます。