Joins algemeen
Join is het samenvoegen van 2 of meer tabellen tot één grote verzameling van kolommen.
Stel we hebben 3 tabellen:
tabel_a met de kolommen a_id, a_naam, a_iets
tabel_b met de kolommen b_id, a_id, b_naam, b_iets, b_nogwat
tabel_c met de kolommen c_id, a_id, c_naam, c_iets, c_nogwat
In de eerste stap worden tabel_a en tabel_b samengevoegd, (tussen)resultaat:
tabel_a.a_id
tabel_a.a_naam
tabel_a.a_iets
- - - - - - - - - - - - - - - -
tabel_b.b_id
tabel_b.a_id
tabel_b.b_naam
tabel_b.b_iets
tabel_b.b_nogwat
Dan wordt in de tweede stap tabel_c erbij gevoegd, resultaat:
tabel_a.a_id
tabel_a.a_naam
tabel_a.a_iets
tabel_b.b_id
tabel_b.a_id
tabel_b.b_naam
tabel_b.b_iets
tabel_b.b_nogwat
- - - - - - - - - - - - - - - -
tabel_c.c_id
tabel_c.a_id
tabel_c.c_naam
tabel_c.c_iets
tabel_c.c_nogwat
Zoals je ziet worden bij elke join de kolommen van de tabel die gejoind wordt aan de verzameling toegevoegd.
Ik heb door middel van de stippellijn aangeven wat door SQL als links (boven de stippelijn) en rechts (eronder) beschouwd wordt. Die stippellijn zal bij elke join dus opschuiven.
In theorie zijn er beperkingen op het aantal joins dat in een query toegepast kan worden (zo'n 60 in MySQL), maar in de praktijk zal je dit nooit halen (met een goed data model).
Al die kolommen kunnen in een query gebruikt worden; in de select lijst, in de join voorwaarden, in de where clause, kortom net zoals bij een query over één tabel.
Join syntax
Inner join (impliciet):
2
3
4
5
6
kolomlijst
FROM
tabelnaam [[AS] alias1], tabelnaam[[AS] alias2]
WHERE
alias1.idcol = alias2.idcol
Inner join (expliciet):
2
3
4
5
6
kolomlijst
FROM
tabelnaam [[AS] alias1]
[INNER] JOIN tabelnaam [[AS] alias2]
{ON alias1.idcol = alias2.idcol | USING (idcol)}
Outer join:
2
3
4
5
6
kolomlijst
FROM
tabelnaam [[AS] alias1]
{LEFT|RIGHT|FULL} [OUTER] JOIN tabelnaam[[AS] alias2]
{ON alias1.idcol = alias2.idcol | USING (idcol)}
Het keyword outer is optioneel, maar als je een outer join wilt toepassen je deze altijd vooraf moeten laten gaan door LEFT, RIGHT of FULL.
OUTER JOIN alleen zal een SQL foutmelding opleveren, en alleen JOIN zonder één van eerder genoemde keywords is automatisch een inner join.
Let op! MySQL kent geen FULL JOIN.
Cross join:
Ik gebruik ze ook nooit, en zal ze in deze tutorial ook niet verder behandelen.
Inhoudsopgave
- Inleiding
- Joins algemeen
- Inner en outer join
- Cross en natural join
- Joins in de praktijk (1)
- Subqueries
- Joins in de praktijk (2)
- Group by
- Group by voorbeelden
- Conditional staments
- Nog meer voorbeelden
- Nawoord