sql >> Database >  >> RDS >> Mysql

INNER JOIN-voorwaarde in WHERE-clausule of ON-clausule?

Voor inner joins zoals deze zijn ze logisch equivalent. U kunt echter situaties tegenkomen waarin een voorwaarde in de join-clausule iets anders betekent dan een voorwaarde in de where-clausule.

Stel je als eenvoudige illustratie voor dat je zo een left join doet;

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

Hier nemen we alle rijen van x, ongeacht of er een overeenkomende id in y is. Laten we nu zeggen dat onze deelnamevoorwaarde groeit - we zoeken niet alleen naar overeenkomsten in y op basis van de id, maar ook op id_type.

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

Dit geeft opnieuw alle rijen in x, ongeacht of er een overeenkomst (id, id_type) in y is.

Dit is echter heel anders:

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

In deze situatie kiezen we alle rijen van x en proberen we te matchen met rijen van y. Voor rijen waarvoor er geen overeenkomst is in y, is y.id_type null. Daarom is er niet voldaan aan y.id_type ='some type', dus de rijen waar geen match is, worden weggegooid, waardoor dit in feite een inner join is geworden.

Om een ​​lang verhaal kort te maken:voor inner joins maakt het niet uit waar de omstandigheden heen gaan, maar voor outer joins wel.



  1. Wil je string splitsen in mysql met SUBSTRING_INDEX

  2. Waarom de \G in SELECT * FROM tabelnaam\G?

  3. Zoek in de JSON-kolom met behulp van de welsprekende taal van Laravel

  4. Hoe gebruik je MAX in MySQL?