SQLの「JOIN」は業務などでもよく使われていると思います。JOINは、簡単に言えば、テーブル同士をくっつけて一時的に1つのテーブルとすることで、そのテーブル内のデータを検索したりする際によく使用されます。

例えば以下のように、商品テーブルと分類テーブルがあるとして、これらをJOINで結合してみます。

・商品テーブル

商品ID商品名分類ID_1
1じゃがいもB
2バターA
3トマトB
4エビnull
5チキンC

・分類テーブル

分類ID_2分類名
A乳製品
B野菜
C
D果物

INNER JOIN

INNER JOIN(内部結合)は、ON句の結合条件で指定した列で共通の値が両テーブルに存在するデータのみを出力するという特徴があります。

SELECT * FROM 商品 INNER JOIN 分類
ON 商品.分類ID_1 = 分類.分類ID_2; 

上記のように、商品テーブルの分類ID_1と分類テーブルの分類ID_2が一致するという結合条件でINNER JOINのSQLを実行すると、以下の結果が得られます。

商品ID商品名分類ID_1分類ID_2分類名
1じゃがいもBB野菜
2バターAA乳製品
3トマトBB野菜
5チキンCC

前述したINNER JOINの特徴の通り、商品テーブルの「4:エビ」の行や、分類テーブルの「D:果物」の行は一致するデータが反対のテーブルになかったため、表示されませんでした。

OUTER JOIN

OUTER JOIN(外部結合)は、INNER JOINと異なり、結合条件にマッチしていない行も出力する特徴があります。
また、LEFT OUTER JOINとRIGHT OUTER JOINの2種類存在します。”~ OUTER JOIN ~”の左側と右側のテーブルのどちらを基準にするかという違いです。

①LEFT OUTER JOIN

SELECT * FROM 商品 LEFT OUTER JOIN 分類
ON 商品.分類ID_1 = 分類.分類ID_2;

上記がLEFT OUTER JOINのSQL文となりますが、実行結果は次の通りです。

商品ID商品名分類ID_1分類ID_2分類名
1じゃがいもBB野菜
2バターAA乳製品
3トマトBB野菜
4エビnullnullnull
5チキンCC

商品テーブルの「4:エビ」の行が表示されてますね。しかしながら、マッチする分類テーブルのデータはないので、該当列には”null”と表示されています。

②RIGHT OUTER JOIN

SELECT * FROM 商品 RIGHT OUTER JOIN 分類
ON 商品.分類ID_1 = 分類.分類ID_2;

さきほどのSQLの、LEFT OUTER JOINの”LEFT”を”RIGHT”に変更して、実行した結果が以下です。

商品ID商品名分類ID_1分類ID_2分類名
2バターAA乳製品
1じゃがいもBB野菜
3トマトBB野菜
5チキンCC
nullnullnullD果物

この結果では、「D:果物」の行を含め、分類テーブルのすべての行が少なくとも1行は表示されています。その代わりに、結合できなかった商品テーブルの「4:エビ」の行がなくなっていますね。

最後に

OUTER JOINは、LEFT OUTER JOINの方がよく使われる印象です。
他にも、CROSS JOINというのがありますが、業務などで使われている場面を見たことがないので、ここでは割愛します。
ここでは簡単な例で2つのテーブルでの結合を挙げましたが、高度になると、結合したテーブルをさらに結合するなど、複雑なSQLを使用している現場もあります。コメントなども活用して、わかりやすいSQLを心掛けたいですね。