テーブル結合の種類の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_id
が6
のレコードや、右側テーブルのid
が2
や5
のレコードが除外されています。
これがINNER JOINです。テーブルを組み合わせて何かのデータを取得したい時に有効です。
INNER JOINの基本構文
INNER JOIN
の基本構文は下記です。
SELECT カラム名
FROM テーブル名1
INNER JOIN テーブル名2
ON 結合の条件;
考え方の流れは下記です。
FROM
の後に結合元となるテーブル名1を記載するINNER JOIN
の後に結合したいテーブル名2を記載するON
の後にテーブル名1とテーブル名2を結合するための条件を記載する
例えば、従業員情報を管理するemployeeテーブルと部署情報を管理するdepartmentテーブルを内部結合したい場合は下記のようなSQLになります。
SELECT *
FROM employee
INNER JOIN department
ON employee.department_id = department.id
employee.department_id = department.id
が結合の条件に該当します。
このように、不等号を用いて結合のための条件を指定します。
サンプルデータ
下記のとおり、usersテーブルとpartyテーブルを用意します。
partyテーブルは開催されるパーティーの情報を管理し、usersテーブルはパーティーの申込者を管理しています。
usersテーブル
id | name | party_id |
---|---|---|
1 | 山田 | 3 |
2 | 鈴木 | 4 |
3 | 佐藤 | 1 |
4 | 佐々木 | 4 |
5 | 丸山 | 7 |
partyテーブル
id | name |
---|---|
1 | ダンスパーティー |
2 | カクテルパーティー |
3 | レセプションパーティー |
4 | ディナーパーティー |
5 | ビュッフェパーティー |
INNER JOINでテーブルを結合する
それでは、具体例を交えてINNER JOIN
でテーブルを結合する方法を見ていきましょう。
検索クエリ
usersテーブルとpartyテーブルを内部結合して申込者とパーティーの一覧情報を取得する
SELECT *
FROM users
INNER JOIN party
ON users.party_id = party.id
考え方の流れは下記です。
- SELECT文でusersテーブルから全ての情報を取得する命令を出す
INNER JOIN
でpartyテーブルをusersテーブルに結合する命令を出すON
の後にusers.party_id = party.id
と書くことで、usersテーブルとpartyテーブルを結合するための条件を指定
実行結果
id | name | party_id | id | name |
---|---|---|---|---|
3 | 佐藤 | 1 | 1 | ダンスパーティー |
1 | 山田 | 3 | 3 | レセプションパーティー |
2 | 鈴木 | 4 | 4 | ディナーパーティー |
4 | 佐々木 | 4 | 4 | ディナーパーティー |
申込者情報とパーティー情報を一覧にして取得できました。
usersテーブルのparty_id
が7
のレコードや、partyテーブルのid
が2
や5
のレコードが除外されていることが分かります。
テーブル結合後のカラム名を指定する
先ほどの結果ではidカラムとnameカラムが2つずつ存在していて、第三者からすると何の値か判断がつきづらいです。
この問題を解決するために、AS句を使ってカラムに別名をつけます。
検索クエリ
usersテーブルとpartyテーブルを内部結合して申込者とパーティーの一覧情報を取得した上で、カラムに分かりやすい名前をつける
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
考え方の流れは下記です。
- まず、
AS
を使ってテーブルに別名をつける。usersテーブルはu
、partyテーブルはp
とする - テーブルにつけた別名を使ってカラムを指定する(
id
やname
は両方のテーブルに存在するため、どちらのテーブルのカラムを指しているかテーブルから指定する必要がある)。例えば、usersテーブルのidカラムはu.id
で指定できる - AS句を使ってカラムに別名をつける
実行結果
ユーザーID | 申込者の名前 | 申込をしたパーティーID | パーティーID | パーティーの名前 |
---|---|---|---|---|
3 | 佐藤 | 1 | 1 | ダンスパーティー |
1 | 山田 | 3 | 3 | レセプションパーティー |
2 | 鈴木 | 4 | 4 | ディナーパーティー |
4 | 佐々木 | 4 | 4 | ディナーパーティー |
カラムを別名に変えることができました。
こちらの方が断然分かりやすいと思います。
自分一人の分析用であれば特に名前を変えなくてもいいかもしれませんが、自分以外の人も分析結果を見る場合はカラム名を分かりやすい名前に変えましょう。
INNER JOINで追加の条件を指定する方法
INNER JOINで内部結合をする際に、合わせて検索条件を指定することができます。
INNER JOIN テーブル名 ON 結合の条件
の後にAND
で繋いで、検索条件を指定します。WHERE句で指定するのと同じようなイメージです。
検索クエリ
usersテーブルとpartyテーブルを内部結合して申込者とパーティーの一覧情報を取得する。また、取得するのはディナーパーティーの申込者のみとする
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 = 'ディナーパーティー'
と検索条件を指定しています。
実行結果
id | name | party_id | id | name |
---|---|---|---|---|
2 | 鈴木 | 4 | 4 | ディナーパーティー |
4 | 佐々木 | 4 | 4 | ディナーパーティー |
usersテーブルとpartyテーブルが内部結合された上で、検索条件のp.name = 'ディナーパーティー'
が反映されて、ディナーパーティーの申込者だけが取得できました。
WHERE句について知りたい方は下記でまとめています。
WHERE句を使って検索条件を指定する:SELECT文の基本INNER JOINで3つのテーブルを結合する方法
テーブル結合は2つのテーブルを結合することに限りません。3つ以上のテーブルを結合することも可能です。
usersテーブル、partyテーブルに加えて、下記に申込者の詳細プロフィールを管理するuser_profilesテーブルを用意します。
id | age | sex | user_id |
---|---|---|---|
1 | 25 | 男性 | 2 |
2 | 34 | 女性 | 3 |
3 | 40 | 女性 | 5 |
4 | 39 | 男性 | 7 |
5 | 46 | 男性 | 9 |
基本構文
3つ以上のテーブルの結合では、INNER JOIN
を次々と連結していく形になります。
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テーブルを結合して一覧で取得する
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回目の
INNER JOIN
でusersテーブルとpartyテーブルを内部結合 - 2回目の
INNER JOIN
でusersテーブルとuser_profilesを内部結合
実行結果
id | name | party_id | id | name | id | age | sex | user_id |
---|---|---|---|---|---|---|---|---|
2 | 鈴木 | 4 | 4 | ディナーパーティー | 1 | 25 | 男性 | 2 |
3 | 佐藤 | 1 | 1 | ダンスパーティー | 2 | 34 | 女性 | 3 |
3つのテーブルを結合した上で結果を取得できました。
u.party_id = p.id
とu.id = up.user_id
が両方成り立つレコードのみが残っていることになります。
内容のまとめ
- 内部結合はSQLにおけるテーブル同士を結合するための方法の一つで、それぞれのテーブルで指定したカラムの値が一致したレコードだけを結合する
- SQLで内部結合を実現するために使うのが
INNER JOIN
INNER JOIN
のINNER
を省略して単にJOIN
とすることもできるINNER JOIN
の基本構文はINNER JOIN 結合先のテーブル名 ON 結合の条件
- テーブル結合後は同じ名前のカラムが複数存在するケースも多いため、AS句を使ってカラムに別名をつけると分かりやすい
INNER JOIN
で追加の条件を指定するためには、ON 結合の条件
の後にAND
で繋いで検索の条件を指定するINNER JOIN
を2個使えば、3つのテーブルを結合できる