Mysql
 sql >> Base de données >  >> RDS >> Mysql

Condition INNER JOIN dans la clause WHERE ou la clause ON ?

Pour les jointures internes comme celle-ci, elles sont logiquement équivalentes. Cependant, vous pouvez vous retrouver dans des situations où une condition dans la clause de jointure signifie quelque chose de différent d'une condition dans la clause where.

À titre d'illustration simple, imaginez que vous faites une jointure à gauche comme ceci ;

select x.id
from x
       left join y
         on x.id = y.id
;

Ici, nous prenons toutes les lignes de x, qu'il y ait ou non un identifiant correspondant dans y. Supposons maintenant que notre condition de jointure augmente - nous ne recherchons pas seulement des correspondances dans y en fonction de l'id, mais également de l'id_type.

select x.id
from x
       left join y
         on x.id = y.id
         and y.id_type = 'some type'
;

Encore une fois, cela donne toutes les lignes de x, qu'il y ait ou non une correspondance (id, id_type) dans y.

C'est très différent, cependant :

select x.id
from x
       left join y
         on x.id = y.id
where y.id_type = 'some type'
;

Dans cette situation, nous sélectionnons toutes les lignes de x et essayons de faire correspondre les lignes de y. Désormais, pour les lignes pour lesquelles il n'y a pas de correspondance dans y, y.id_type sera nul. Pour cette raison, y.id_type ='some type' n'est pas satisfait, donc les lignes où il n'y a pas de correspondance sont supprimées, ce qui a effectivement transformé cela en une jointure interne.

Pour faire court :pour les jointures internes, les conditions n'ont pas d'importance, mais pour les jointures externes, elles le peuvent.