サイトアイコン ITC Media

【保存版】SQLの結合/JOINをマスター|実例付きで丁寧に解説

(最終更新月:2023年5月)

✔このような方へ向けて書かれた記事となります

「SQLのJOINとは何で、どのように使うのだろうか?」

「SQLのJOINの使い方を学びたい」

「SQLのJOINの具体的な使用例を見て理解したい」

✔当記事を通じてお伝えすること

この記事では、SQLのJOINの基本的な使い方から、各種の応用法まで、具体的な例を交えて詳細に説明します。

ぜひ最後までお読みください。

筆者プロフィール

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

JOINにおける基礎知識3選

SQLのJOIN句についての基礎知識をお伝えします。

まずは基礎を理解したうえで、応用へと進みましょう。

テーブル結合の基本的な説明

テーブル結合とは、複数のテーブルからデータを取り出し、ひとつのテーブルのように見せる操作のこと。

異なるテーブル間で関連性を持つデータを一度に取得するために使われます。

例えば、”商品”テーブルと”販売”テーブルに共通した商品IDで2つのテーブル結合。

別テーブルの情報も、結合すれば、商品の情報とその販売情報を一度に取得できるのです。

JOINとは?

SQLのJOINとは、異なるテーブルのデータを結合するための操作です。

関連するデータが複数のテーブルに分散して格納されている場合に使われます。

JOINにも種類があり、理解いただけば、より作業の効率化が進むでしょう。

JOINが使われる場面

JOINは、データが複数のテーブルに分散していて、それらを一元的に参照したい場合に使われます。

以下がいくつかの例です。

  1. 顧客と注文データ:例)顧客テーブルと注文テーブルから、顧客IDを元に、どの顧客がどの商品を注文したかを知る
  2. 従業員と部門データ: 例)従業員と部門のテーブルから、各従業員がどの部門に所属しているのかを把握する
  3. 製品と供給者データ:例)製品と供給者のテーブルから、どの製品と供給者が紐付いているかを一覧にする
  4. 学生と成績データの結合:例)学生と成績のテーブルから、各学生の成績詳細を知る
  5. 映画と俳優データの結合:例)映画テーブルと俳優テーブルがあり、どの映画にどの俳優が出演しているかを示す

JOINの種類

こちらでは、JOINの種類とその説明をしていきます。

JOINにもいくつか種類があるのです。

INNER JOIN (内部結合)

INNER JOINは、異なる二つのテーブルに共通するデータを取得するための操作です。

例えば、商品テーブルと注文テーブルがあるとします。

このとき、INNER JOINを用いることで商品IDが一致するレコードを結合し、商品名とその商品の注文情報を一度に取得することが可能です。

以下でいえば、重なっている部分です。

OUTER JOIN (外部結合)

UTER JOINは、一方のテーブルに存在し、もう一方のテーブルには存在しないデータも含めて取得するための操作です。

OUTER JOINには以下の3種類が存在します。

例えば、社員テーブルと部署テーブルで次のようなものがLEFT OUTER JOINです。

例はこちらです。

#部署
+------------+----------+
| 部署ID | 部署名 |
+------------+----------+
| 1 | 営業 |
| 2 | 人事 |
| 3 | IT   |
+------------+----------+

#社員
+------------+-------+------------+
| 社員ID | 名前 | 部署ID |
+------------+-------+------------+
| 1      | 田中 | 1      |
| 2      | 山田 | 2      |
| 3      | 鈴木 | NULL   |
+------------+-------+------------+

Left Outer Joinを使うと以下のようになります。

SELECT 社員.名前, 部署.部署名 FROM 社員 LEFT OUTER JOIN 部署 ON 社員.部署ID = 部署.部署ID;

結果

+-------+---------+
| 名前 | 部署名 |
+-------+---------+
| 田中 | 営業    |
| 山田 | 人事    |
| 鈴木 | NULL   |
+-------+---------+

部署IDではなく、存在する場合は部署名を抽出できるのです。

CROSS JOIN (クロス結合)

CROSS JOINは、2つのテーブルの全レコードの組み合わせを生成する操作です。

これは、2つのテーブル間で特定の関係性がない場合や、全ての組み合わせを確認したい場合に使用されます。

たとえば、商品テーブルと色テーブルがあるとします。

全ての商品が全ての色で提供される場合、CROSS JOINを用いることで全ての商品と色の組み合わせを一度に取得することができます。

例はこちら。

#商品テーブル
+----------+----------+
| 商品ID | 商品名     |
+----------+----------+
| 1      | ペン       |
| 2      | ノート     |
| 3      | エラーザー |
+----------+----------+

#色テーブル
+------+
| 色名 |
+------+
| 赤   |
| 青   |
| 緑   |
| 黒   |
+------+

こちらがコードです。

SELECT 商品.商品名, 色.色名 FROM 商品 CROSS JOIN 色;

結果

+-------+------+
| 商品名 | 色名 |
+-------+------+
| ペン   | 赤    |
| ペン   | 青    |
| ペン   | 緑    |
| ペン   | 黒    |
| ノート | 赤    |
| ノート | 青    |
| ノート | 緑    |
| ノート | 黒    |
| エラーザー | 赤    |
| エラーザー | 青    |
| エラーザー | 緑    |
| エラーザー | 黒    |
+-------+------+

全組み合わせが出力されます。

INNER JOINの具体的な使い方

次に、具体的な使い方を説明していきます。

INNER JOINの使用例(特定のテーブルを用いた例)

次に、実際のデータベースでINNER JOINを使用する例を見てみましょう。

以下に示す”Employees”テーブルと”Departments”テーブルを考えてみます。

Employeesテーブル

EmployeeIDNameDepartmentID
1John100
2Sarah200
3James100

Departmentsテーブル

DepartmentIDDepartmentName
100HR
200IT

以下のSQL文でEmployeesテーブルとDepartmentsテーブルをINNER JOINします。

SELECT Employees.Name, Departments.DepartmentName FROM Employees INNER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;

実行結果は以下のとおりとなります。

NameDepartmentName
JohnHR
SarahIT
JamesHR

INNER JOINの一般的な使用シーン

INNER JOINは、関連性のある2つのテーブルから関連するデータを取得する際に頻繁に使用されます。

顧客テーブルと注文テーブルがあり、特定の顧客が何を注文したかを一覧で見たい場合、顧客IDでテーブルを結合することで情報を取得できるのです。

OUTER JOINの具体的な使い方

OUTER JOINについて詳しく見ていきましょう。

INNER JOINとの違いを明確にしておく必要があります。

OUTER JOINの種類とそれぞれの使用例

LEFT OUTER JOINは前述しましたが、ほかの種類についても見ていきましょう。

LEFT OUTER JOIN

右外部結合(RIGHT OUTER JOIN)

左外部結合の逆の動作です。

セカンダリテーブルの全てのレコードと、一致する主テーブルのレコードを取得。

上記の社員と部署の例では以下のようになります。

SELECT 社員.名前, 部署.部署名 FROM 社員 RIGHT OUTER JOIN 部署 ON 社員.部署ID = 部署.部署ID;

結果

+-------+---------+
| 名前 | 部署名 |
+-------+---------+
| 田中 | 営業    |
| 山田 | 人事    |
| NULL | IT      |
+-------+---------+

部署が優先されているのがわかります。

FULL OUTER JOIN

主テーブルとセカンダリテーブルの両方から全てのレコードを取得します。

一致するレコードが存在しない場合はNULLを返します。

コードはこちら。

SELECT 社員.名前, 部署.部署名 FROM 社員 FULL OUTER JOIN 部署 ON 社員.部署ID = 部署.部署ID;
+-------+---------+
| 名前 | 部署名 |
+-------+---------+
| 田中 | 営業    |
| 山田 | 人事    |
| 鈴木 | NULL   |
| NULL | IT      |
+-------+---------+

OUTER JOINの一般的な使用シーン

OUTER JOINは、2つのテーブル間で一部のみが一致するデータを取得する際に使用されます。

例えば、全ての従業員と、それらの従業員が参加しているプロジェクトを一覧表示したい場合、一部の従業員がプロジェクトに参加していない可能性があります。

この情報を取得するには、OUTER JOINを使用しましょう。

CROSS JOINの具体的な使い方

CROSS JOINの具体的な使い方です。

以下から選びましょう。

CROSS JOINの使用例

CROSS JOINは、テーブル間のすべての可能な組み合わせを生成します。

例えば、”Colors”テーブルと”Sizes”テーブルがあり、全ての色とサイズの組み合わせを生成したい場合にCROSS JOINを使用します。

Colorsテーブル

ColorIDColor
1Red
2Green
3Blue

Sizesテーブル

SizeIDSize
1Small
2Medium
3Large

以下のSQL文でColorsテーブルとSizesテーブルをCROSS JOINします。

SELECT Colors.Color, Sizes.Size FROM Colors CROSS JOIN Sizes;

実行結果は以下の通りとなります。全ての色とサイズの組み合わせが生成されます。

ColorSize
RedSmall
RedMedium
RedLarge
GreenSmall
GreenMedium
GreenLarge
BlueSmall
BlueMedium
BlueLarge

CROSS JOINの一般的な使用シーン

CROSS JOINは、全ての可能な組み合わせを生成する必要がある場合に使用されます。

例えば、以下のような場面で使えるでしょう。

まとめ

本記事では、SQLのJOINについて学びました。

JOINは、2つ以上のテーブルから関連するデータを取得する強力なツール。

データ分析やデータベース管理において、JOINは非常に重要なスキルです。

実際のデータベースでこれらのJOINを使用して、異なるテーブルから必要な情報を取得する能力は、ビジネスの意思決定やインサイトの抽出に大きな力となります。

今後もさらに深くSQLを学び、その力を活用してください。

モバイルバージョンを終了