目次
今回は職場でSQLを書く機会がありましたので共有させていただきます。
テーブル結合には大きく二つあります。
- 外部結合(INNERJOIN)
- 内部結合(OUTERJOIN)
サンプルデータを用意しました
外部結合
fuluitsテーブル
id | name | region_id |
---|---|---|
1 | みかん | 1 |
2 | りんご | 2 |
3 | いちご | 3 |
4 | メロン | 4 |
5 | 梨 | 5 |
6 | かき | 1 |
7 | さくらんぼ | 6 |
regionテーブル
id | region |
---|---|
1 | 和歌山 |
2 | 青森 |
3 | 栃木 |
4 | 茨城 |
5 | 千葉 |
6 | 山形 |
7 | 広島 |
内部結合(INNERJOIN)
- 両テーブルで指定したカラムの値が一致するデータのみを抽出する方法です
- 基本構文
- SELECT * FROM fluits(テーブル名1) INNER JOIN region(テーブル名2) ON region id = fuluits region_id;
- 結果
id | name | region_id | id | region |
---|---|---|---|---|
1 | みかん | 1 | 1 | 和歌山 |
6 | かき | 1 | 1 | 和歌山 |
2 | りんご | 2 | 2 | 青森 |
3 | いちご | 3 | 3 | 栃木 |
4 | めろん | 4 | 4 | 茨城 |
5 | 梨 | 5 | 5 | 千葉 |
7 | さくらんぼ | 6 | 6 | 山形 |
外部結合(OUTERJOIN2種類)
- LEFT JOIN
- RIGHT JOIN
LEFT JOIN
- FROM句の後ろに記述するテーブルが軸の結合方法
- 基本構文
- SELECT * FROM fluits LEFT JOIN region ON region id = fluits region_id;
- 結果
id | name | region_id | id | region |
---|---|---|---|---|
1 | みかん | 1 | 1 | 和歌山 |
6 | かき | 1 | 1 | 和歌山 |
2 | りんご | 2 | 2 | 青森 |
3 | いちご | 3 | 3 | 栃木 |
4 | めろん | 4 | 4 | 茨城 |
5 | 梨 | 5 | 5 | 千葉 |
7 | さくらんぼ | 6 | 6 | 山形 |
INNERJOINとの違いが伝えられんな、、INNERJOINと違うのはカラムがある値だけ抽出するのではなく、軸にあるテーブルすべての情報を表示する
RIGHT JOIN
- RIGHTJOIN句の後ろに記述するテーブルが軸の結合方法
- 基本構文
- SELECT * FROM fluits RIGHT JOIN region ON region id = fluits region_id;
- 結果
id | name | region_id | id | region |
---|---|---|---|---|
1 | みかん | 1 | 1 | 和歌山 |
6 | かき | 1 | 1 | 和歌山 |
2 | りんご | 2 | 2 | 青森 |
3 | いちご | 3 | 3 | 栃木 |
4 | めろん | 4 | 4 | 茨城 |
5 | 梨 | 5 | 5 | 千葉 |
7 | さくらんぼ | 6 | 6 | 山形 |
null | null | null | 7 | 広島 |
これは、条件で指定した値をreginテーブルから全て取ってきている。ご存じ通り広島の果物はfluitsテーブルには無いため、NULLの値が設定されている。
このように、OUTERJOINは条件に指定した値を全て取ってくるのが特徴である。
まとめ
そもそも大規模システムだと、格納するデータや役割によってデータベースを分けるのでJOINが使用できないという話もあるっぽいな。。