「複数のテーブルを組み合わせて使いたい」
「共通の情報でデータをつなげたい」
「顧客情報と注文情報を一緒に見たい」
そんなときに欠かせないのが、JOIN(ジョイン)構文です。
「JOINって難しそう…」
「どの種類を使えばいいの?」
そんな疑問をお持ちの方も多いでしょう。
しかし、基本的な考え方を理解すれば、JOINは決して難しいものではありません。
この記事では、SQLでのJOIN句の基本構文・各種JOINの使い分け・実用的な記述例を、プログラミング初心者にもわかりやすく解説します。
JOINとは?【概念の整理】

JOINってそもそも何?
JOIN(結合)とは、複数のテーブルを共通のキーでつなげるSQLの機能です。
1つのクエリで複数テーブルのデータをまとめて取得できます。
なぜJOINが必要なの?
実際のデータベースでは、情報を効率的に管理するために複数のテーブルに分けて保存することが多いです。たとえば:
- 「顧客テーブル」には顧客の基本情報
- 「注文テーブル」には注文の詳細情報
- 「商品テーブル」には商品の詳細情報
これらの情報を組み合わせて「どの顧客がいくらの商品を注文したか」といった情報を取得するために、JOINが使われます。
JOINの基本的な考え方
テーブル同士をつなぐ「橋」のような役割 JOINは、異なるテーブルにある関連するデータを、共通のキー(通常はIDなど)を使ってつなげる機能です。
まるで橋を架けるように、テーブル同士を関連付けます。
JOINの基本構文【INNER JOIN】

最も基本的なINNER JOINの書き方
基本構文
SELECT テーブルA.列名, テーブルB.列名
FROM テーブルA
INNER JOIN テーブルB
ON テーブルA.共通列 = テーブルB.共通列;
構文の説明
各部分の役割
SELECT
:取得したい列を指定FROM
:メインとなるテーブルを指定INNER JOIN
:結合するテーブルを指定ON
:どの列でテーブル同士をつなげるかを指定
INNER JOINの特徴
- 一致する行だけを取得します
- 最も基本的かつ頻繁に使われるJOINの形式です
- 両方のテーブルに存在するデータのみが結果に含まれます
簡単な例で理解しよう
例:社員テーブルと部署テーブルを結合
SELECT 社員.名前, 部署.部署名
FROM 社員
INNER JOIN 部署
ON 社員.部署ID = 部署.部署ID;
この例では、社員テーブルと部署テーブルを部署IDという共通の列でつなげています。
JOINの種類と使い分け

4つの主要なJOIN種類
JOIN種類 | 特徴 | 使用場面 |
---|---|---|
INNER JOIN | 両方のテーブルに共通データがある場合のみ取得 | 基本的な結合、確実に関連するデータのみ欲しい時 |
LEFT JOIN | 左側のテーブルのすべて+右側の一致するデータ | メインテーブルのデータを全て残したい時 |
RIGHT JOIN | 右側のテーブルのすべて+左側の一致するデータ | 結合先テーブルのデータを全て残したい時 |
FULL OUTER JOIN | 両方すべてのデータを取得 | 両方のテーブルのデータを漏れなく取得したい時 |
各JOINの動作イメージ
INNER JOIN:「両方にあるもの」だけ
- テーブルAとテーブルBの共通部分のみ
LEFT JOIN:「左側を基準」にして結合
- 左側のテーブルは全て残し、右側は一致するもののみ
RIGHT JOIN:「右側を基準」にして結合
- 右側のテーブルは全て残し、左側は一致するもののみ
FULL OUTER JOIN:「両方全て」を結合
- 両方のテーブルのデータを全て含める
実例:顧客と注文を結合する

サンプルデータの準備
テーブル1:customers(顧客テーブル)
customer_id | name | |
---|---|---|
1 | 山田太郎 | yamada@example.com |
2 | 田中花子 | tanaka@example.com |
3 | 佐藤次郎 | sato@example.com |
テーブル2:orders(注文テーブル)
order_id | customer_id | 金額 | 注文日 |
---|---|---|---|
101 | 1 | 2000 | 2024-01-15 |
102 | 1 | 3500 | 2024-02-01 |
103 | 4 | 1500 | 2024-02-10 |
INNER JOINの実例
クエリ
SELECT customers.name, orders.金額, orders.注文日
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id;
結果
name | 金額 | 注文日 |
---|---|---|
山田太郎 | 2000 | 2024-01-15 |
山田太郎 | 3500 | 2024-02-01 |
解説
- 田中花子と佐藤次郎は注文がないため結果に含まれません
- customer_id=4の注文は、顧客テーブルに存在しないため除外されます
- 山田太郎は2回注文しているため、2行の結果が表示されます
LEFT JOINの例(全顧客+注文情報)

