Maison > base de données > tutoriel mysql > OÙ ou ON dans les JOINSIONS SQL : quand dois-je utiliser chaque clause ?

OÙ ou ON dans les JOINSIONS SQL : quand dois-je utiliser chaque clause ?

DDD
Libérer: 2025-01-05 13:10:44
original
294 Les gens l'ont consulté

WHERE vs. ON in SQL JOINs: When Should I Use Each Clause?

Exploration des différences entre la clause WHERE et la condition ON dans JOIN

Les praticiens SQL utilisent souvent la clause WHERE et la condition ON de manière interchangeable lors de l'exécution d'opérations JOIN . Bien que les deux approches puissent renvoyer les mêmes résultats, il existe des nuances à prendre en compte.

Dans l'exemple fourni, deux requêtes SQL sont présentées :

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

et

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

Les deux requêtes renvoient le même ensemble de lignes, mais il existe une différence cruciale dans leur exécution. Lorsque le filtre est placé dans la clause WHERE, il est appliqué après l'opération JOIN. Cela signifie que JOIN récupérera toutes les lignes correspondantes des deux tables, même celles où b.IsApproved est faux. La clause WHERE filtre ensuite les lignes qui ne répondent pas au critère b.IsApproved = 1.

En revanche, lorsque le filtre est placé en condition ON, la condition est évaluée avant le JOIN. Par conséquent, seules les lignes où b.BarId et b.IsApproved répondent aux critères spécifiés seront incluses dans JOIN.

Jointures externes et placement de filtre

Cependant , cette différence devient particulièrement importante lorsqu'il s'agit de jointures externes. Considérons la requête de jointure externe gauche suivante :

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

Dans ce cas, le filtre dans la condition ON exclura les lignes où b.IsApproved est faux ou celles pour lesquelles il n'y a pas de b.BarId correspondant pour un f donné. .BarId. Ce comportement est différent du placement du filtre dans la clause WHERE :

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

Dans la deuxième requête, les lignes où b.IsApproved est faux ou celles impliquant un échec de jointure seront toujours renvoyées, mais b.IsApproved le sera être défini sur NULL.

Par conséquent, lors de l'utilisation de jointures externes, il est essentiel de réfléchir attentivement à l'emplacement des filtres. La condition ON filtre les lignes avant la jointure, tandis que la clause WHERE filtre les résultats après la jointure.

Pour terminer la discussion, si vous désirez un filtre OPTIONNEL dans une jointure externe gauche, la requête suivante démontre le placement correct :

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

Cette requête renvoie les lignes où la jointure réussit et où b.IsApproved répond au critère, ainsi que les lignes où la jointure échoue (ce qui entraîne un Valeur NULL pour b.IsApproved).

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal