【SQL】INNER JOINを使ってテーブルを結合する方法

テーブル結合の種類の1つであるINNER JOIN(内部結合)について解説します。

SQLでデータを取得する際に最もよく使う結合方法で、INNER JOINを知っているだけで分析の幅が全然違ってきます。

本記事を読んで、内部結合とは何か、INNER JOINの基本的な使い方についてマスターしましょう。

INNER JOIN(内部結合)とは

内部結合は、SQLにおけるテーブル同士を結合するための方法の一つで、それぞれのテーブルで指定したカラムの値が一致したレコードだけを結合します。

下記の図のようにA AND Bの条件になるということです。

どちらかのテーブルにしか存在しないレコードは除外されます。

INNER(内部)というだけあって、
テーブルAとテーブルBの一致したレコードのみを取得

そして、SQLで内部結合を実現するために使うのがINNER JOINです。INNERを省略して単にJOINと書くこともできます。

例えば、下記の図のように2つのテーブルが存在したとします。左側のテーブルのdepartment_idと右側のテーブルのidを起点に内部結合(INNER JOIN)しています。

すると、結合後のレコードにはどちらのカラムにも存在する値しか残っていないことが分かります。

左側テーブルのdepartment_id6のレコードや、右側テーブルのid25のレコードが除外されています。

これがINNER JOINです。テーブルを組み合わせて何かのデータを取得したい時に有効です。

INNER JOINの基本構文

INNER JOINの基本構文は下記です。

SQL
SELECT カラム名
FROM テーブル名1
INNER JOIN テーブル名2
ON 結合の条件;

考え方の流れは下記です。

  1. FROMの後に結合元となるテーブル名1を記載する
  2. INNER JOINの後に結合したいテーブル名2を記載する
  3. ONの後にテーブル名1とテーブル名2を結合するための条件を記載する

例えば、従業員情報を管理するemployeeテーブルと部署情報を管理するdepartmentテーブルを内部結合したい場合は下記のようなSQLになります。

SQL
SELECT *
FROM employee
INNER JOIN department
ON employee.department_id = department.id

employee.department_id = department.idが結合の条件に該当します。

このように、不等号を用いて結合のための条件を指定します。

サンプルデータ

下記のとおり、usersテーブルとpartyテーブルを用意します。

partyテーブルは開催されるパーティーの情報を管理し、usersテーブルはパーティーの申込者を管理しています。

usersテーブル

idnameparty_id
1山田3
2鈴木4
3佐藤1
4佐々木4
5丸山7
usersテーブル

partyテーブル

idname
1ダンスパーティー
2カクテルパーティー
3レセプションパーティー
4ディナーパーティー
5ビュッフェパーティー
partyテーブル

INNER JOINでテーブルを結合する

それでは、具体例を交えてINNER JOINでテーブルを結合する方法を見ていきましょう。

検索クエリ

usersテーブルとpartyテーブルを内部結合して申込者とパーティーの一覧情報を取得する

SQL
SELECT *
FROM users
INNER JOIN party
ON users.party_id = party.id

考え方の流れは下記です。

  1. SELECT文でusersテーブルから全ての情報を取得する命令を出す
  2. INNER JOINでpartyテーブルをusersテーブルに結合する命令を出す
  3. ONの後にusers.party_id = party.idと書くことで、usersテーブルとpartyテーブルを結合するための条件を指定

実行結果

idnameparty_idid name
3佐藤11ダンスパーティー
1山田33レセプションパーティー
2鈴木44ディナーパーティー
4佐々木44ディナーパーティー

申込者情報とパーティー情報を一覧にして取得できました。

usersテーブルのparty_id7のレコードや、partyテーブルのid25のレコードが除外されていることが分かります。

テーブル結合後のカラム名を指定する

先ほどの結果ではidカラムとnameカラムが2つずつ存在していて、第三者からすると何の値か判断がつきづらいです。

この問題を解決するために、AS句を使ってカラムに別名をつけます。

検索クエリ

usersテーブルとpartyテーブルを内部結合して申込者とパーティーの一覧情報を取得した上で、カラムに分かりやすい名前をつける

SQL
SELECT
  u.id AS 'ユーザーID',
  u.name AS '申込者の名前',
  u.party_id AS '申込をしたパーティーID',
  p.id AS 'パーティーID',
  p.name AS 'パーティーの名前'
FROM users AS u
INNER JOIN party AS p
ON u.party_id = p.id

