Webサイト制作コースのお申し込みはこちら

SQLでデータを取得する際、複数のテーブルからデータを取得したいケースは頻繁に訪れます。

本記事では、複数テーブルからデータを取得する際に利用するJOIN句を使ったテーブル結合について解説していきます。

SQLのテーブル結合の種類を知ろう


SQLのテーブル結合には大きく分け2種類の方法が存在します。

他にもクロス結合や自己結合といったテーブル結合が存在しますが、あまり利用されることも多くないため、今回は一般的な下記の2種類をご紹介していきます。

  • 内部結合(INNER JOIN)
  • 外部結合(OUTER JOIN)

サンプルデータ

今回サンプルとして利用するデータは下記の2つのテーブルです。

officeテーブル

+------+--------------------+-----------+
| id   | office_name        | region_id |
+------+--------------------+-----------+
|    1 | 新宿支店            |         3 |
|    2 | 渋谷支店            |         3 |
|    3 | 函館支店            |         1 |
|    4 | 梅田支店            |         5 |
|    5 | 那覇支店            |         9 |
|    6 | ソウル支店          |        99 |
|    7 | バンコク支店        |        99 |
+------+--------------------+-----------+

regionテーブル

+------+-------------+
| id   | region_name |
+------+-------------+
|    1 | 北海道      |
|    2 | 東北        |
|    3 | 関東        |
|    4 | 中部        |
|    5 | 近畿        |
|    6 | 中国        |
|    7 | 四国        |
|    8 | 九州        |
|    9 | 沖縄        |
+------+-------------+

SQLのテーブル結合1: 内部結合(INNER JOIN)


最初に内部結合(INNER JOIN)から説明していきます。

内部結合では、両テーブルで指定したカラムの値が一致するデータのみを抽出する方法です。

基本構文

内部結合(INNER JOIN)の基本構文は下記となります。

SELECT カラム名(, カラム名, ...)
FROM テーブル1
INNER JOIN テーブル2
ON テーブル2.カラム名 = テーブル1.カラム名

サンプル1

では実際にサンプルデータから内部結合でデータを取得してみたいと思います。

今回はofficeテーブルのregion_idとregionテーブルのidが一致するデータを抽出するSQLを作成してみましょう。

SELECT *
FROM office
INNER JOIN region
ON region.id = office.region_id;

実行した結果が下記の通りです。

+------+--------------+-----------+------+-------------+
| id   | office_name  | region_id | id   | region_name |
+------+--------------+-----------+------+-------------+
|    3 | 函館支店      |         1 |    1 | 北海道      |
|    1 | 新宿支店      |         3 |    3 | 関東        |
|    2 | 渋谷支店      |         3 |    3 | 関東        |
|    4 | 梅田支店      |         5 |    5 | 近畿        |
|    5 | 那覇支店      |         9 |    9 | 沖縄        |
+------+--------------+-----------+------+-------------+

このように双方のテーブルで一致するデータのみが抽出されています。

サンプル2

もちろんWHERE句で条件指定を加えることも可能です。

例えば関東地方のデータのみを抽出したい場合には下記のように記述することが出来ます。

SELECT *
FROM office
INNER JOIN region
ON region.id = office.region_id
WHERE region.id = 3;

実行した結果が下記の通りです。

+------+--------------+-----------+------+-------------+
| id   | office_name  | region_id | id   | region_name |
+------+--------------+-----------+------+-------------+
|    1 | 新宿支店      |         3 |    3 | 関東         |
|    2 | 渋谷支店      |         3 |    3 | 関東         |
+------+--------------+-----------+------+-------------+

SQLのテーブル結合2: 外部結合(OUTER JOIN)


続いて外部結合(OUTER JOIN)は、軸となるテーブルのデータ全てに加えて、条件に一致したもう片方のデータを取得します。

外部結合にはLEFT OUTER JOINとRIGHT OUTER JOINが存在します。

一般的にはLEFT OUTER JOINが利用されるため、特に理由がない限りはLEFT OUTER JOINを使用すると覚えておきましょう。

LEFT OUTER JOIN

まずはLEFT OUTER JOINの基本構文です。

FROM句の後ろに記述する「テーブル1」が軸のテーブルとなります。

SELECT カラム名(, カラム名, ...)
FROM テーブル1
LEFT (OUTER) JOIN テーブル2
ON テーブル2.カラム名 = テーブル1.カラム名;
ポテパンダの一言メモ

外部結合ではOUTERの部分を記述せず、LEFT JOIN・RIGHT JOINと記述する方法でも問題ありません。

サンプル

では実際にサンプルで確認してみましょう。

SELECT *
FROM office
LEFT JOIN region
ON region.id = office.region_id;

実行した結果が下記の通りです。

+------+--------------------+-----------+------+-------------+
| id   | office_name        | region_id | id   | region_name |
+------+--------------------+-----------+------+-------------+
|    3 | 函館支店            |         1 |    1 | 北海道       |
|    1 | 新宿支店            |         3 |    3 | 関東        |
|    2 | 渋谷支店            |         3 |    3 | 関東        |
|    4 | 梅田支店            |         5 |    5 | 近畿        |
|    5 | 那覇支店            |         9 |    9 | 沖縄        |
|    6 | ソウル支店          |        99 | NULL | NULL        |
|    7 | バンコク支店        |        99 | NULL | NULL        |
+------+--------------------+-----------+------+-------------+

このように、軸となるテーブルのデータが全て取得され、結合対象のテーブルに該当データが存在しない場合はNULLが表示されます。

RIGHT OUTER JOIN

では今度はRIGHT OUTER JOINの基本構文を確認してみましょう。

RIGHT OUTER JOINでは、テーブル2が軸となるテーブルです。

SELECT カラム名(, カラム名, ...)
FROM テーブル1
RIGHT (OUTER) JOIN テーブル2
ON テーブル2.カラム名 = テーブル1.カラム名;

サンプル

LEFT OUTER JOINのサンプルをRIGHT OUTER JOINに変えたシンプルなものです。

SELECT *
FROM office
RIGHT JOIN region
ON region.id = office.region_id;

結果は下記の通りです。

+------+--------------+-----------+------+-------------+
| id   | office_name  | region_id | id   | region_name |
+------+--------------+-----------+------+-------------+
|    1 | 新宿支店      |         3 |    3 | 関東        |
|    2 | 渋谷支店      |         3 |    3 | 関東        |
|    3 | 函館支店      |         1 |    1 | 北海道      |
|    4 | 梅田支店      |         5 |    5 | 近畿        |
|    5 | 那覇支店      |         9 |    9 | 沖縄        |
| NULL | NULL         |      NULL |    2 | 東北        |
| NULL | NULL         |      NULL |    4 | 中部        |
| NULL | NULL         |      NULL |    6 | 中国        |
| NULL | NULL         |      NULL |    7 | 四国        |
| NULL | NULL         |      NULL |    8 | 九州        |
+------+--------------+-----------+------+-------------+

軸となるテーブルが変更されたことにより、取得結果が大きく異なることをご確認頂けます。

さいごに:SQLのテーブル結合はシステム開発において必須


本記事では、SQLのテーブル結合の中でも、特に利用機会の多い「内部結合」と「外部結合」についてご紹介してきました。

SQL初心者の方には、使いどころの判断が難しいかも知れませんが、様々なデータ取得を繰り返すことで感覚的に理解出来るようになっていきます。

ご自身が利用したいデータを取得するには、どちらのテーブル結合を使用するべきか考えながら、様々なデータ取得処理に挑戦してみてください。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。