テーブル結合とは?
データベースはテーブル単位でデータをまとめています。
各テーブルのデータを使いたい場合、それぞれSELECT文でデータを取得すれば良いです。
ただ、テーブル同士のデータが紐づいている場合、データを取得した後に、データの紐付けを行う必要があります。
SQLでは、データ取得の際にテーブルを結合させることができ、紐付けたデータを取得することができます。
例えば、ユーザーの情報を管理しているusersテーブルと契約情報を管理しているcontractsテーブルがあるとします。
usersテーブルには、ユーザーの名前や住所の情報が管理されていて、contractsテーブルには、契約日や契約内容が管理されています。
ユーザー情報と契約情報は同時に取得したい場面があるので、contractsテーブルにuser_idというカラムを用意してusersテーブルのidと一致する様に紐付けて、どの契約が誰のかを判断することができます。
テーブルを結合する際に条件を付けることができます。usersテーブルのidとcontractsテーブルのuser_idが一致するデータを結合することで、ユーザー情報と契約情報を一回のSELECT文で取得できます。
テーブル結合
テーブル結合の方法は、内部結合と外部結合の2種類存在します。
以下のテーブルとデータを用意して解説します。
<usersテーブル>
id | name |
1 | 山田太郎 |
2 | 佐藤花子 |
3 | 鈴木一郎 |
<contractsテーブル>
user_id | status |
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のデータは存在しないので、佐藤花子のデータは取得されません。
<結果イメージ>
id | name | status |
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が取得されます。
<結果イメージ>
id | name | status |
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が取得されます。
<結果イメージ>
id | name | status |
1 | 山田太郎 | 契約中 |
3 | 鈴木一郎 | 未契約 |
NULL | NULL | 契約終了 |
まとめ
テーブル結合ができる様になると、複数のテーブルから一気にデータを取ってこれます。
DB設計もテーブル結合を想定して設計しているので、今回紹介した結合は出来る様にしておきましょう。