Inner join versus outer join: behouden rijen, NULL's, left en right outer joins en SQL-syntaxis
Een join combineert rijen uit twee tabellen onder de voorwaarde in ON (meestal dat een vreemde sleutel gelijk is aan een primaire sleutel) tot één resultaattabel. Een inner join behoudt alleen de combinaties van rijen die een passende partner hebben; rijen zonder partner verdwijnen uit beide tabellen. Een outer join behoudt de passende combinaties en daarnaast de rijen van de opgegeven tabel, ook als ze geen partner hebben, en vult de kolommen van de andere tabel met NULL. Een left outer join (LEFT OUTER JOIN) behoudt elke rij van de linkertabel, een right outer join (RIGHT OUTER JOIN) die van de rechtertabel en een full outer join (FULL OUTER JOIN) die van beide. Kies op basis van de vraag of rijen zonder partner in het resultaat moeten verschijnen.
| Kenmerk | Inner join (INNER JOIN) | Outer join (OUTER JOIN) |
|---|---|---|
| Rijen in het resultaat | Alleen combinaties van rijen die aan de joinvoorwaarde voldoen | Passende combinaties, plus rijen zonder passende partner uit de tabel die behouden moet blijven |
| Rijen zonder partner | Uit het resultaat verwijderd, uit beide tabellen | Rijen van de behouden tabel blijven elk als één rij staan, met de kolommen van de andere tabel op NULL; rijen zonder partner uit de andere tabel worden verwijderd |
| Soorten | Eén soort; INNER kan worden weggelaten en dan schrijf je gewoon JOIN | Drie soorten: left (LEFT), right (RIGHT) en full (FULL); OUTER kan worden weggelaten |
| Voorbeeld in SQL | SELECT … FROM employee INNER JOIN dept ON employee.dept_id = dept.dept_id | SELECT … FROM employee LEFT OUTER JOIN dept ON employee.dept_id = dept.dept_id |
| Voorbeeld van het aantal rijen (4 medewerkers, van wie één met afdelings-ID NULL; 3 afdelingen, waarvan één zonder medewerkers) | 3 rijen: de medewerker met afdelings-ID NULL en de afdeling zonder medewerkers verschijnen niet | 4 rijen met een left outer join die de medewerkerstabel behoudt (de medewerker met afdelings-ID NULL krijgt een afdelingsnaam NULL); 5 rijen met een full outer join die beide behoudt |
| Volgorde van de tabellen | Links en rechts verwisselen geeft dezelfde rijen (alleen de volgorde van de kolommen verandert) | Bij left en right outer joins verandert het resultaat met de tabel die links staat; A LEFT OUTER JOIN B geeft dezelfde rijen als B RIGHT OUTER JOIN A |
| Voorwaarden op kolommen van de andere tabel | Hetzelfde resultaat, of ze nu in ON of in de WHERE-clausule staan | In de WHERE-clausule voldoen de met NULL gevulde rijen niet aan de voorwaarde en verdwijnen ze, wat hetzelfde resultaat kan geven als een inner join; zet de voorwaarde in ON om rijen zonder partner te behouden |
| Typische toepassingen | Wanneer alleen data die in beide tabellen voorkomt gewenst is (bijvoorbeeld klantnamen aan bestellingen toevoegen) | Wanneer ook rijen zonder partner moeten worden opgesomd (bijvoorbeeld alle medewerkers, ook die zonder afdeling), of om rijen zonder partner op te sporen |
De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.