Skip to content
  • Hash icon  SQL
  • 今さら聞けない!SQL JOINとLEFT JOINの違いと使い分け完全解説

    Calendar icon Published:
    今さら聞けない!SQL JOINとLEFT JOINの違いと使い分け完全解説

    「うちのチームで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: 左テーブルのすべてのデータと、右テーブルの一致するデータを返す(左テーブルを基準とした結果)

    参考資料: