• ブログ
  • >
  • [SQLの基本]LEFT JOIN入門: VLOOKUPとの比較とINNER JOINとの使い分け

[SQLの基本]LEFT JOIN入門: VLOOKUPとの比較とINNER JOINとの使い分け

投稿日:

はじめに

データベースで複数のテーブルを結合する際に使用するLEFT JOINは、データ分析やアプリケーション開発に欠かせない機能です。多くの方がエクセルやGoogleスプレッドシートで使うVLOOKUPと似た動作をしますが、SQLにはLEFT JOINの他にもINNER JOINなどの種類があります。今回は、LEFT JOINを理解するために、VLOOKUPとの比較やINNER JOINとの使い分けについて解説します。

LEFT JOINの基本

LEFT JOINは、2つのテーブルを結合し、左側のテーブルのすべての行と、結合条件に一致する右側のテーブルの行を取得します。もし右側のテーブルに一致する行がなかった場合、右側のテーブルの列にはNULLが入ります。

SELECT 
  columns
FROM left_table
LEFT JOIN right_table ON left_table.key = right_table.key;
        

以下の2つのテーブルemployees(従業員)とdepartments(部門)を例にします。

employeesテーブル

employee_id
first_name
department_id
1John10
2Jane20
3Jack30

departmentsテーブル

department_id
department_name
10HR
20IT

このデータをピボット操作で次のように変換したいとします。

LEFT JOINを使用して、従業員とその所属部門名を取得します。

SELECT 
  e.employee_id, 
  e.first_name, 
  d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
        

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

employee_id
first_name
department_name
1JohnHR
2JaneIT
3JackNULL

Jackはdepartment_idが30で、departmentsテーブルに対応する行がないため、department_nameはNULLになります。

VLOOKUPとの比較

エクセルやGoogleスプレッドシートでデータを結合する際によく使用されるのがVLOOKUPです。VLOOKUPは指定したキーに基づいて他のシートのデータを検索し、関連する値を取得します。

=VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])

例 上記のemployeesテーブルにdepartmentsテーブルからdepartment_nameを追加するには、VLOOKUP関数を次のように使用します。

=VLOOKUP(C2, departments!A:B, 2, FALSE)

ここで、C2は検索する値(department_id)/ departments!A:Bは参照するテーブル範囲 2は取得する列のインデックス(department_name)/ FALSEは完全一致で検索することを示します。

LEFT JOINとVLOOKUPの違いは以下の通りです:

パフォーマンス

LEFT JOINはデータベースが最適化されているため、大量データの結合に適しています。一方、VLOOKUPは数千行以上になるとパフォーマンスが低下します。

結果の統一

LEFT JOINはSQLクエリで簡潔に結合が可能ですが、VLOOKUPは複数の列を結合する場合に複数回呼び出す必要があります。

NULLの取り扱い

LEFT JOINでは一致しない場合にNULLが返されますが、VLOOKUPでは見つからない場合に#N/Aエラーとなることがあります。

LEFT JOINとINNER JOINの使い分け

LEFT JOINの他に、INNER JOINというもう一つの一般的な結合方法があります。LEFT JOINとINNER JOINの違いを理解して使い分けることが重要です。

INNER JOINの基本

INNER JOINは、2つのテーブルで結合条件に一致する行のみを取得します。つまり、両方のテーブルにデータが存在する場合のみ、その行が結果に含まれます。

例 同じemployeesとdepartmentsテーブルをINNER JOINで結合した場合のクエリは次の通りです。

=SELECT 
  e.employee_id, 
  e.first_name, 
  d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;

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

employee_id
first_name
department_name
1JohnHR
2JaneIT

INNER JOINでは、departmentsテーブルに存在しないdepartment_idを持つJackの行は結果に含まれません。

LEFT JOINとINNER JOINの使い分け

1. すべてのデータが必要な場合はLEFT JOINを使用:

例えば、すべての従業員のリストを取得したいが、部門がまだ割り当てられていない従業員も含めたい場合はLEFT JOINが適しています。NULLの扱いが必要な場合にもLEFT JOINが有効です。

2. 両方のテーブルに一致するデータのみが必要な場合はINNER JOINを使用:

例えば、部門に所属している従業員のみのリストを取得したい場合はINNER JOINが適しています。両方のテーブルでマッチングが確実な場合や、不一致のデータを結果に含めたくない場合はINNER JOINを選びましょう。

まとめ

LEFT JOINは、エクセルやGoogleスプレッドシートのVLOOKUPと似た動作をしますが、より効率的で柔軟にデータを結合することができます。また、LEFT JOINとINNER JOINの違いを理解することで、適切な結合方法を選ぶことができます。両方のテーブルに一致するデータだけが必要ならINNER JOIN、左側のテーブルのすべてのデータを含めたいならLEFT JOINを使用しましょう。