Maison > base de données > tutoriel mysql > WHERE vs ON dans les clauses JOIN : quand le placement du filtre est-il important ?

WHERE vs ON dans les clauses JOIN : quand le placement du filtre est-il important ?

Mary-Kate Olsen
Libérer: 2025-01-05 08:12:40
original
992 Les gens l'ont consulté

WHERE vs. ON in JOIN Clauses: When Does Filter Placement Matter?

Comprendre la distinction entre les clauses WHERE et ON dans les requêtes JOIN

Considérez les scénarios suivants lors de la jointure de deux tables, Foo et Bar, en fonction de leur colonne BarId :

INNER JOIN avec WHERE Clause

SELECT * 
FROM Foo f
INNER JOIN Bar b ON b.BarId = f.BarId
WHERE b.IsApproved = 1;
Copier après la connexion

INNER JOIN with ON Clause

SELECT * 
FROM Foo f
INNER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);
Copier après la connexion

Ces deux requêtes renvoient les mêmes résultats. Cependant, lorsqu’il s’agit de jointures externes, une différence cruciale apparaît. Explorons l'utilisation d'un LEFT OUTER JOIN :

LEFT OUTER JOIN avec le filtre de clause ON

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId); 
Copier après la connexion

LEFT OUTER JOIN avec le filtre de clause WHERE

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved = 1); 
Copier après la connexion

Dans la première requête, les lignes de la table de droite (Bar) sont filtré en fonction de la colonne IsApproved pendant le processus de jointure. A l'inverse, dans la deuxième requête, ce filtrage est effectué après la jointure.

Cette distinction devient significative lorsqu'il y a une valeur nulle pour b.BarId. Dans la première requête, ces lignes seront toujours incluses dans les résultats (avec des valeurs nulles pour les colonnes de Bar). Dans la deuxième requête, ces lignes seront filtrées par la clause WHERE.

Équivalence pour les filtres OPTIONNELS

Pour un filtre OPTIONAL (par exemple, b.IsApproved n'est pas restreint), l'équivalent LEFT OUTER JOIN avec une clause WHERE serait :

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved IS NULL OR b.IsApproved = 1);
Copier après la connexion

Ceci considère à la fois le cas où la jointure échoue (b.BarId est nul et le filtre doit être ignoré) et le cas où la jointure réussit et le filtre doit être appliqué.

Conclusion

Bien que le placement d'un filtre dans la clause WHERE ou ON puisse sembler à première vue sans conséquence, les subtiles différences de comportement, en particulier pour les jointures externes, nécessitent un examen attentif. Cette distinction garantit une récupération précise des données et une optimisation efficace des requêtes.

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