Maison > base de données > tutoriel mysql > Une INNER JOIN remplace-t-elle une OUTER JOIN précédente dans SQL ?

Une INNER JOIN remplace-t-elle une OUTER JOIN précédente dans SQL ?

Mary-Kate Olsen
Libérer: 2025-01-09 10:22:40
original
816 Les gens l'ont consulté

Does an INNER JOIN Override a Preceding OUTER JOIN in SQL?

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

Bonnes pratiques :

  • Bien que ce ne soit pas strictement obligatoire, placer les INNER JOIN avant les OUTER JOIN peut améliorer la lisibilité, car les INNER JOIN représentent des conditions plus restrictives.
  • Utilisez les 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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal