【初心者向け】SQLのJOIN句の書き方と使い分け|INNER・LEFT・RIGHT・FULLの違いを図解で解説

データベース・SQL

「複数のテーブルを組み合わせて使いたい」
「共通の情報でデータをつなげたい」
「顧客情報と注文情報を一緒に見たい」
そんなときに欠かせないのが、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_idnameemail
1山田太郎yamada@example.com
2田中花子tanaka@example.com
3佐藤次郎sato@example.com

テーブル2:orders(注文テーブル)

order_idcustomer_id金額注文日
101120002024-01-15
102135002024-02-01
103415002024-02-10

INNER JOINの実例

クエリ

SELECT customers.name, orders.金額, orders.注文日
FROM customers
INNER JOIN orders
ON customers.customer_id = orders.customer_id;

結果

name金額注文日
山田太郎20002024-01-15
山田太郎35002024-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金額注文日
山田太郎20002024-01-15
山田太郎35002024-02-01
田中花子NULLNULL
佐藤次郎NULLNULL

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完全結合「両方全て含める」

今日からできること

  1. 簡単なINNER JOINから練習してみる
  2. テーブル設計を意識してサンプルデータを作成
  3. LEFT JOINでNULLの扱いに慣れる
  4. 実際のビジネスデータでJOINを活用してみる

コメント

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