SQL JOIN : une INNER JOIN remplace-t-elle une OUTER JOIN précédente ?
Cet article explore l'interaction entre les clauses INNER JOIN
et OUTER JOIN
dans les requêtes SQL, en s'intéressant spécifiquement à savoir si un INNER JOIN
suivant annule l'effet d'un OUTER JOIN
précédent.
La réponse courte est : Non, pas automatiquement. Cependant, un INNER JOIN
peut considérablement limiter l'effet d'un OUTER JOIN
précédent.
La clé réside dans la clause ON
du INNER JOIN
. Si la clause ON
nécessite une colonne qui pourrait être NULL
en raison du OUTER JOIN
, alors le INNER JOIN
filtrera efficacement les lignes où cette colonne est NULL
. Il ne s'agit pas d'un « remplacement » dans le sens d'une ignorance complète du OUTER JOIN
, mais plutôt d'un effet de filtrage.
Exemple 1 : INNER JOIN n'annule pas 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>
Cela fonctionne comme prévu. Le INNER JOIN
sur email
ne nécessite qu'un person.email_id
valide. Même si une personne n'a pas d'adresse (address.id
est NULL
), le LEFT JOIN
l'inclut toujours, et si elle a un e-mail, le INNER JOIN
inclut ces données d'e-mail.
Exemple 2 : INNER JOIN limite l'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>
Ici, le problème se pose. Le INNER JOIN
sur city
nécessite un non-NULL
address.city_id
. Étant donné que le LEFT JOIN
sur address
peut produire des lignes avec NULL
address.city_id
, ces lignes sont exclues par le INNER JOIN
. L'effet du OUTER JOIN
est sévèrement limité.
Solution : Pour conserver le comportement du OUTER JOIN
dans l'exemple 2, remplacez le INNER JOIN
par un 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>
Bonnes pratiques :
INNER JOIN
avant les OUTER JOIN
peut améliorer la lisibilité, car les INNER JOIN
représentent des conditions plus restrictives.RIGHT JOIN
avec prudence, car ils peuvent être moins intuitifs que les LEFT JOIN
. Souvent, un LEFT JOIN
avec les tables inversées obtiendra le même résultat plus clairement.Comprendre l'interaction entre INNER JOIN
et OUTER JOIN
est crucial pour écrire des requêtes SQL efficaces et correctes. Examinez attentivement les clauses ON
de toutes les jointures pour vous assurer qu'elles correspondent au comportement souhaité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!