SQLの「JOIN」は業務などでもよく使われていると思います。JOINは、簡単に言えば、テーブル同士をくっつけて一時的に1つのテーブルとすることで、そのテーブル内のデータを検索したりする際によく使用されます。
例えば以下のように、商品テーブルと分類テーブルがあるとして、これらをJOINで結合してみます。
・商品テーブル
商品ID | 商品名 | 分類ID_1 |
1 | じゃがいも | B |
2 | バター | A |
3 | トマト | B |
4 | エビ | null |
5 | チキン | C |
・分類テーブル
分類ID_2 | 分類名 |
A | 乳製品 |
B | 野菜 |
C | 肉 |
D | 果物 |
Table of Contents
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 | じゃがいも | B | B | 野菜 |
2 | バター | A | A | 乳製品 |
3 | トマト | B | B | 野菜 |
5 | チキン | C | C | 肉 |
前述した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 | じゃがいも | B | B | 野菜 |
2 | バター | A | A | 乳製品 |
3 | トマト | B | B | 野菜 |
4 | エビ | null | null | null |
5 | チキン | C | C | 肉 |
商品テーブルの「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 | バター | A | A | 乳製品 |
1 | じゃがいも | B | B | 野菜 |
3 | トマト | B | B | 野菜 |
5 | チキン | C | C | 肉 |
null | null | null | D | 果物 |
この結果では、「D:果物」の行を含め、分類テーブルのすべての行が少なくとも1行は表示されています。その代わりに、結合できなかった商品テーブルの「4:エビ」の行がなくなっていますね。
最後に
OUTER JOINは、LEFT OUTER JOINの方がよく使われる印象です。
他にも、CROSS JOINというのがありますが、業務などで使われている場面を見たことがないので、ここでは割愛します。
ここでは簡単な例で2つのテーブルでの結合を挙げましたが、高度になると、結合したテーブルをさらに結合するなど、複雑なSQLを使用している現場もあります。コメントなども活用して、わかりやすいSQLを心掛けたいですね。