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

データベースからデータを取得する際、2つ以上のテーブルからそれぞれデータを取得したいといったケースは頻繁に起こり得ます。

テーブル結合には、内部結合(INNER JOIN)と外部結合(OUTER JOIN)、更に交差結合(CROSS JOIN)と呼ばれる方法が存在します。

本記事では、SQLの内部結合(INNER JOIN)に特化した形で、基本的な構文やサンプルを交えながら使い方についてご紹介していきたいと思います。

SQLの内部結合 INNER JOINの基本構文


まずはSQLの内部結合で利用する、INNER JOINの基本構文を確認していきましょう。

INNER JOINの基本

INNER JOINを用いたSQLの記述方法は下記の通りです。

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

ON句にテーブルの結合条件を指定し、一致するデータを取得します。

ポテパンダの一言メモ

ON句に指定するテーブル名の順番は特に指定はありませんが、INNER JOINに指定したテーブル名を先に記述する方法が慣例的に多いようです。

INNER JOINの省略形

INNER JOINは省略形を用いて、「JOIN」と記述するだけでも内部結合として処理が実行されます。

ただし、慣例的にINNNER JOINと省略せずに記述する方法が推奨されています。

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

SELECTのテーブル名は、結合した双方のテーブルに同名のカラムが存在する場合に必要です。
もちろん「*」で両方のテーブルの全てのカラムを取得することも可能です。

SQLの内部結合を利用してデータを取得してみよう


では実際にSQLの内部結合でデータを取得するサンプルで、具体的な動きを確認してみましょう。

今回使用するテーブルは下記の2テーブルとなります。

user

+------+--------------+------+
| id   | name         | age  |
+------+--------------+------+
|    1 | 山田花子     |   22 |
|    2 | 山田太郎     |   33 |
|    3 | 佐藤一郎     |   44 |
+------+--------------+------+

purchase

+------+---------------------+---------+------------+
| id   | pur_date            | user_id | product_id |
+------+---------------------+---------+------------+
|    1 | 2020-01-01 12:00:02 |       2 |          3 |
|    2 | 2020-01-03 14:00:00 |       1 |          3 |
|    3 | 2020-01-03 16:00:00 |       2 |          1 |
+------+---------------------+---------+------------+

サンプルで動作確認してみよう

では実際に「user」テーブルと「purchase」テーブルを結合して、内部結合の動きを見ていきましょう。

今回はユーザーのidを使用してテーブルを結合するサンプルです。

SELECT *
FROM user
INNER JOIN purchase
ON purchase.user_id = user.id;

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

+------+--------------+------+------+---------------------+---------+------------+
| id   | name         | age  | id   | pur_date            | user_id | product_id |
+------+--------------+------+------+---------------------+---------+------------+
|    2 | 山田太郎     |   33 |    1 | 2020-01-01 12:00:02 |       2 |          3 |
|    1 | 山田花子     |   22 |    2 | 2020-01-03 14:00:00 |       1 |          3 |
|    2 | 山田太郎     |   33 |    3 | 2020-01-03 16:00:00 |       2 |          1 |
+------+--------------+------+------+---------------------+---------+------------+

「user」テーブルのidと「purchase」テーブルのuser_idが一致するデータのみが抽出されており、「purchase」テーブルに存在しないuser_idが3のデータは対象外となっていることがご確認頂けます。

SQLで複数のテーブルを内部結合するには?


上述したSQLでユーザーの購入履歴は分かりましたが、product_idが何か分からないため、どんな商品を購入したのかが分かりません。

2つ以上のテーブルを結合する方法についても確認しておきましょう。

ポテパンダの一言メモ

商品管理用のテーブルproductを今回サンプルとして追加します。

product

+------+-----------------------+--------+
| id   | name                  | price  |
+------+-----------------------+--------+
|    1 | ノートパソコン          | 100000 |
|    2 | スマートフォン          |  50000 |
|    3 | タブレット              |  70000 |
+------+-----------------------+--------+

2つ以上のテーブルを結合する基本構文

まずは2つ以上のテーブルを結合する基本構文について確認しておきましょう。

書き方は簡単で、1つだけのテーブル結合にINNER JOINを繋げていくだけです。

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

サンプルコードで確認しよう

今回は上記サンプルに追加で「purchase」テーブルのproduct_idと「product」テーブルのidを繋げて商品名を取得したいと思います。

また今回は取得するデータをいくつかのカラムに絞って抽出してみましょう。

SELECT user.id, user.name, purchase.pur_date, product.name, product.price
FROM user
INNER JOIN purchase
ON purchase.user_id = user.id
INNER JOIN product
ON product.id = purchase.product_id;

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

+------+--------------+---------------------+-----------------------+--------+
| id   | name         | pur_date            | name                  | price  |
+------+--------------+---------------------+-----------------------+--------+
|    2 | 山田太郎     | 2020-01-03 16:00:00  | ノートパソコン           | 100000 |
|    2 | 山田太郎     | 2020-01-01 12:00:02  | タブレット              |  70000 |
|    1 | 山田花子     | 2020-01-03 14:00:00  | タブレット              |  70000 |
+------+--------------+---------------------+-----------------------+--------+

さいごに:SQLの内部結合は実務では必須の知識


本記事では、SQLの内部結合(INNER JOIN)の基本的な使い方をご紹介してきました。

データベースを利用するシステム開発において、内部結合の使い方は必須となる知識です。

SQLのテーブル結合は、まだまだ様々な記述方法やルールがありますので、まずは内部結合の基本をしっかりと理解した上で、1つずつ使いこなせるように挑戦していきましょう。

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

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

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

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

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

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

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

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

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

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

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