JOINとは
JOIN とはその名の通り結合です。複数のテーブルをまとめて、そこから検索を行います。
本来 FROM で指定したテーブルからのみデータを検索しますが、JOIN を使用することにより複数のデータを扱うことができます。
データの準備
membersテーブル
id | name | age | team_id |
---|---|---|---|
1 | Yamamoto | 20 | 1 |
2 | Sato | 25 | 3 |
3 | Yamada | 16 | 2 |
4 | Tanaka | 35 | 1 |
5 | Kato | 42 | 4 |
teamsテーブル
id | team_name |
---|---|
1 | BLUE |
2 | GREEN |
3 | RED |
INNER JOIN(内部結合)
複数のテーブルを共通のキーで結びつけて、両方のテーブルに存在するデータだけを結合します。
基本構文
SELECT カラム名1, カラム名2, ... FROM テーブル名1
INNER JOIN テーブル名2 ON 結合の条件;
- テーブル1からカラム1、カラム2を取得
- 結合の条件に従ってテーブル2からも取得
- 結合
具体例
SELECT * FROM members
INNER JOIN teams ON members.team_id = teams.id;
- membersテーブルから全てのカラムを取得し、
- membersテーブルの team_id と teamsテーブルの id を対応させた状態で、
- teamsテーブルを結合
実行結果
id | name | age | team_id | id | team_name |
---|---|---|---|---|---|
1 | Yamamoto | 20 | 1 | 1 | BLUE |
2 | Sato | 25 | 3 | 3 | RED |
3 | Yamada | 16 | 2 | 2 | GREEN |
4 | Tanaka | 35 | 1 | 1 | BLUE |
membersテーブルのKatoはどこへ?
Katoの team_id は 4 だが、teamsテーブルの id に 4 は存在しません!
内部結合では、条件にマッチするレコードがないものは、結果セットから外れます。
→ だから Kato は表示されなかったのです。
OUTER JOIN(外部結合)
内部結合のようにそれぞれのテーブルの指定したカラムの値が一致するものを結合するのに加え、結合条件に一致しない行も含めて結果に出すことができます。
基本構文
SELECT カラム名1, カラム名2, ... FROM テーブル名1
LEFT(RIGHT) JOIN テーブル名2 ON 結合の条件;
- LEFT JOIN : 左側のテーブルを軸にして結合
- RIGHT JOIN : 右側のテーブルを軸にして結合
具体例
SELECT * FROM members
LEFT JOIN teams ON members.team_id = teams.id;
実行結果
id | name | age | team_id | id | team_name |
---|---|---|---|---|---|
1 | Yamamoto | 20 | 1 | 1 | BLUE |
2 | Sato | 25 | 3 | 3 | RED |
3 | Yamada | 16 | 2 | 2 | GREEN |
4 | Tanaka | 35 | 1 | 1 | BLUE |
5 | Kato | 42 | 4 | NULL | NULL |
Katoが結果セットに含まれている!
内部結合では表示されなかった Kato が、外部結合では表示されています。
外部結合では、結合条件に一致しない側のカラムには NULL が入る
おまけ
OUTER JOINには LEFT, RIGHTの他に FULL があるが、実行環境によっては非対応の場合もあるので注意が必要です。
まとめ
- JOIN は 複数のテーブルを結合するもの
- INNER JOIN は結合条件に一致するもののみ結果セットに含む
- OUTER JOIN は内部結合の働きに加え、一致しない場合は NULL として結果セットに含む