NU:LOGiC Logo

【SQL】JOINの書き方とその違い:INNER、LEFT、RIGHTの基本を解説!

【SQL】JOINの書き方とその違い:INNER、LEFT、RIGHTの基本を解説!

データベース操作において、複数のテーブル間でデータを結合する操作は非常に頻繁に行われるものです。特にSQLを利用してのデータ取得では、JOINというキーワードが中心的な役割を果たしています。しかし、JOINにはいくつかの種類があり、それぞれが異なるシチュエーションや要件に適しています。この記事では、それぞれのJOIN(INNER JOIN、LEFT JOIN、RIGHT JOIN)の基本的な特徴や、どのような場面でどのJOINを使用するのが最適なのかについて、具体的な例とともに詳しく解説しています。

3行で要約すると

  • SQLのJOIN操作は、複数のテーブルの関連するデータを結合するための重要な操作です。
  • INNER JOIN、LEFT JOIN、RIGHT JOINの3つの主要なJOINの種類があり、それぞれに特有の特徴と使用シナリオが存在します。
  • JOINを正しく利用することで、データベースからの情報取得が効率的かつ簡単に行えるようになります。

JOINとは?

JOINとは、複数のテーブル間で関連するデータを結合し、一つの結果セットとして表示するためのSQLの操作です。例えば、あなたが図書館のシステムのデータベースにアクセスするとき、本のテーブルと借り手のテーブルが別々に存在するかもしれません。それぞれのテーブルだけでは、どの本が誰によって借りられたかは分かりません。しかし、JOINを使用することで、それらのテーブルを結合し、本と借り手の関連情報を一度に取得することができます。

イメージとしては、2つのパズルのピースをつなぎ合わせるようなものです。それぞれのテーブルには「キー」と呼ばれる、他のテーブルとの関連を示すデータが含まれています。JOINを使うことで、このキーを基にしてデータを結合します。

具体的には、主に以下の3つの種類のJOINがあります。

  1. INNER JOIN
  2. LEFT JOIN
  3. RIGHT JOIN

それぞれのJOINの動作と特徴、そして適切な使用シーンを次のセクションで詳しく見ていきましょう。

INNER JOINの基本

定義と特徴

INNER JOIN、しばしばシンプルなJOINとも呼ばれるこの操作は、2つのテーブルが共有するキーに基づいてデータを結合します。このJOINの最大の特徴は、マッチするデータが存在する行だけが結果として表示される点です。

具体的に言うと、テーブルAとテーブルBがあったとき、テーブルAのある行のキーとテーブルBのある行のキーが一致する場合のみ、その行を結果に含めます。一致しない行は結果に表示されません。

具体例による解説

例として、studentsという学生の情報を持つテーブルと、coursesというコースの情報を持つテーブルを考えます。studentsテーブルには学生のIDと名前、coursesテーブルにはコース名と受講する学生のIDがあります。

students
| student_id | name  |
|------------|-------|
| 1          | Taro  |
| 2          | Hanako|
| 3          | Jiro  |

courses
| course_name | student_id |
|-------------|------------|
| Math        | 1          |
| English     | 2          |

INNER JOINを使って、どの学生がどのコースを受講しているのかを知りたい場合のSQLは以下のようになります。

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

このクエリの結果は以下のようになります。

| name   | course_name |
|--------|-------------|
| Taro   | Math        |
| Hanako | English     |

Jiroの名前が結果に含まれていないのは、Jiroがどのコースも受講していないからです。INNER JOINはマッチするデータのみを取得するため、このような結果になります。

LEFT JOINの基本

定義と特徴

LEFT JOIN(別名:LEFT OUTER JOIN)は、指定した「左側」のテーブルのすべての行を表示し、それと一致する「右側」のテーブルの行が存在する場合は、それらの情報も結合して表示します。右側のテーブルにマッチするデータが存在しない場合でも、左側のテーブルの行は結果に表示され、右側のテーブルのカラムはNULLで表示されます。

具体例による解説

先ほどのstudentsテーブルとcoursesテーブルを再度使用します。

もし、すべての学生と、その学生が受講しているコース(もし受講していれば)を知りたい場合、LEFT JOINを使用します。

SELECT students.name, courses.course_name
FROM students
LEFT JOIN courses ON students.student_id = courses.student_id;

このクエリの結果は以下のようになります。

| name   | course_name |
|--------|-------------|
| Taro   | Math        |
| Hanako | English     |
| Jiro   | NULL        |

Jiroはどのコースも受講していないため、course_nameカラムにはNULLが表示されます。しかし、INNER JOINとは違い、LEFT JOINではJiroの情報も結果に含まれる点がポイントです。これにより、受講していない学生も確認することができます。

RIGHT JOINの基本

定義と特徴

RIGHT JOIN(または RIGHT OUTER JOIN)は、基本的にLEFT JOINの反対操作を行います。指定した「右側」のテーブルのすべての行を表示し、それと一致する「左側」のテーブルの行が存在する場合は、それらの情報も結合して表示します。左側のテーブルにマッチするデータが存在しない場合でも、右側のテーブルの行は結果に表示され、左側のテーブルのカラムはNULLで表示されます。

具体例による解説

先ほどのstudentsテーブルとcoursesテーブルを利用して、RIGHT JOINの挙動を説明します。

すべてのコースと、そのコースを受講している学生(もし受講していれば)を知りたい場合、RIGHT JOINを使用します。

SELECT students.name, courses.course_name
FROM students
RIGHT JOIN courses ON students.student_id = courses.student_id;

このクエリの結果は以下のようになります。

| name   | course_name |
|--------|-------------|
| Taro   | Math        |
| Hanako | English     |
| NULL   | [新しいコース]   |

この例では、[新しいコース]というコースは誰も受講していないため、nameカラムにはNULLが表示されます。しかし、RIGHT JOINを使用することで、受講生がいないコースも結果として得られるのです。

ただし、一般的なシナリオではLEFT JOINの使用が一般的で、RIGHT JOINはあまり頻繁に使用されないことも多いです。なぜなら、ほとんどのケースでLEFT JOINで同じことが達成できるためです。しかし、データの構造や必要に応じてRIGHT JOINが便利な場面もありますので、その存在を知っておくことは重要です。

まとめ:各JOINの使いどころ

JOIN操作はデータベース操作の中で非常に重要な役割を果たします。複数のテーブル間の関係を理解し、適切なJOINを選択することで、必要な情報を効率よく取得することができます。今回紹介したJOINの種類とその特徴を簡単にまとめます。

  • INNER JOIN: 二つのテーブルが共有するキーに基づき、マッチするデータのみを結果として取得します。

  • LEFT JOIN: 「左側」のテーブルのすべてのデータを表示し、それとマッチする「右側」のテーブルのデータを結合します。マッチしない場合はNULLが表示されます。

  • RIGHT JOIN: LEFT JOINの反対で、「右側」のテーブルのすべてのデータを中心に表示します。

JOINの種類を選択する際は、取得したい情報やデータベースの構造を考慮する必要があります。どのテーブルの情報を主として取得したいか、どのテーブルの情報が不足していても問題ないかなど、シナリオに応じて最適なJOINを選ぶことが大切です!