Joins

leestijd: 6 minuten

inner join full outer join left outer join

Joins

Een query bestaat uit 3 onderdelen:

  1. Projectie
  2. brontabel
  3. selectie

Alle query’s tot nu toe maakten gebruik van één brontabel. Een databank bestaat echter altijd uit meerdere tabellen. De data die je wilt opvragen zit vaak verspreid over verschillende tabellen.

In SQL is het mogelijk om meerdere tabellen samen te voegen tot één grote tabel, waarin alle gegevens van die tabellen worden verzameld. Deze grote tabel kan dan gebruikt worden als brontabel in een query. Het samenvoegen van deze tabellen wordt ook wel eens een join genoemd.

Soorten Joins

Er zijn verschillende manieren om twee tabellen samen te voegen:

Er is dus meer dan één join commando. Om elk van deze joins uit te leggen worden twee voorbeeldtabellen gebruikt: Color en Size. Beide tabellen hebben een achtergrondkleur gekregen, om elke soort join te verduidelijken.

Color
id color
1 red
2 blue
Size
id size
1 small
3 medium
4 large

Cross Join

Een cross join maakt een tabel met alle fields uit tabel A en B. Elke record in de nieuwe tabel is een mogelijke combinatie tussen een record uit tabel A en een record uit tabel B.

SELECT * 
FROM 
 Color 
 CROSS JOIN 
 Size
Cross Join
Color.id Color.color Size.id Size.size
1 red 1 small
2 blue 1 small
1 red 3 medium
2 blue 3 medium
1 red 4 large
2 blue 4 large

(Inner) Join

Een inner join (vaak ook afgekort tot join) is een cross join waarin enkel de rijen staan die voldoen aan een voorwaarde.

SELECT * 
FROM 
 Color 
 INNER JOIN 
 Size
 ON Color.id = Size.id
Inner Join
Color.id Color.color Size.id Size.size
1 red 1 small

Left (Outer) Join

Een left outer join (ook wel left join genoemd) is, net als de inner join, een join met een voorwaarde. Het resultaat hiervan is een inner join, met daarbij ook alle rijen uit de eerste tabel die niet aan de voorwaarde voldoen. De kolommen uit de tweede tabel worden met een null waarde ingevuld.

SELECT * 
FROM 
 Color 
 LEFT OUTER JOIN 
 Size
 ON Color.id = Size.id
Left Outer Join
Color.id Color.color Size.id Size.size
1 red 1 small
2 blue null null

Right (Outer) Join

Een right outer join (ook wel right join genoemd) is, net als de inner join, een join met een voorwaarde. Het resultaat hiervan is een inner join, met daarbij ook alle rijen uit de tweede tabel die niet aan de voorwaarde voldoen. De kolommen uit de eerste tabel worden met een null waarde ingevuld.

SELECT * 
FROM 
 Color 
 LEFT OUTER JOIN 
 Size
 ON Color.id = Size.id
Right Outer Join
Color.id Color.color Size.id Size.size
1 red 1 small
null null 3 medium
null null 4 large

Voorwaarden en Relaties

Bij de inner join, left join en right join wordt een voorwaarde meegegeven met behulp van het on keyword. Deze voorwaarde drukt het verband uit tussen tabel A en tabel B: namelijk, welke velden komen voor in tabel A èn tabel B, en bevatten dezelfde semantische gegevens? In het overgrote deel van situaties is dit verband een refererende sleutel die verwijst naar een primaire sleutel.

Het databankontwerp toont heel duidelijk welke verbanden je kan gebruiken om twee tabellen samen te voegen. Staat er een pijl tussen twee tabellen? Dan is er een verband tussen de tabellen.

Bijvoorbeeld:

In de muziekschooldatabase bevat het veld Stuk.componist dezelfde semantische gegevens als Componist.nr. Het is dus mogelijk om een verband tussen deze twee tabellen te maken. Dit is ook zichtbaar in het databankontwerp: Stuk.componist is een refererende sleutel naar Componist.nr, wat ook duidelijk is aangegeven met een pijl tussen de twee velden.

Een inner join tussen deze twee tabellen ziet er dus zo uit:

SELECT * 
FROM 
 Stuk
 INNER JOIN 
 Componist
 ON Stuk.componist = Componist.nr