【SQL】これで完璧テーブル結合!JOINの種類と使い方を一覧まとめ

みなさんこんにちは!フリーランスプログラマーのsatoです。

複数テーブルの結合を行いたい!

そんなとき役立つのがJOINという命令です。これを使いこなせれば、できることが飛躍的に増えるでしょう!

しかしこの「JOIN」。結合させる方式が複数存在します。大きく分けると3種類、細かく分けると6種類も存在するんです。

どうしてこんなにあるのでしょうか?私も最初、その違いに戸惑ったものです。今回はその種類と違いに着目しつつ、JOINを見ていきましょうか。

目次

「JOIN」とは

まずそもそも「JOIN」とはなんなのかですが、先ほども説明した通り複数テーブルの結合を行いたいときに使用する命令です。テーブルを結合して、ひとまとめにできるわけですね!そしてこの「JOIN」の種類は大きく分けると、3種類存在します。

  • クロス結合
  • 内部結合
  • 外部結合

の3種類です。それぞれの違いと、コマンドの書き方を見ていくことにしましょう。

今回使用するテーブル

というわけで、今回は以下の二つのテーブルを用意しました。

画像:teamテーブルとuserテーブル

一つ目は、グループの種類が入った、teamテーブル。そしてもう一つは、ユーザー情報が入った、userテーブルです。そして、それぞれ、team_idで関連づいています。ここから先は、このテーブルを参考にJOINについて見ていきましょう。

「CROSS JOIN」(クロス結合)

まずはクロス結合です。

クロス結合とは

クロス結合は一言でいうとすべての組み合わせ作成する結合方式です。先ほどチームテーブル側の「チームA」「チームB」「チームC」と、ユーザーテーブル側の各員、その存在しえるすべての組み合わせを表示する方式です。

使ってみる

実際見てみましょう。命令は以下のように「CROSS JOIN」とつけるだけです。

実行命令:

SELECT * FROM team CROSS JOIN user;

実行結果:

+---------+------------+------+---------+--------+
| team_id | name       | id   | team_id | name   |
+---------+------------+------+---------+--------+
|     101 | チームA    |    1 |     101 | 山田   |
|     102 | チームB    |    1 |     101 | 山田   |
|     103 | チームC    |    1 |     101 | 山田   |
|     104 | チームD    |    1 |     101 | 山田   |
|     101 | チームA    |    2 |     101 | 鈴木   |
|     102 | チームB    |    2 |     101 | 鈴木   |
|     103 | チームC    |    2 |     101 | 鈴木   |
|     104 | チームD    |    2 |     101 | 鈴木   |
|     101 | チームA    |    3 |     102 | 中村   |
|     102 | チームB    |    3 |     102 | 中村   |
|     103 | チームC    |    3 |     102 | 中村   |
|     104 | チームD    |    3 |     102 | 中村   |
|     101 | チームA    |    4 |     102 | 田中   |
|     102 | チームB    |    4 |     102 | 田中   |
|     103 | チームC    |    4 |     102 | 田中   |
|     104 | チームD    |    4 |     102 | 田中   |
|     101 | チームA    |    5 |     103 | 加藤   |
|     102 | チームB    |    5 |     103 | 加藤   |
|     103 | チームC    |    5 |     103 | 加藤   |
|     104 | チームD    |    5 |     103 | 加藤   |
+---------+------------+------+---------+--------+

存在しえる、すべての組み合わせを作ることができていますね!

どこで使うの?

一応説明は行いましたが、実戦でこの方式を使用することはほとんど無いでしょう。無秩序にすべてを組み合わせるだけでは、欲しい情報がとってこれないですからね…

「INNER JOIN」(内部結合)

次に内部結合です。

内部結合とは

これは、指定した関連性のある要素を軸にして、組み合わせてくれる命令です。これこそ見た方が早いでしょう。

使ってみる

今回は「team_id」が関連性のある要素です。これを軸に組み合わせてみましょう。

実行命令:

SELECT * FROM team INNER JOIN user ON team.team_id = user.team_id;

実行結果:

+---------+------------+------+---------+--------+
| team_id | name       | id   | team_id | name   |
+---------+------------+------+---------+--------+
|     101 | チームA    |    1 |     101 | 山田   |
|     101 | チームA    |    2 |     101 | 鈴木   |
|     102 | チームB    |    3 |     102 | 中村   |
|     102 | チームB    |    4 |     102 | 田中   |
|     103 | チームC    |    5 |     103 | 加藤   |
+---------+------------+------+---------+--------+

