ホームページ >データベース >mysql チュートリアル >左結合と内部結合: WHERE 句は左結合の結果にどのように影響しますか?

左結合と内部結合: WHERE 句は左結合の結果にどのように影響しますか?

DDD
DDDオリジナル
2025-01-03 18:53:441076ブラウズ

Left Join vs. Inner Join: How Does a WHERE Clause Affect a Left Join's Results?

左結合と内部結合

SQL では、左結合と内部結合は、異なる結果セットを生成する 2 つの基本的な結合タイプです。左結合は、左側のテーブルからすべての行を返し、結合条件に基づいて右側のテーブルの行と一致します。一致するものが見つからない場合、右側のテーブルの欠損値は NULL として表されます。対照的に、内部結合は結合条件を満たす行のみを返し、その条件を満たさない両方のテーブルの行を除外します。

左結合動作の変更

提供された SQL クエリ:

SELECT
a.foo
b.bar
c.foobar
FROM tableOne AS a
INNER JOIN tableTwo AS b ON a.pk = b.fk
LEFT JOIN tableThree AS c ON b.pk = c.fk
WHERE a.foo = 'something'
AND c.foobar = 'somethingelse'

WHERE c.foobar = の存在LEFT JOIN 条件の後の 'somethingelse' 句には、驚くべき効果があります。左結合を内部結合に変換しているようで、tableThree に「somethingelse」が存在しない場合は行が返されません。

説明

これは一見奇妙です動作は SQL ステートメントの評価順序から発生します。 WHERE 句は、結合の実行後に処理されます。したがって、WHERE 句で c.foobar = 'somethingelse' が指定されている場合、c.foobar が NULL である左結合からすべての行が効果的にフィルタリングされます。その結果、c.foobar が指定された値 ('somethingelse') に一致する行のみが最終的な結果セットに保持されます。

ソリューション

左結合の動作には、2 つのオプションがあります:

  1. WHERE 句を次のように変更します。以下に示すように、include OR c.foobar IS NULL:

    WHERE a.foo = 'something'
    AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)

    これにより、c.foobar が NULL である行を結果セットに含めることができます。

  2. c.foobar = 'somethingelse' 比較を左結合の ON 句に移動し、その条件を満たす行のみが結果に含まれるようにします。セット:

    LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'

以上が左結合と内部結合: WHERE 句は左結合の結果にどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。