ホームページ >データベース >mysql チュートリアル >左結合と内部結合: WHERE 句は左結合の結果にどのように影響しますか?
左結合と内部結合
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 つのオプションがあります:
WHERE 句を次のように変更します。以下に示すように、include OR c.foobar IS NULL:
WHERE a.foo = 'something' AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
これにより、c.foobar が NULL である行を結果セットに含めることができます。
c.foobar = 'somethingelse' 比較を左結合の ON 句に移動し、その条件を満たす行のみが結果に含まれるようにします。セット:
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
以上が左結合と内部結合: WHERE 句は左結合の結果にどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。