MySQLの内部結合(INNER JOIN)と外部結合(OUTER JOIN)を理解する
yamaday0uです。
MySQLでOUTER JOINに触れる機会があったのですが、その時にINNER JOINとの違いを学びました。
というわけで両者の違いについて整理していきます。
スポンサーリンク
JOIN(テーブルの結合)とは
JOIN(テーブルの結合)とは2つ以上のテーブルのレコードを、関連するカラムに基づいて結合することです。
1度のSQL実行で、複数のテーブルからデータを取得したいときに大いに役立ちます。
JOINの方法にはINNER JOIN(内部結合)とOUTER JOIN(外部結合)の2つがあります。
OUTER JOINではさらに以下の3つの方法に分かれます。
- LEFT OUTER JOIN(左外部結合)
- RIGHT OUTER JOIN(右外部結合)
- FULL OUTER JOIN(完全外部結合)
ちなみにMySQLではFULL OUTER JOINをサポートしていません。
ベン図で見るINNER JOINとOUTER JOINの違い
INNER JOINとOUTER JOINの違いは、ベン図を使って図解すると理解しやすいです。
例を紹介するために、まずは前提条件を整理していきます。
前提条件
usersテーブルとgroupsテーブルを用意します。
usersテーブルにはidとnameの2つのカラムがあります。
id | name |
---|---|
1 | yamada |
2 | sato |
3 | takahashi |
4 | tanaka |
5 | kobayashi |
groupsテーブルにはid、name、user_idの3つのカラムがあります。
user_idはそのグループに所属するuserのidを表すと思ってください。
id | name | user_id |
---|---|---|
1 | groupA | 1 |
2 | groupB | 2 |
3 | groupC | 4 |
4 | groupD | 6 |
5 | groupE | 7 |
このあとのINNER JOINとOUTER JOINの説明で実践できるように上記データベースを作成するSQL文を用意しましたので、ご自分のデータベースアプリで実行してみてください。
CREATE DATABASE join_demo;
USE join_demo;
CREATE TABLE users (id Int AUTO_INCREMENT NOT NULL, name text, PRIMARY KEY (`id`));
CREATE TABLE groups (id Int AUTO_INCREMENT NOT NULL, name text, user_id Int, PRIMARY KEY (`id`));
INSERT INTO users (name) VALUES("yamada"), ("sato"), ("takahashi"), ("tanaka"), ("kobayashi");
INSERT INTO groups (name, user_id) VALUES("groupA", 1), ("groupB", 2), ("groupC", 4), ("groupsD", 6), ("groupE", 7);
さらに便宜上、以下のように表記します。
- A = user.id
- B = group.user_id
A = Bという条件で2つのテーブルを結合してデータを取り出してみます。
この後に説明するOUTER JOINでは、A = Bのように左側にA、右側にBがあるということを意識することが重要になります
まず、INNER JOINから説明します。
INNER JOIN
INNER JOINの場合は、AとBが重なる部分(A = B)のデータのみを結合してSELECTします。

LEFT OUTER JOIN
LEFT OUTER JOINの場合は、AとBが重なる部分(A = B)に加えて左側のAにしかないデータもSELECTします。

RIGHT OUTER JOIN
RIGHT OUTER JOINの場合は、AとBが重なる部分(A = B)に加えて右側のBにしかないデータもSELECTします。

スポンサーリンク
SQL文を実行して結果を確認してみる
では実際にどんな値が取得できるか、SQL文を実行して確認しましょう。
INNER JOIN
SELECT * FROM users INNER JOIN groups ON users.id = groups.user_id;
結果は以下のとおり。
users.idと groups.user_idが一致するデータだけが結合されて取得できました。

LEFT OUTER JOIN
続いて、左側のuser.idに焦点を置いたLEFT OUTER JOINで結合します。
SELECT * FROM users LEFT OUTER JOIN groups ON users.id = groups.user_id;
結果は以下のとおり。
user_idが3と5に一致するgroupsのデータがないため、 groups側のデータがNULLで結合されています。

RIGHT OUTER JOIN
最後に、右側のgroups.user_idに焦点を置いたRIGHT OUTER JOINで結合します。
SELECT * FROM users RIGHT OUTER JOIN groups ON users.id = groups.user_id;
結果は以下のとおり。
idが6と7に一致するusersのデータがないため、users側のデータがNULLで結合されています。

トップ画像:Mysql icons created by Freepik – Flaticon
yamaday0uを応援お願いします!あなたの1クリックが励みになります。
>> にほんブログ村