はじめに
データベースを扱う上で欠かせないのが「結合(JOIN)」です。
特にMySQLなどのリレーショナルデータベースでは、複数のテーブルを結びつけて必要なデータを取り出すことがよくあります。
この記事では、よく使われる内部結合(INNER JOIN)と外部結合(OUTER JOIN)について、図解と実例を交えながら解説します。
結合とは?
結合(JOIN)とは、複数のテーブルを特定の条件で結びつけて、ひとつの結果セットとして扱うことです。
個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。
例えば「ユーザー情報」と「注文情報」が別のテーブルにある場合、それらをつなぎ合わせて「誰が何を注文したか」を一覧にしたいことがあります。
内部結合(INNER JOIN)
特徴
- 両方のテーブルに存在するデータのみ取得
- 結合条件を満たさない行は結果に含まれない
構文
SELECT *
FROM users
INNER JOIN orders ON users.id = orders.user_id;
例
users テーブル
id | name |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
orders テーブル
user_id | item |
---|---|
1 | Book |
2 | Pen |
結果
id | name | user_id | item |
---|---|---|---|
1 | Alice | 1 | Book |
2 | Bob | 2 | Pen |
Charlie(id=3)は注文がないため、結果に含まれません。
参考文献
外部結合(OUTER JOIN)
外部結合は、片方のテーブルにしかないデータも含めたいときに使います。主に以下の2種類があります。
LEFT OUTER JOIN(左外部結合)
左側のテーブルのすべての行を取得し、右側に一致するものがなければNULL。
SELECT *
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
結果
id | name | user_id | item |
---|---|---|---|
1 | Alice | 1 | Book |
2 | Bob | 2 | Pen |
3 | Charlie | NULL | NULL |
RIGHT OUTER JOIN(右外部結合)
右側のテーブルのすべての行を取得し、左側に一致するものがなければNULL。
SELECT *
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
この場合は orders にしか存在しない行も取り出せます。
参考文献
使い分けのポイント
JOINの種類 | 取得される行 | よく使う場面 |
---|---|---|
INNER JOIN | 両方のテーブルに存在するデータのみ | 必要なデータを絞り込みたい時 |
LEFT OUTER JOIN | 左のテーブルのすべて + 右の一致するデータ | 左が「主」で右が「従」の場合 |
RIGHT OUTER JOIN | 右のテーブルのすべて + 左の一致するデータ | 右が主となる場合(使用頻度は少ない) |
ON と USING の違い
ON は結合条件を自由に書ける
SELECT * FROM users INNER JOIN orders ON users.id = orders.user_id;
USING はカラム名が同じ場合に簡潔に書ける
SELECT * FROM users INNER JOIN orders USING (id);
まとめ
- INNER JOIN:両方に存在するデータのみ
- LEFT OUTER JOIN:左側はすべて+右があれば結合
- RIGHT OUTER JOIN:右側はすべて+左があれば結合
結合を使いこなすことで、SQLの表現力がグッと上がります!まずは INNER JOIN と LEFT JOIN をしっかり使えるようになるのがオススメです!