Joins
Een query bestaat uit 3 onderdelen:
- Projectie
- brontabel
- 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:
- Plaats alle rijen van tabel A en B onder elkaar in één nieuwe tabel.
- Zoek naar alle rijen die in tabel A en B hetzelfde zijn, en plaats die in één nieuwe tabel.
- Maak combinaties van alle rijen in tabel A en B, en plaats die in één nieuwe tabel.
- …
Er is dus meer dan één join
commando. Om elk van deze join
s 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