HexWolf Blog

SQL学習シリーズ⑤:JOIN句

はじめに

SELECT WHERE ORDER BY GROUP BYあたりの構文が終わったのでここではFROM句に入ることができます。

FROM句はテーブルを1つ指定してSELECTやWHEREを利かすもの、だという認識をしていましたが勉強をしているとそれは1機能でしかない上に最小的な考えでした。

基本構文に入る前に特徴から捉えましょう。

特徴

  • SELECT文に必須の項目であり省略できない
  • 単一テーブルだけでなく複数テーブルを組み合わせた処理も可能

テーブル設計によりますが第三正規化と呼ばれるところまでテーブルを分散させると、例えばusersテーブルのカラム名には部署名ではなく部署idのみが書かれるようになります。

全て単一のテーブルに書けばいいじゃん!となるところですが実際のところ、部署名が変わったりすればその部署に所属するusers全てを変えなきゃいけなくなる処理が発生するため、現実的にそのようなことはできません。
ただusersテーブル単体で見てもidだけ抽出されても「これどこの部署やねん」となること必至です。

そこでFROM句を考える上でJOIN句も同時に考えることが大事になります。

基本構文

SELECT * FROM テーブル名;

SELECT users.name, category.name FROM users INNER JOIN category ON users.user_id = category.user_id;

重要なのは

  • id等で紐づける
  • カラム名は同じ名前の場合があるためどのテーブルか明示する
  • FROM句内でテーブル名が長い場合はAS句で短縮ができる

そしてINNER JOINと同じくらい使うLEFT JOINですが、簡単に言えばA ∩ BINNER JOINだとすれば、ALEFT JOINになります。
ちなみにLEFT JOINLEFT OUTER JOINに違いはありません。LEFT JOINにOUTERが隠れているだけです

どうなるかというとINNER JOINがAとBで合致したものを表示するためNULLデータがありません。
一方でLEFT JOINの場合はA側のデータを全て表示するため、BにAのデータが無い場合はその部分がNULLになります。

とりあえず今日はこんな感じで