# Inner en Outer Joins *In deze les leer je wat een **Cartesian product** is en hoe je deze kunt visualiseren. Daarna leer je het verschil tussen de **inner**- en de veschillende **outer** **joins**.* #### Join Je kunt een join visualiseren. Stel je maakt een join tussen de tabellen persoon en de tabel ziektemeldingen. **Tabel persoon**
IDvoornaanachternaam
1001Aagjede Groot
1002AmberNieuwenhuzien
**Tabel ziektemeldingen**
IDpersoondatum\_vandatum\_tot
1100214-06-201816-6-2018
210021-8-20186-8-2018
310032-8-20183-8-2018
##### INNER JOIN Nu maak je een query waarbij je de twee tabellen samenvoegd. ```SQL 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:
IDvoornaamachternaamIDperssondataum\_vandatum\_tot
1001Aagjede Groot1100214-06-201816-6-2018
1001Aagjede Groot210021-8-20186-8-2018
1001Aagjede Groot310032-8-20183-8-2018
1002AmberNieuwenhuzien1100214-06-201816-6-2018
1002AmberNieuwenhuzien210021-8-20186-8-2018
1002AmberNieuwenhuzien310032-8-20183-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. ```SQL 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:
IDvoornaamachternaamIDpersoondataum\_vandatum\_tot
1001Aagjede Groot1100214-06-201816-6-2018
1001Aagjede Groot210021-8-20186-8-2018
1001Aagjede Groot310032-8-20183-8-2018
1002AmberNieuwenhuzien1100214-06-201816-6-2018
1002AmberNieuwenhuzien210021-8-20186-8-2018
1002AmberNieuwenhuzien310032-8-20183-8-2018
Het resltaat is dat je alleen de regels krijgt waarvan de primary key en foreign key hetzelfde zijn. ##### LEFT OUTER JOIN ```SQL SELECT * FROM persoon LEFT OUTER JOIN ziektemelding on persoon.id=ziektemelding.persoon ```
IDvoornaamachternaamIDperssondataum\_vandatum\_tot
1001Aagjede Groot1100214-06-201816-6-2018
1001Aagjede Groot210021-8-20186-8-2018
1001Aagjede Groot310032-8-20183-8-2018
1002AmberNieuwenhuzien1100214-06-201816-6-2018
1002AmberNieuwenhuzien210021-8-20186-8-2018
1002AmberNieuwenhuzien310032-8-20183-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 tabel (dat is de tabel na de select) ten minste één keer afgedrukt.

##### RIGHT OUTER JOIN ```SQL SELECT * FROM persoon RIGHT OUTER JOIN ziektemelding on persoon.id=ziektemelding.persoon ```
IDvoornaamachternaamIDpersoondataum\_vandatum\_tot
1001Aagjede Groot1100214-06-201816-6-2018
1001Aagjede Groot210021-8-20186-8-2018
1001Aagjede Groot310032-8-20183-8-2018
1002AmberNieuwenhuzien1100214-06-201816-6-2018
1002AmberNieuwenhuzien210021-8-20186-8-2018
1002AmberNieuwenhuzien310032-8-20183-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 rechter table dus toch afgedrukt. De kolommen uit de linker kolom zijn er niet en zullen dus ook niet worden afgedrukt (je ziet NULL values).

Dus bij een right 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 en uit de rechter kolom 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. ```SQL SELECT * FROM persoon LEFT OUTER JOIN ziektemelding on persoon.id=ziektemelding.persoon UNION SELECT * FROM persoon RIGHT OUTER JOIN ziektemelding on persoon.id=ziektemelding.persoon ``` #### Samengevat
![](https://www.roc.ovh/uploads/images/gallery/2019-10/scaled-1680-/image-1571130010192.png) SELECT \* FROM A **INNER JOIN** B ON ...
![](https://www.roc.ovh/uploads/images/gallery/2019-10/scaled-1680-/image-1571130134450.png)SELECT \* FROM A **LEFFT OUTER JOIN** B ON ...
![](https://www.roc.ovh/uploads/images/gallery/2019-10/scaled-1680-/image-1571130299139.png) SELECT \* FROM A **RIGHT OUTER** **JOIN** B ON ...
![](https://www.roc.ovh/uploads/images/gallery/2019-10/scaled-1680-/image-1571130405758.png)SELECT \* FROM A **FULL OUTER JOIN** B ON ... (je kunt hier A en B ook omdraaien in de query)