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 ∩ BがINNER JOINだとすれば、AがLEFT JOINになります。
ちなみにLEFT JOINとLEFT OUTER JOINに違いはありません。LEFT JOINにOUTERが隠れているだけです
どうなるかというとINNER JOINがAとBで合致したものを表示するためNULLデータがありません。
一方でLEFT JOINの場合はA側のデータを全て表示するため、BにAのデータが無い場合はその部分がNULLになります。
とりあえず今日はこんな感じで