考え方の流れは下記です。

  1. まず、ASを使ってテーブルに別名をつける。usersテーブルはu、partyテーブルはpとする
  2. テーブルにつけた別名を使ってカラムを指定する(idnameは両方のテーブルに存在するため、どちらのテーブルのカラムを指しているかテーブルから指定する必要がある)。例えば、usersテーブルのidカラムはu.idで指定できる
  3. AS句を使ってカラムに別名をつける

実行結果

ユーザーID申込者の名前申込をしたパーティーIDパーティーIDパーティーの名前
3佐藤11ダンスパーティー
1山田33レセプションパーティー
2鈴木44ディナーパーティー
4佐々木44ディナーパーティー

カラムを別名に変えることができました。

こちらの方が断然分かりやすいと思います。

自分一人の分析用であれば特に名前を変えなくてもいいかもしれませんが、自分以外の人も分析結果を見る場合はカラム名を分かりやすい名前に変えましょう。

INNER JOINで追加の条件を指定する方法

INNER JOINで内部結合をする際に、合わせて検索条件を指定することができます。

INNER JOIN テーブル名 ON 結合の条件の後にANDで繋いで、検索条件を指定します。WHERE句で指定するのと同じようなイメージです。

検索クエリ

usersテーブルとpartyテーブルを内部結合して申込者とパーティーの一覧情報を取得する。また、取得するのはディナーパーティーの申込者のみとする

SQL
SELECT *
FROM users AS u
INNER JOIN party AS p
ON u.party_id = p.id
AND p.name = 'ディナーパーティー'

ON u.party_id = p.idが内部結合の条件ですが、この後にANDで繋いでp.name = 'ディナーパーティー'と検索条件を指定しています。

実行結果

idnameparty_idid name
2鈴木44ディナーパーティー
4佐々木44ディナーパーティー

usersテーブルとpartyテーブルが内部結合された上で、検索条件のp.name = 'ディナーパーティー'が反映されて、ディナーパーティーの申込者だけが取得できました。

WHERE句について知りたい方は下記でまとめています。

WHERE句を使って検索条件を指定する:SELECT文の基本

INNER JOINで3つのテーブルを結合する方法

テーブル結合は2つのテーブルを結合することに限りません。3つ以上のテーブルを結合することも可能です。

usersテーブル、partyテーブルに加えて、下記に申込者の詳細プロフィールを管理するuser_profilesテーブルを用意します。

idagesexuser_id
125男性2
234女性3
340女性5
439男性7
546男性9
user_profilesテーブル

基本構文

3つ以上のテーブルの結合では、INNER JOINを次々と連結していく形になります。

SQL
SELECT カラム名
FROM テーブル名1
INNER JOIN テーブル名2
ON テーブル名1とテーブル名2の結合条件
INNER JOIN テーブル名3
ON テーブル名2とテーブル名3の結合条件
...

2回目のINNER JOINではテーブル名2とテーブル名3を結合していますが、テーブル名1とテーブル名3を結合とすることも可能です。

検索クエリ

usersテーブルとpartyテーブルとuser_profilesテーブルを結合して一覧で取得する

SQL
SELECT *
FROM users AS u
INNER JOIN party AS p
ON u.party_id = p.id
INNER JOIN user_profiles AS up
ON u.id = up.user_id

考え方の流れは下記です。

  1. 1回目のINNER JOINでusersテーブルとpartyテーブルを内部結合
  2. 2回目のINNER JOINでusersテーブルとuser_profilesを内部結合

実行結果

idnameparty_ididnameidage sexuser_id
2鈴木44ディナーパーティー125男性2
3佐藤11ダンスパーティー234女性3

3つのテーブルを結合した上で結果を取得できました。

u.party_id = p.idu.id = up.user_idが両方成り立つレコードのみが残っていることになります。

内容のまとめ

  • 内部結合はSQLにおけるテーブル同士を結合するための方法の一つで、それぞれのテーブルで指定したカラムの値が一致したレコードだけを結合する
  • SQLで内部結合を実現するために使うのがINNER JOIN
  • INNER JOININNERを省略して単にJOINとすることもできる
  • INNER JOINの基本構文はINNER JOIN 結合先のテーブル名 ON 結合の条件
  • テーブル結合後は同じ名前のカラムが複数存在するケースも多いため、AS句を使ってカラムに別名をつけると分かりやすい
  • INNER JOINで追加の条件を指定するためには、ON 結合の条件の後にANDで繋いで検索の条件を指定する
  • INNER JOINを2個使えば、3つのテーブルを結合できる