はじめに
SQLのテーブル結合の理解がかなり曖昧だったので、自分なりにまとめてみました。
SQL初学者の方のご参考になれば幸いです。
また、記事内容に誤りを発見された場合は教えていただけますととても有難いです。
なお、本記事はChatGPTの力を借りながら自分で作成しました。
結合(JOIN)とは
SQLにおける 結合(JOIN) とは、複数のテーブルを繋ぎ合わせて1つの結果を作る操作のことです。
結合には、以下の種類があります。
- INNER JOIN(内部結合)
- LEFT JOIN(LEFT OUTER JOIN / 左外部結合)
- RIGHT JOIN(RIGHT OUTER JOIN / 右外部結合)
- FULL OUTER JOIN(完全外部結合)
- CROSS JOIN(クロス結合)
テーブルを結合することのメリット
- 複数テーブルに分かれた情報を統合できる
- 複数データにまたがる関連データを組み合わせて、欲しい形で取得できる
- データの冗長性をなくし、更新の手間やデータの矛盾を防げる
- 集計や分析がしやすくなる
- 拡張性・保守性が高ま
結合の基本構文
SELECT 列名, ...
FROM テーブルA
JOIN テーブルB
ON テーブルA.キー列 = テーブルB.キー列;
INNER JOIN(内部結合)とOUTER JOIN(外部結合)の違い
| 種類 | どんなデータが結果に残るか |
|---|---|
| INNER JOIN(内部結合) | 両方のテーブルに共通するデータだけ を残す |
| OUTER JOIN(外部結合) |
片方または両方のテーブルに存在するデータも残す(一致しない部分は NULL で埋める) |
読書管理テーブルとジャンル管理テーブルを用いて、それぞれの結合手法の扱い方についてまとめました。
↓読書管理テーブル
| ID | タイトル | 著者名 | ジャンルID | 読了日 | 金額 | お気に入り度 |
|---|---|---|---|---|---|---|
| 1 | コンビニ人間 | 村田紗耶香 | 1 | 2025/9/15 | 693 | 3 |
| 2 | 十角館の殺人 | 綾辻行人 | 1 | 2025/9/20 | 946 | 2 |
| 3 | 傲慢と善良 | 辻村深月 | 1 | 2025/9/25 | 891 | 2 |
| 4 | ケーキの切れない非行少年たち | 宮口幸治 | 3 | 2025/9/30 | 836 | 2 |
| 5 | アルジャーノンに花束を | ダニエル・キイス | 2 | 2025/10/3 | 1320 | 3 |
| 6 | 車輪の下 | ヘルマン・ヘッセ | NULL | 2025/10/10 | 539 | 3 |
↓ジャンル管理テーブル
| ID | ジャンル |
|---|---|
| 1 | 国内文学 |
| 2 | 海外文学 |
| 3 | 教養 |
| 4 | ノンフィクション |
| 5 | その他 |
INNER JOIN(内部結合)
INNER JOIN(内部結合) とは、2つ以上のテーブルを「共通の列(キー)」で結びつけて、両方に共通するデータだけを取り出す結合方法です。
例 : 「読書管理テーブル」と「ジャンル管理テーブル」を結合して、本のタイトルとそのジャンル名を一覧表示する
SELECT b.タイトル, g.ジャンル
FROM 読書管理 AS b
INNER JOIN ジャンル管理 AS g
ON b.ジャンルID = g.ID;
結果表
| タイトル | ジャンル |
|---|---|
| コンビニ人間 | 国内文学 |
| 十角館の殺人 | 国内文学 |
| 傲慢と善良 | 国内文学 |
| ケーキの切れない非行少年たち | 教養 |
| アルジャーノンに花束を | 海外文学 |
※「車輪の下」はジャンルIDがNULLの為、結果表では除外されます。
例 : 「読書管理テーブル」と「ジャンル管理テーブル」を結合して、本のタイトルとそのジャンル名と金額を一覧表示する
SELECT b.タイトル, g.ジャンル, b.金額
FROM 読書管理 AS b
INNER JOIN ジャンル管理 AS g
ON b.ジャンルID = g.ID
ORDER BY b.金額 DESC;
結果表
| タイトル | ジャンル | 金額 |
|---|---|---|
| アルジャーノンに花束を | 海外文学 | 1320 |
| 十角館の殺人 | 国内文学 | 946 |
| 傲慢と善良 | 国内文学 | 891 |
| ケーキの切れない非行少年たち | 教養 | 836 |
| コンビニ人間 | 国内文学 | 693 |
※ここでも「車輪の下」はジャンルIDがNULLの為、結果表では除外されます。
LEFT JOIN
LEFT JOINとは、左側(FROM側)のテーブルのすべての行」を基準にして、右側(JOIN側)に一致するデータがあれば結合し、一致しなければ NULL を入れて表示する結合です。
例 : 「読書管理テーブル」を基準にして、全ての本のタイトルとジャンル名を表示する
SELECT b.タイトル, g.ジャンル
FROM 読書管理 AS b
LEFT JOIN ジャンル管理 AS g
ON b.ジャンルID = g.ID;
結果表
| タイトル | ジャンル |
|---|---|
| コンビニ人間 | 国内文学 |
| 十角館の殺人 | 国内文学 |
| 傲慢と善良 | 国内文学 |
| ケーキの切れない非行少年たち | 教養 |
| アルジャーノンに花束を | 海外文学 |
| 車輪の下 | NULL(該当なし) |
RIGHT JOIN
RIGHT JOINとは、「右側(JOINの後に書かれた)テーブルを基準」にして、右側に存在するすべての行を表示し、左側に一致するデータがあれば結合、なければ NULL を入れる結合方法です。
例 : すべてのジャンルを表示し、そのジャンルに属する本のタイトルを取得する。
(まだ本が登録されていないジャンルも含める)
SELECT g.ジャンル, b.タイトル
FROM 読書管理 AS b
RIGHT JOIN ジャンル管理 AS g
ON b.ジャンルID = g.ID;
結果表
| ジャンル | タイトル |
|---|---|
| 国内文学 | コンビニ人間 |
| 国内文学 | 十角館の殺人 |
| 国内文学 | 傲慢と善良 |
| 海外文学 | アルジャーノンに花束を |
| 教養 | ケーキの切れない非行少年たち |
| ノンフィクション | NULL(該当なし) |
| その他 | NULL(該当なし) |
FULL JOIN
FULL JOINとは、「左側のテーブル」と「右側のテーブル」の両方を基準にして、どちらか一方にでも存在するデータをすべて表示する 結合方法です。
例 : 「読書管理テーブル」と「ジャンル管理テーブル」を結合して、全ての本と全てのジャンルを一覧表示する。
(ジャンル未登録の本も、まだ本がないジャンルも含める)
SELECT b.タイトル, g.ジャンル
FROM 読書管理 AS b
FULL JOIN ジャンル管理 AS g
ON b.ジャンルID = g.ID;
結果表
| タイトル | ジャンル |
|---|---|
| コンビニ人間 | 国内文学 |
| 十角館の殺人 | 国内文学 |
| 傲慢と善良 | 国内文学 |
| ケーキの切れない非行少年たち | 教養 |
| アルジャーノンに花束を | 海外文学 |
| 車輪の下 | NULL(ジャンル未登録) |
| NULL(本なし) | ノンフィクション |
| NULL(本なし) | その他 |
注意 : SQLiteにはFULL JOINがない!
SQLiteでは FULL JOIN はサポートされていません。
代わりに、LEFT JOIN と RIGHT JOIN(またはLEFT JOINの逆)をUNIONで組み合わせて同じ結果を作るなど、工夫が必要らしいです。
投稿者は初学者な上にSQLiteには明るくないので、気になる方は調べてください(>_<)
CROSS JOIN
CROSS JOINとは、これまでの INNER / LEFT / RIGHT / FULL JOIN と違って、
CROSS JOIN は「全組み合わせ」を作る特殊なJOINです。
CROSS JOINは、左側テーブルと右側テーブルのすべての組み合わせを作ります。
つまり、「読書管理テーブルの全行 × ジャンル管理テーブルの全行」を生成します。
例 : 「読書管理テーブル」と「ジャンル管理テーブル」の全ての組み合わせを表取得する
SELECT b.タイトル, g.ジャンル
FROM 読書管理 AS b
CROSS JOIN ジャンル管理 AS g;
結果表
| タイトル | ジャンル |
|---|---|
| コンビニ人間 | 国内文学 |
| コンビニ人間 | 海外文学 |
| コンビニ人間 | 教養 |
| コンビニ人間 | ノンフィクション |
| コンビニ人間 | その他 |
| 十角館の殺人 | 国内文学 |
| 十角館の殺人 | 海外文学 |
| …(省略)… | … |
| 車輪の下 | その他 |
CROSS JOINの注意点
- CROSS JOIN には 結合条件(
ON句)がない - 意図せず使うと、膨大な件数が出てしまうことがある
- 通常は「全パターンの組み合わせを試したい」ような分析時に使われる
- CROSS JOINを実務で扱うことは少ないが、テストデータの作成やパラメータの検証など、特定の条件下で扱われる
参考書籍