LEFT JOINを使った場合
クエリ
SELECT customers.name, orders.金額, orders.注文日
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id;
結果
name | 金額 | 注文日 |
---|---|---|
山田太郎 | 2000 | 2024-01-15 |
山田太郎 | 3500 | 2024-02-01 |
田中花子 | NULL | NULL |
佐藤次郎 | NULL | NULL |
LEFT JOINの特徴
- 全ての顧客が結果に表示されます
- 注文がない顧客の金額と注文日はNULLになります
- 「顧客一覧と、もし注文があればその情報も」という場合に便利
実用的なLEFT JOINの活用例
注文していない顧客を見つける
SELECT customers.name
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id
WHERE orders.customer_id IS NULL;
この書き方で、まだ一度も注文していない顧客を特定できます。
RIGHT JOINとFULL OUTER JOINの例

RIGHT JOINの使用例
クエリ
SELECT customers.name, orders.金額, orders.注文日
FROM customers
RIGHT JOIN orders
ON customers.customer_id = orders.customer_id;
結果の特徴
- 全ての注文が結果に表示されます
- 顧客情報がない注文(customer_id=4)も含まれ、nameはNULLになります
FULL OUTER JOINの使用例
クエリ(MySQL以外のDBMS)
SELECT customers.name, orders.金額
FROM customers
FULL OUTER JOIN orders
ON customers.customer_id = orders.customer_id;
注意点
- MySQLではFULL OUTER JOINが直接サポートされていません
- その場合はLEFT JOINとRIGHT JOINをUNIONで組み合わせます
JOIN時の注意点とコツ

よくある間違いと対策
注意点 | 問題 | 対策 |
---|---|---|
テーブル名の指定漏れ | 同じ列名があると曖昧エラー | customers.name のように明示する |
ON句の条件ミス | 結合できない or 想定外の行数 | 結合キーを正しく指定する |
NULLの扱い | OUTER JOINでNULL値が混入 | WHERE句でNULLを適切に処理する |
パフォーマンス | 大量データで処理が遅い | インデックスの設定や結合順序を最適化 |
便利なテクニック
テーブル名の別名(エイリアス)
SELECT c.name, o.金額
FROM customers AS c
INNER JOIN orders AS o
ON c.customer_id = o.customer_id;
長いテーブル名を短縮することで、クエリが読みやすくなります。
複数テーブルの結合
SELECT c.name, o.金額, p.商品名
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id
INNER JOIN products p ON o.product_id = p.product_id;
3つ以上のテーブルも順次結合できます。
実践的な応用例
ビジネスでよく使われるパターン
売上分析のクエリ例
SELECT
c.name AS 顧客名,
COUNT(o.order_id) AS 注文回数,
SUM(o.金額) AS 合計金額,
AVG(o.金額) AS 平均金額
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.name
ORDER BY 合計金額 DESC;
このクエリで、顧客別の購買動向を分析できます。
データ分析でのJOIN活用
月別売上とトレンド分析
SELECT
DATE_FORMAT(o.注文日, '%Y-%m') AS 月,
COUNT(*) AS 注文数,
SUM(o.金額) AS 月間売上
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
GROUP BY DATE_FORMAT(o.注文日, '%Y-%m')
ORDER BY 月;
まとめ
SQLのJOINは、データベース活用の中核的なスキルです。基本を理解すれば、複雑なデータ分析も可能になります。
今回のポイントをおさらい
JOIN種類 | 使用場面 | 覚え方 |
---|---|---|
INNER JOIN | 基本的な結合 | 「共通部分のみ」 |
LEFT JOIN | メインテーブル基準 | 「左側を全て残す」 |
RIGHT JOIN | 結合先テーブル基準 | 「右側を全て残す」 |
FULL OUTER JOIN | 完全結合 | 「両方全て含める」 |
今日からできること
- 簡単なINNER JOINから練習してみる
- テーブル設計を意識してサンプルデータを作成
- LEFT JOINでNULLの扱いに慣れる
- 実際のビジネスデータでJOINを活用してみる
コメント