データベース

【MySQL入門④】テーブル結合とは?内部結合と外部結合を解説!

データベース

テーブル結合とは?

データベースはテーブル単位でデータをまとめています。
各テーブルのデータを使いたい場合、それぞれSELECT文でデータを取得すれば良いです。
ただ、テーブル同士のデータが紐づいている場合、データを取得した後に、データの紐付けを行う必要があります。
SQLでは、データ取得の際にテーブルを結合させることができ、紐付けたデータを取得することができます。

例えば、ユーザーの情報を管理しているusersテーブルと契約情報を管理しているcontractsテーブルがあるとします。
usersテーブルには、ユーザーの名前や住所の情報が管理されていて、contractsテーブルには、契約日や契約内容が管理されています。
ユーザー情報と契約情報は同時に取得したい場面があるので、contractsテーブルにuser_idというカラムを用意してusersテーブルのidと一致する様に紐付けて、どの契約が誰のかを判断することができます。

テーブルを結合する際に条件を付けることができます。usersテーブルのidとcontractsテーブルのuser_idが一致するデータを結合することで、ユーザー情報と契約情報を一回のSELECT文で取得できます。

テーブル結合

テーブル結合の方法は、内部結合と外部結合の2種類存在します。
以下のテーブルとデータを用意して解説します。

<usersテーブル>

idname
1山田太郎
2佐藤花子
3鈴木一郎

<contractsテーブル>

user_idstatus
1契約中
3未契約
4契約終了

内部結合

内部結合とは、2つのテーブルの値が一致するデータのみを結合して取得する方法です。

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

usersテーブルにcontractsテーブルを内部結合してみます。

SELECT id, name, status FROM users INNER JOIN contracts ON id = user_id;

idとuse_idが一致するデータのみ取得します。
contractsテーブルにuser_id=2のデータは存在しないので、佐藤花子のデータは取得されません。

<結果イメージ>

idnamestatus
1山田太郎契約中
3鈴木一郎未契約

外部結合

外部結合とは、2つのテーブルの値が一致するデータも一致しないデータも結合して取得する方法です。
外部結合にはいくつか種類がありますが、今回は「LEFT JOIN」と「RIGHT JOIN」を紹介します。
どちらもベースのテーブルに対して、他テーブルを結合します。ベースのテーブルのデータは結合条件を満たしていなくても取得します。

LEFT JOIN

JOINされる側のテーブルをベースとして、他テーブルを結合します。

SELECT カラム名 FROM テーブル名 LEFT JOIN テーブル名 ON 結合条件;

usersテーブルにcontractsテーブルをLEFT JOINしてみます。

SELECT id, name, status FROM users LEFT JOIN contracts ON id = user_id;

LEFT JOINの場合、結合条件が一致してもしなくてもusersテーブルのデータは取ってきます。
条件が一致しないレコードに関しては、NULLが取得されます。

<結果イメージ>

idnamestatus
1山田太郎契約中
3鈴木一郎未契約
2佐藤花子NULL
RIGHT JOIN

JOINする側のテーブルをベースとして、他テーブルを結合します。

SELECT カラム名 FROM テーブル名 RIGHT JOIN テーブル名 ON 結合条件;

usersテーブルにcontractsテーブルをRIGHT JOINしてみます。

SELECT id, name, status FROM users RIGHT JOIN contracts ON id = user_id;

RIGHT JOINの場合、結合条件が一致してもしなくてもcontractsテーブルのデータは取ってきます。
条件が一致しないレコードに関しては、NULLが取得されます。

<結果イメージ>

idnamestatus
1山田太郎契約中
3鈴木一郎未契約
NULLNULL契約終了

まとめ

テーブル結合ができる様になると、複数のテーブルから一気にデータを取ってこれます。
DB設計もテーブル結合を想定して設計しているので、今回紹介した結合は出来る様にしておきましょう。

タイトルとURLをコピーしました