「INNER JOIN user」で、テーブルを選び、そのあと「ON team.team_id = user.team_id」で、team_idで関連付けています。問題なくteam_idを軸にして、関連している要素で結合が行えていますね!

どこで使うの?

おそらく実戦で一番使われるのが、この内部結合でしょう。関連性のある要素で組み合わせて、表示を行うこの方式は、テーブル同士を組み合わせて表示するのに一番適した方式と言えます。

先ほど見たテーブルでも、関連のある情報だけ組み合わせて表示できているのがわかると思います。またこの結合方式は以下の記事でさらに詳しく説明しています。是非読んでみて深く学んでみてください。

「OUTER JOIN」(外部結合)

最後に外部結合です。外部結合には、さらに3種類の結合方式が存在します。とはいえど、怯える必要がありません!

先ほどの内部結合が理解できていれば理解するのは簡単です。なぜなら外部結合とは「内部結合 + α」の情報を表示するだけの方式だからです。

そして、この「+α」部分になにを指定するかを選ぶのが、先ほど話した3種類「LEFT OUTER JOIN」「RIGHT OUTER JOIN」「FULL OUTER JOIN」なのです。今回は代表して「LEFT OUTER JOIN」を使用して、詳しく見てみましょう。

「LEFT JOIN」とは

LEFTとは左側、つまりFROMで指定した側のテーブルを指します。このテーブル側を軸に情報を表示するのがLEFT JOINです。内部結合では「関連性のある要素」が存在する場合にのみ表示を行っていました。

外部結合のLEFTはそれに加え、「関連性はなくともFROM側に存在するレコード」も合わせて表示を行ってくれるわけです。これも実際見てみた方が早いでしょう。

使ってみる

「LEFT OUTER JOIN user」と結合テーブルの指定を行い、「ON team.team_id = user.team_id」と、結合させる要素を指定します。

実行命令:

SELECT * FROM team LEFT OUTER JOIN user ON team.team_id = user.team_id;

実行結果:

+---------+------------+------+---------+--------+
| team_id | name       | id   | team_id | name   |
+---------+------------+------+---------+--------+
|     101 | チームA    |    1 |     101 | 山田   |
|     101 | チームA    |    2 |     101 | 鈴木   |
|     102 | チームB    |    3 |     102 | 中村   |
|     102 | チームB    |    4 |     102 | 田中   |
|     103 | チームC    |    5 |     103 | 加藤   |
|     104 | チームD    | NULL |    NULL | NULL   |
+---------+------------+------+---------+--------+

内部結合との違いは関連要素の存在しないはずの「チームD」が表示されていることですね。このように、関連性はなくとも、FROM側のテーブルに、レコードとして存在する内容も合わせて表示してくれるわけです。

ただし、その際関連するデータは無いので、結合したデータの情報は、ご覧の通りNULL表示となります。

どこで使うの?

今回のテーブルで言えば「グループを軸にした調査を行うとき」に有効でしょう。内部結合では表示できていなかったチームDを合わせて表示することができているため、チームDには誰も所属していないことが一目でわかるようにできています。

「RIGHT OUTER JOIN」と「FULL OUTER JOIN」

LEFTの詳細さえわかってしまえばあとは簡単です。「RIGHT OUTER JOIN」はLEFTの逆、つまりJOINしている側のテーブルを軸に、処理を行う命令です。「FULL OUTER JOIN」 はその両方を指すわけです。

ただし一つ注意点があります。「FULL OUTER JOIN」は環境によっては、使用できません。その点に注意しましょう。(とは言っても「FULL OUTER JOIN」を使用するケースはほぼ無いと言えるので、おおきな問題にはならないかと思いますが…)

まとめ

今回はJOINのちがいについて見てきました。一番需要が高いのは内部結合でしょう。より深く学びたい場合は、以下のリンクを参考してみてください。

JOINは強力なコマンドなので、ぜひ自分でも使ってみて、理解を深めてみてください!

この記事を書いた人

学生時代を含めると、かれこれ10年以上プログラマーとして過ごしています。
様々な言語や環境、プロジェクトに関わってきましたので、より実践的な記事をみなさんにお届きるよう情報発信していきます!

目次