Wat is het verschil tussen "INNER JOIN" en "OUTER JOIN"?
En hoe passen LEFT JOIN
, RIGHT JOIN
en FULL JOIN
in dit plaatje?
4488
3
En hoe passen LEFT JOIN
, RIGHT JOIN
en FULL JOIN
in dit plaatje?
Ervan uitgaande dat je samenvoegt op kolommen zonder duplicaten, wat een veel voorkomend geval is:
Een inner join van A en B geeft het resultaat van A intersect B, d.w.z. het binnenste deel van een Venn diagram intersectie.
Een outer join van A en B geeft het resultaat van A union B, d.w.z. de buitenste delen van een Venn diagram union.
Voorbeelden
Veronderstel dat je twee tabellen hebt, met elk een enkele kolom, en de volgende gegevens:
Merk op dat (1,2) uniek zijn voor A, (3,4) gemeenschappelijk zijn, en (5,6) uniek zijn voor B.
Inner join
Een inner join met behulp van een van de equivalente queries geeft de intersectie van de twee tabellen, d.w.z. de twee rijen die ze gemeen hebben.
Linker outer join
Een left outer join geeft alle rijen in A, plus alle gemeenschappelijke rijen in B.
Right outer join
Een right outer join geeft alle rijen in B, plus alle gemeenschappelijke rijen in A.
Volledige buitentoevoeging
Een full outer join geeft je de unie van A en B, d.w.z. alle rijen in A en alle rijen in B. Als iets in A geen corresponderend gegeven in B heeft, dan is het B gedeelte null, en omgekeerd.
Een inner join toont alleen rijen als er een overeenkomend record is aan de andere (rechter) kant van de join.
Een (left) outer join toont rijen voor elke record aan de linkerkant, zelfs als er geen overeenkomende rijen zijn aan de andere (right) kant van de join. Als er geen overeenkomende rij is, zouden de kolommen voor de andere (rechter) kant NULLs tonen.
Inner joins vereisen dat een record met een verwante ID bestaat in de joined tabel.
Outer joins zullen records teruggeven voor de linkerkant, zelfs als er niets bestaat voor de rechterkant.
U hebt bijvoorbeeld een tabel Orders en een tabel OrderDetails. Ze zijn gerelateerd door een "OrderID".
Orders
OrderDetails
De aanvraag
zal alleen Orders teruggeven die ook iets in de OrderDetails tabel hebben.
Als je het verandert in OUTER LEFT JOIN
dan zal het records uit de tabel Orders teruggeven, zelfs als ze geen OrderDetails records hebben.
Je kunt dit gebruiken om Orders te vinden die geen OrderDetails hebben wat wijst op een mogelijke verweesde order door een where clausule toe te voegen zoals
WHERE OrderDetails.OrderID IS NULL
.