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;
et
SELECT * FROM Foo AS f INNER JOIN Bar AS b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);
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);
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;
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;
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!