[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 |
---|---|---|
1 | John | 10 |
2 | Jane | 20 |
3 | Jack | 30 |
departmentsテーブル
department_id | department_name |
---|---|
10 | HR |
20 | IT |
このデータをピボット操作で次のように変換したいとします。
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 |
---|---|---|
1 | John | HR |
2 | Jane | IT |
3 | Jack | NULL |
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 |
---|---|---|
1 | John | HR |
2 | Jane | IT |
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を使用しましょう。