【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があります。
- INNER JOIN
- LEFT JOIN
- 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を選ぶことが大切です!