SQL の 基本 INNER / OUTER JOIN で結合をマスター!
SQL の中でも、複数のテーブルを結合 JOIN する方法は、 基本 中の基本です。結合の種類の中でよく使われる、内部結合 INNER JOIN と 外部結合 OUTER JOINがあります。目的に応じて、内部結合と外部結合を使い分ける必要があります。理解してマスターしましょう。
結合方法の種類
結合 JOIN(ジョイン)といってもいくつか種類が存在します。
- 直積結合(横方向積算結合)
- 和集合(縦方向結合)
- 内部結合 ⇐ 今回説明
- 外部結合 ⇐ 今回説明
を覚えればある程度の結合処理はできると思います。
以下に各結合の説明を進めます。
内部結合(INNER JOIN インナージョイン)
SELECT * FROM テーブルA INNER JOIN テーブルB ON テーブルA.ID = テーブルB.ID;
意味:Aというテーブルと、Bというテーブルのうち、それぞれのIDが一致するものを、積算結合し、抽出する。
テーブルA
カラム1 | ID |
A1 | 1 |
A2 | 2 |
A3 | 3 |
×
テーブルB
カラム2 | ID |
B1 | 1 |
B2 | 4 |
B3 | 5 |
||
カラム1 | ID | カラム2 | ID |
A1 | 1 | B1 | 1 |
実は、この結果は、直積結合のWHERE句の条件指定した結果と同じなのです。
[https://way2se.ringtrees.com/sql-010/]
しかし、INNER JOIN の方が、
- 結合条件が明確に指定できる
- WHERE句による取得レコードの抽出
が使えることです。
直積結合と同じ結果に見えても、意図が明確ですし、後述する外部結合と使い分ける為に、INNER JOINの書き方をマスターした方が良いかもしれませんね。
外部結合(OUTER JOIN アウタージョイン)
SELECT * FROM テーブルA LEFT OUTER JOIN テーブルB ON テーブルA.ID = テーブルB.ID;
意味:Aというテーブルと、Bというテーブルのうち、それぞれのIDが一致するものを、積算結合し、抽出する。
テーブルA
カラム1 | ID |
A1 | 1 |
A2 | 2 |
A3 | 3 |
×
テーブルB
カラム2 | ID |
B1 | 1 |
B2 | 4 |
B3 | 5 |
||
カラム1 | ID | カラム2 |
A1 | 1 | B1 |
A2 | 2 | |
A3 | 3 | |
4 | B2 | |
5 | B3 |
内部結合と異なり、外部結合はどちらかのテーブルにない行(レコード)も取り出す方法です。一致しなかった値は、NULLとして設定されます。
内部結合と同じく、WHERE句が使えます。
補足
~ LEFT OUTER JOIN ~とありますが、~ RIGHT OUTER JOIN ~もあります。
テーブルの先に指定した方が左、後に指定した方が右となります。
今回はテーブルA(左)、テーブルB(右)となります。
RIGHT OUTER JOINとするなら、テーブルBを基準として、テーブルAが結合されます。
LEFT OUTER JOINとRIGHT OUTER JOINの違いは、基準にするテーブルを指定することになりますが、LEFT OUTER JOINを標準的に使う方が良いとされています。
その理由は、3つ以上のテーブルを結合する際の考えによります。
3つ以上の複数テーブルを結合する場合、1つ目(左)と2つ目(右)。
その結合した結果(左)と3つ目(右)・・・
という風に左側のテーブルを基準として、連続して結合していきます。
その際、基準が分かりにくくなるため、LEFT OUTER JOINを標準とする方が良いとされています。
その他、SQL構文は以下にて整理分類しています。
[https://way2se.ringtrees.com/sql-001/]