sql >> Databasteknik >  >> RDS >> Mysql

INNER JOIN-villkor i WHERE-sats eller ON-sats?

För inre sammanfogningar som denna är de logiskt likvärdiga. Du kan dock stöta på situationer där ett villkor i join-satsen betyder något annat än ett villkor i where-satsen.

Som en enkel illustration, föreställ dig att du gör en vänsteranslutning som så;

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

Här tar vi alla rader från x, oavsett om det finns ett matchande id i y. Låt oss nu säga att vårt anslutningsvillkor växer - vi letar inte bara efter matchningar i y baserat på id utan också på id_type.

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

Återigen ger detta alla rader i x oavsett om det finns en matchning (id, id_type) i y.

Detta är dock väldigt annorlunda:

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

I den här situationen väljer vi alla rader av x och försöker matcha till rader från y. Nu för rader för vilka det inte finns någon matchning i y, kommer y.id_type att vara null. På grund av det är y.id_type ='någon typ' inte uppfylld, så de rader där det inte finns någon matchning kasseras, vilket i praktiken gjorde detta till en inre koppling.

Lång historia kort:för inre fogar spelar det ingen roll var förutsättningarna går, men för yttre fogar kan det göra det.



  1. Aggregerande (x,y) koordinatpunktmoln i PostgreSQL

  2. phpMyAdmin på MySQL 8.0

  3. mysql ordning efter antal prestanda

  4. SQLite-data till en RecyclerView