yamaday0u Blog Written by yamaday0u

MySQLの内部結合(INNER JOIN)と外部結合(OUTER JOIN)を理解する

MYSQL

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つのカラムがあります。

idname
1yamada
2sato
3takahashi
4tanaka
5kobayashi
usersテーブル

groupsテーブルにはid、name、user_idの3つのカラムがあります。

user_idはそのグループに所属するuserのidを表すと思ってください。

idnameuser_id
1groupA1
2groupB2
3groupC4
4groupD6
5groupE7
groupsテーブル

このあとの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クリックが励みになります。
>> にほんブログ村