Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Condição INNER JOIN na cláusula WHERE ou na cláusula ON?


Para associações internas como essa, elas são logicamente equivalentes. No entanto, você pode se deparar com situações em que uma condição na cláusula join significa algo diferente de uma condição na cláusula where.

Como uma ilustração simples, imagine que você faça uma junção à esquerda assim;
select x.id
from x
       left join y
         on x.id = y.id
;

Aqui estamos pegando todas as linhas de x, independentemente de haver um id correspondente em y. Agora vamos dizer que nossa condição de junção cresce - não estamos apenas procurando por correspondências em y com base no id, mas também em id_type.
select x.id
from x
       left join y
         on x.id = y.id
         and y.id_type = 'some type'
;

Novamente, isso fornece todas as linhas em x, independentemente de haver uma correspondência (id, id_type) em y.

Isso é muito diferente, no entanto:
select x.id
from x
       left join y
         on x.id = y.id
where y.id_type = 'some type'
;

Nesta situação, estamos escolhendo todas as linhas de x e tentando corresponder às linhas de y. Agora, para linhas para as quais não há correspondência em y, y.id_type será nulo. Por causa disso, y.id_type ='some type' não é satisfeito, então as linhas onde não há correspondência são descartadas, o que efetivamente transformou isso em uma junção interna.

Para encurtar a história:para junções internas, não importa para onde as condições vão, mas para junções externas pode.