【SQL & データベース入門】JOINの種類と使い方|INNER JOINからLEFT JOINまで徹底解説

JOINとは何か?

JOINの概要

JOIN(ジョイン)とは、複数のテーブルを結合してデータを取得するためのSQLの機能です。リレーショナルデータベースでは、データが異なるテーブルに分割されていることが一般的であり、必要な情報を一つの結果として取得するにはJOINが欠かせません。

JOINを使えば、たとえば「顧客情報」と「注文情報」のように、異なるテーブルに保存された関連するデータを一度に取得することができます。

JOINが必要なシーン

  • 複数のテーブルに分散された情報を結合して表示したい場合
  • 顧客ごとの購入履歴や社員ごとの部署情報など、関連するデータをまとめたい場合

JOINの種類

1. INNER JOIN(内部結合)

概要

INNER JOINは、結合条件に一致するデータのみを取得します。共通部分のデータだけを取り出すため、最もよく使われるJOINの種類です。

基本構文

SELECT テーブル1.列名, テーブル2.列名
FROM テーブル1
INNER JOIN テーブル2
ON テーブル1.列名 = テーブル2.列名;

実際の使用例

customers テーブルと orders テーブルを結合して、顧客ごとの注文情報を取得します。

SELECT customers.name, orders.order_id
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;

このクエリは、顧客とその注文情報が一致するレコードのみを返します。

2. LEFT JOIN(左外部結合)

概要

LEFT JOINは、左側のテーブルにあるすべてのデータを取得し、右側のテーブルに一致するデータがない場合はNULLを返します。すべての左側のデータが優先されるため、データが完全に一致しない場合でも左側のデータを保持できます。

基本構文

SELECT テーブル1.列名, テーブル2.列名
FROM テーブル1
LEFT JOIN テーブル2
ON テーブル1.列名 = テーブル2.列名;

実際の使用例

顧客情報をすべて表示し、注文がない顧客も含めて表示します。

SELECT customers.name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;

このクエリでは、注文が存在しない顧客も結果に表示され、注文がない場合は NULL として表示されます。

3. RIGHT JOIN(右外部結合)

概要

RIGHT JOINは、右側のテーブルにあるすべてのデータを取得し、左側のテーブルに一致するデータがない場合はNULLを返します。LEFT JOINの逆バージョンと考えることができます。

基本構文

SELECT テーブル1.列名, テーブル2.列名
FROM テーブル1
RIGHT JOIN テーブル2
ON テーブル1.列名 = テーブル2.列名;

実際の使用例

すべての注文情報を表示し、注文がない顧客も含めて結果を出力します。

SELECT customers.name, orders.order_id
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;

このクエリは、すべての注文情報を取得し、対応する顧客が存在しない場合は NULL として表示します。

4. FULL OUTER JOIN(完全外部結合)

概要

FULL OUTER JOINは、左側と右側のテーブルの両方からすべてのデータを取得し、どちらかに一致するデータが存在しない場合はNULLを返します。

基本構文

SELECT テーブル1.列名, テーブル2.列名
FROM テーブル1
FULL OUTER JOIN テーブル2
ON テーブル1.列名 = テーブル2.列名;

実際の使用例

すべての顧客情報とすべての注文情報を表示し、どちらか一方にしか存在しないデータも含めて結果を取得します。

SELECT customers.name, orders.order_id
FROM customers
FULL OUTER JOIN orders ON customers.customer_id = orders.customer_id;

このクエリは、顧客情報または注文情報のいずれかが存在すればそのデータを返し、一方が存在しない場合は NULL を表示します。

5. CROSS JOIN(クロス結合)

概要

CROSS JOINは、2つのテーブル間で結合条件を指定せず、すべての組み合わせを作成します。そのため、レコード数が膨大になる可能性があります。

基本構文

SELECT テーブル1.列名, テーブル2.列名
FROM テーブル1
CROSS JOIN テーブル2;

実際の使用例

すべての顧客とすべての注文の組み合わせを取得します。

SELECT customers.name, orders.order_id
FROM customers
CROSS JOIN orders;

このクエリでは、各顧客に対してすべての注文が表示されます。

JOINを使ったパフォーマンス最適化

インデックスの活用

JOINで効率的にデータを結合するには、結合に使用する列にインデックスを設定することが重要です。インデックスが適切に設定されていると、検索速度が向上します。

CREATE INDEX idx_customer_id ON customers(customer_id);
CREATE INDEX idx_order_customer_id ON orders(customer_id);

必要な列だけを選択する

すべての列を取得する SELECT * を避け、必要な列だけを選択することで、パフォーマンスの向上が期待できます。

SELECT customers.name, orders.order_id
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;

LIMIT句を活用する

大量のデータを扱う場合、LIMIT 句を使用して取得するレコード数を制限することもパフォーマンス向上につながります。

SELECT customers.name, orders.order_id
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id
LIMIT 100;

JOINの応用例

ECサイトでの商品とカテゴリの結合

商品情報とカテゴリ情報を結合して、各商品の所属カテゴリを表示します。

SELECT products.name, categories.category_name
FROM products
INNER JOIN categories ON products.category_id = categories.category_id;

学校管理システムでの学生とコースの結合

学生情報と登録しているコース情報を結合して、各学生が受講しているコースを表示します。

SELECT students.name, courses.course_name
FROM students
INNER JOIN enrollments ON students.student_id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.course_id;

まとめ

JOINは、リレーショナルデータベースで複数のテーブルから必要なデータを効率よく取得するための基本技術です。INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN、CROSS JOINの使い方を理解し、適切な場面で使い分けることで、より効率的なデータ操作が可能になります。また、インデックスの設定や不要なデータの除外など、パフォーマンスの最適化も重要です。JOINの基本をしっかりマスターし、複雑なクエリにも対応できるようになりましょう。