「うちのチームでSQLを書く時、なんとなくLEFT JOINを使ってるけど、普通のJOINとの違いをちゃんと説明できない…」「結局JOINとLEFT JOINってどっちを使えばいいの?」
こんな経験はありませんか?データベース操作の基本であるJOINですが、意外と理解があいまいなまま使っている人は多いものです。今回は「今さら聞けない」と感じている方のために、JOINとLEFT JOINの違いと使い分けについて、初心者にもわかりやすく解説します!
JOINとLEFT JOINの基本的な違い
JOIN(内部結合)
JOINは両方のテーブルで一致するデータだけを返します。これは「INNER JOIN」とも呼ばれます。
SELECT * FROM テーブル1
JOIN テーブル2 ON テーブル1.列 = テーブル2.列
これは最も一般的な結合タイプで、条件に一致するデータだけが欲しい場合に使います。両方のテーブルでマッチするレコードのみが結果に含まれます。
LEFT JOIN(左外部結合)
LEFT JOINは左テーブルのすべてのデータと、右テーブルの一致するデータを返します。右テーブルに一致するデータがない場合は、NULL値で埋められます。
SELECT * FROM テーブル1
LEFT JOIN テーブル2 ON テーブル1.列 = テーブル2.列
一部のデータベースでは「LEFT OUTER JOIN」という完全な名称が使われますが、実際には「LEFT JOIN」と「LEFT OUTER JOIN」は全く同じ動作をします。OUTERはオプションの修飾子で、実際の動作に違いはありません。
わかりやすい例で理解する
以下の「社員」テーブルと「部署」テーブルを考えてみましょう:
社員テーブル
社員ID | 名前 | 部署ID |
---|---|---|
1 | 田中 | 1 |
2 | 鈴木 | 2 |
3 | 佐藤 | 3 |
4 | 高橋 | NULL |
部署テーブル
部署ID | 部署名 |
---|---|
1 | 営業 |
2 | 開発 |
5 | 人事 |
JOINを使った場合
SELECT 社員.名前, 部署.部署名
FROM 社員
JOIN 部署 ON 社員.部署ID = 部署.部署ID
結果
名前 | 部署名 |
---|---|
田中 | 営業 |
鈴木 | 開発 |
ここで注目すべきは、佐藤さんと高橋さんが結果に含まれていないことです。なぜなら:
- 佐藤さんの部署ID(3)に対応する部署がない
- 高橋さんは部署IDがNULL
LEFT JOINを使った場合
SELECT 社員.名前, 部署.部署名
FROM 社員
LEFT JOIN 部署 ON 社員.部署ID = 部署.部署ID
結果
名前 | 部署名 |
---|---|
田中 | 営業 |
鈴木 | 開発 |
佐藤 | NULL |
高橋 | NULL |
LEFT JOINを使うと、社員テーブルのすべての行が結果に含まれます。部署がない場合は部署名がNULLとなります。
よくある間違いと勘違い
1. WHERE句との組み合わせによる意図しない変換
LEFT JOINを使っているのに、そのあとのWHERE句で右テーブルの値を条件指定すると、実質的にJOIN(内部結合)と同じになってしまいます。
-- これは実質的にJOINと同じ結果になる
SELECT 社員.名前, 部署.部署名
FROM 社員
LEFT JOIN 部署 ON 社員.部署ID = 部署.部署ID
WHERE 部署.部署名 IS NOT NULL
2. 「全データを取得するため」という安易な使用
「とりあえず全部のデータが欲しいから」とLEFT JOINを習慣的に使うケースがあります。しかし、これは不必要にNULL値を増やし、パフォーマンスに影響する可能性があります。用途に合わせて適切に選びましょう。
使い分けのガイドライン:JOINとLEFT JOIN、どっちを使うべき?
JOINを使うべき場合
- 関連するデータだけを取得したい場合
- 両方のテーブルでマッチするデータのみが必要な場合
- 結合条件を満たさないデータは不要な場合
- 不一致データを除外してパフォーマンスを向上させたい場合
LEFT JOINを使うべき場合
- 左テーブルのすべてのデータを保持する必要がある場合
- 右テーブルに対応するデータがない場合も結果に含めたい場合
- 「〜がないレコードを見つける」という分析をしたい場合
- 存在チェック(データの有無を確認)をしたい場合
たとえば、「注文履歴のある顧客だけ」を知りたい場合はJOIN、「すべての顧客(注文がない顧客も含む)」を知りたい場合はLEFT JOINが適切です。
パフォーマンスへの影響:JOINとLEFT JOINの速度差
JOINとLEFT JOINのパフォーマンスの違いは、データベースやクエリの複雑さによって変わりますが、一般的には:
- JOINの方が高速: 処理が単純なため、多くの場合パフォーマンスが良い
- LEFT JOINはやや遅い: より多くの行を処理する必要があるため、大量データの場合は遅くなる可能性がある
- 複雑なクエリでの影響: 不必要なLEFT JOINの使用は最適化の妨げになることがある
- インデックス活用: どちらの場合も、適切なインデックスを設定することでパフォーマンスが大幅に向上する
PostgreSQLのドキュメントによれば、クエリプランナーは内部的に最適な結合方法を選択しますが、論理的な結合タイプ(JOINかLEFT JOIN)の選択は、求める結果に基づいて開発者が適切に行う必要があります。
具体的なユースケース:JOINとLEFT JOINの実践的な使い分け
JOINの典型的なユースケース
- 商品と在庫の結合: 在庫のある商品だけを表示する
- ユーザーとアクティビティの結合: アクティブなユーザーだけを分析する
- サービスとレビューの結合: レビューのあるサービスだけを抽出する
LEFT JOINの典型的なユースケース
- 顧客と注文の結合: すべての顧客(注文していない顧客も含む)を分析する
- 社員と営業成績の結合: 成績がない社員も含めた全社員リストを作成
- 製品と不具合報告の結合: 不具合報告のない製品も含めたすべての製品を確認
まとめ:JOINとLEFT JOINの違いを理解して適切に使い分けよう
- JOIN: 両方のテーブルで一致するデータだけを返す(交集合的な結果)
- LEFT JOIN: 左テーブルのすべてのデータと、右テーブルの一致するデータを返す(左テーブルを基準とした結果)
参考資料: