ホームページ >データベース >mysql チュートリアル >INNER JOIN は SQL の先行する OUTER JOIN をオーバーライドしますか?
SQL JOIN: INNER JOIN は先行する OUTER JOIN をオーバーライドしますか?
この記事では、SQL クエリにおける INNER JOIN
句と OUTER JOIN
句の間の相互作用について調査し、特に後続の INNER JOIN
が先行する OUTER JOIN
の効果を無効にするかどうかについて説明します。
簡単に言うと、「いいえ、自動的には機能しません」です。 ただし、INNER JOIN
は、先行する の効果を大幅に制限OUTER JOIN
する可能性があります。
鍵は ON
の INNER JOIN
節にあります。 ON
句で、NULL
が原因で OUTER JOIN
になる可能性がある列が必要な場合、INNER JOIN
はその列が NULL
である行を効果的に除外します。 これは、OUTER JOIN
を完全に無視するという意味での「オーバーライド」ではなく、フィルタリング効果です。
例 1: INNER JOIN は OUTER JOIN を否定しません
<code class="language-sql">SELECT * FROM person LEFT JOIN address ON person.address_id = address.id INNER JOIN email ON person.email_id = email.id;</code>
これは期待どおりに機能します。 INNER JOIN
の email
には有効な person.email_id
のみが必要です。 個人がアドレスを持っていない場合でも (address.id
が NULL
)、LEFT JOIN
にはその個人が含まれます。電子メールを持っている場合、INNER JOIN
にはその電子メール データが含まれます。
例 2: INNER JOIN は OUTER JOIN を制限します
<code class="language-sql">SELECT * FROM person LEFT JOIN address ON person.address_id = address.id INNER JOIN city ON address.city_id = city.id;</code>
ここで問題が発生します。 INNER JOIN
の city
には、NULL
以外の address.city_id
が必要です。 LEFT JOIN
の address
は NULL
address.city_id
を含む行を生成する可能性があるため、それらの行は INNER JOIN
によって除外されます。 OUTER JOIN
の効果は厳しく制限されています。
解決策: 例 2 の OUTER JOIN
の動作を維持するには、INNER JOIN
を LEFT JOIN
:
<code class="language-sql">SELECT * FROM person LEFT JOIN address ON person.address_id = address.id LEFT JOIN city ON address.city_id = city.id;</code>
ベストプラクティス:
INNER JOIN
はより制限的な条件を表すため、OUTER JOIN
の前に INNER JOIN
を配置すると読みやすくなります。RIGHT JOIN
は LEFT JOIN
より直感的ではない可能性があるため、慎重に使用してください。 多くの場合、テーブルを切り替えた LEFT JOIN
を使用すると、同じ結果がより明確に得られます。INNER JOIN
と OUTER JOIN
の間の相互作用を理解することは、効率的で正しい SQL クエリを作成するために重要です。 すべての結合の ON
句を慎重に検討して、目的の動作と一致していることを確認してください。
以上がINNER JOIN は SQL の先行する OUTER JOIN をオーバーライドしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。