Joins
Je kunt een join visualiseren.
Stel je maakt een join t tussen de volgende tabellen.
Tabel persoon
ID | voornaan | achternaam |
1001 | Aagje | de Groot |
1002 | Amber | Nieuwenhuzien |
Tabel ziektemeldingen
ID | persoon | datum_van | datum_tot |
1 | 1002 | 14-06-2018 | 16-6-2018 |
2 | 1002 | 1-8-2018 | 6-8-2018 |
3 | 1003 | 2-8-2018 | 3-8-2018 |
INNER JOIN
Nu maak je een query waarbij je de twee tabellen joint.
SELECT *
FROM persoon, ziektemelding
SELECT *
FROM persoon
INNER JOIN ziektemelding
Deze queries zijn hetzelfde, hoewel de tweede is volgens de ANSI standaard en is 'hoe het hoort', omdat die duidelijker is.
Door deze query met een join wordt het Cartesian product bepaald:
ID | voornaam | achternaam | ID | persson | dataum_van | datum_tot |
1001 | Aagje | de Groot | 1 | 1002 | 14-06-2018 | 16-6-2018 |
1001 | Aagje | de Groot | 2 | 1002 | 1-8-2018 | 6-8-2018 |
1001 | Aagje | de Groot | 3 | 1003 | 2-8-2018 | 3-8-2018 |
1002 | Amber | Nieuwenhuzien | 1 | 1002 | 14-06-2018 | 16-6-2018 |
1002 | Amber | Nieuwenhuzien | 2 | 1002 | 1-8-2018 | 6-8-2018 |
1002 | Amber | Nieuwenhuzien | 3 | 1003 | 2-8-2018 | 3-8-2018 |
Alle combinaties van alle rijen van de twee tabellen worden dus naast erlkaar gezet. Hierna begint de slelectie aan de hand van de WHERE clause van de query.
SELECT *
FROM persoon, ziektemelding
where persoon.id=ziektemelding.persoon
SELECT *
FROM persoon
INNER JOIN ziektemelding
on persoon.id=ziektemelding.persoon
Dit resulteert in het 'verwijderen' van de vier regels van het Catersian product:
ID | voornaam | achternaam | ID | persson | dataum_van | datum_tot |
1001 | Aagje | de Groot | 1 | 1002 | 14-06-2018 | 16-6-2018 |
1001 | Aagje | de Groot | 2 | 1002 | 1-8-2018 | 6-8-2018 |
1001 | Aagje | de Groot | 3 | 1003 | 2-8-2018 | 3-8-2018 |
1002 | Amber | Nieuwenhuzien | 1 | 1002 | 14-06-2018 | 16-6-2018 |
1002 | Amber | Nieuwenhuzien | 2 | 1002 | 1-8-2018 | 6-8-2018 |
1002 | Amber | Nieuwenhuzien | 3 | 1003 | 2-8-2018 | 3-8-2018 |
Het resltaat is dat je alleen de regels krijgt waarvan de primary key en foreign key hetzelfde zijn.
LEFT OUTER JOIN
SELECT *
FROM persoon
LEFT INNER JOIN ziektemelding
on persoon.id=ziektemelding.persoon
ID | voornaam | achternaam | ID | persson | dataum_van | datum_tot |
1001 | Aagje | de Groot | 1 | 1002 | 14-06-2018 | 16-6-2018 |
1001 | Aagje | de Groot | 2 | 1002 | 1-8-2018 | 6-8-2018 |
1001 | Aagje | de Groot | 3 | 1003 | 2-8-2018 | 3-8-2018 |
1002 | Amber | Nieuwenhuzien | 1 | 1002 | 14-06-2018 | 16-6-2018 |
1002 | Amber | Nieuwenhuzien | 2 | 1002 | 1-8-2018 | 6-8-2018 |
1002 | Amber | Nieuwenhuzien | 3 | 1003 | 2-8-2018 | 3-8-2018 |
Bij een left outer join wordt in de eerste stap hetzelfde gedaan als bij een inner join. Er wordt nu alleen gekeken of er er in de linker tabel regels zijn die niet één keer matchen met de rechter. Als dat zo is dan wordt deze regel uit de linker table dus toch afgedrukt. De kolommen uit de rechter kolom zijn er niet en zullen dus ook niet worden afgedrukt (je ziet NULL values).
Dus bij een left outer join worden alle regels uit de linker kolomtabel (dat is de kolomtabel na de select) ten minste één keer afgedrukt.
RIGHT OUTER JOIN
SELECT *
FROM persoon
RIGHT OUTER JOIN ziektemelding
on persoon.id=ziektemelding.persoon
ID | voornaam | achternaam | ID | persson | dataum_van | datum_tot |
1001 | Aagje | de Groot | 1 | 1002 | 14-06-2018 | 16-6-2018 |
1001 | Aagje | de Groot | 2 | 1002 | 1-8-2018 | 6-8-2018 |
1001 | Aagje | de Groot | 3 | 1003 | 2-8-2018 | 3-8-2018 |
1002 | Amber | Nieuwenhuzien | 1 | 1002 | 14-06-2018 | 16-6-2018 |
1002 | Amber | Nieuwenhuzien | 2 | 1002 | 1-8-2018 | 6-8-2018 |
1002 | Amber | Nieuwenhuzien | 3 | 1003 | 2-8-2018 | 3-8-2018 |
Bij een right outer join wordt in de eerste stap hetzelfde gedaan als bij een inner join. Er wordt nu alleen gekeken of er er in de rechter tabel regels zijn die niet één keer matchen met de rechter. Als dat zo is dan wordt deze regel uit de linkerrechter table dus toch afgedrukt. De kolommen uit de rechterlinker kolom zijn er niet en zullen dus ook niet worden afgedrukt (je ziet NULL values).
Dus bij een leftright outer join worden alle regels uit de rechter tabel (dat is de tabel na de on) ten minste één keer afgedrukt.
FULL OUTER JOIN
Bij een full outer join worden alle regels uit de linker kolomen (dat isuit de rechter kolom na de select) ten minste één keer afgedrukt. Dit is een combinatie van de left- en right outer join. MariaDB en MySQL ondersteund geen full outer join. Deze kan worden uitgevoerd door de left- en right outer join te combineren met een union.