You are on page 1of 47

Databases 1

DATABASES 1
Week 4

Databases 1 31-12-22
Leerdoelen

Na deze les kun je:

• Een query schrijven met een OUTER JOIN


• Een FULL OUTER JOIN nabootsen in MySQL
• De UNION gebruiken in een query

Databases 1 31-12-22 |3
Vorige week

Databases 1 31-12-22 |4
Opdrachten?

Over welke onderwerpen gingen de opdrachten van afgelopen


week?

• CROSS JOIN
• INNER JOIN + OUTER JOIN
• JOIN multiple tables
• Executie volgorde

Databases 1 31-12-22 |5
Vraag

Wat is het verschil tussen een rode sleutel en een gele sleutel?

Antwoord:
Ze zijn allebei PRIMARY KEY, maar de rode sleutel is ook FOREIGN
KEY.

Databases 1 31-12-22 |6
Vraag

Wat voor functie heeft de PRIMARY KEY in de tabel zelf?


(dus nog niet bekeken vanuit de JOIN)

Antwoord:
Identificeert uniek een rij in de tabel.

Databases 1 31-12-22 |7
Vraag

Wat voor functie heeft een FOREIGN KEY?


(wederom nog niet bekeken vanuit de JOIN)

Antwoord:
Refereert naar de PRIMARY KEY van een andere tabel.

Databases 1 31-12-22 |8
Vraag

Hoeveel PRIMARY KEYs staan


er in de volgende tabel:

Antwoord:
1

Altijd maximaal één


PRIMARY KEY!!

Databases 1 31-12-22 |9
Vraag

Hoeveel FOREIGN KEYs staan


er in de volgende tabel:

Antwoord:
2

Databases 1 31-12-22 | 10
Vraag

Hoeveel FOREIGN KEYs komen er voor in onderstaand diagram?

Antwoord:
2

Databases 1 31-12-22 | 11
Vraag

En hoeveel PRIMARY KEYs komen er voor?

Antwoord:
3

Databases 1 31-12-22 | 12
Vraag

Bij onderstaande tabellen met inhoud, hoeveel rijen en kolommen


heeft het resultaat van de CROSS JOIN?

Tabel: Opleiding
OPLCODE OMSCHRIJVING ACADEMIE
IN Informatica AII
BK Bouwkunde ABCT
ET Electrotechniek AII

Tabel: Student
STUDENT NAAM OPLCODE
NR
1 Kees de Vries IN
2 Jan de Wit IN
3 Koos Tomeloos BK
4 Has Veras ET
Databases 1 31-12-22 | 13
Antwoord

6 kolommen :
Alle kolommen van de opleiding tabel + alle kolommen van de
student tabel.

12 rijen:
Achter elke rij uit de opleiding tabel wordt elke rij uit de student
tabel geplakt.
3 rijen x 4 rijen = 12 rijen

Databases 1 31-12-22 | 14
Vraag

Wat gebruiken we (bijna altijd) bij het maken van een query met
een INNER JOIN?

Antwoord:
Een FK en PK koppel
(aangegeven door een relatie tussen twee tabellen)

Een EER is hier dus nogal handig bij.

Databases 1 31-12-22 | 15
Vraag

Maak de volgende query af:


SELECT * FROM stukinstrument INNER JOIN instrument ON …

Antwoord:
ON stukinstrument.instrumentnaam = instrument.instrumentnaam
AND stukinstrument.toonhoogte = instrument.toonhoogte;

Databases 1 31-12-22 | 16
Vraag

Doen de volgende twee queries altijd hetzelfde?

SELECT * FROM student JOIN opleiding


ON student.oplcode = opleiding.oplcode;

SELECT * FROM student JOIN opleiding


ON opleiding.oplcode = student.oplcode;

Antwoord:
Ja!
Uit de ON conditie komt een waarheidswaarde (true/false). Deze is
in beide gevallen gelijk (als A=B dan is ook B=A, en als A!=B dan
is ook B!=A).

Databases 1 31-12-22 | 17
OUTER JOIN

Databases 1 31-12-22 | 18
JOIN query resultaat

Opdracht: Geef per activiteit de omschrijving en het aantal


studenten dat voor die activiteit belangstelling heeft getoond.
(fun4all database)

Open je workbench en voer het antwoord op deze opdracht


in:

SELECT a.actomschr, COUNT(*) AS aantal


FROM activiteit AS a INNER JOIN belangstelling AS b
ON a.actcode = b.actcode GROUP BY a.actcode;

Wat is het aantal belangstellenden voor klootschieten en


opschieten?

Waarom zie je dat niet terug in het resultaat?

Databases 1 31-12-22 | 19
Antwoord

Omdat er geen belangstelling voor klootschieten en opschieten is.

Er is geen enkele rij in de tabel belangstelling waar KLS of OPS bij


actcode is ingevuld.

Q: Hoe kunnen we deze toch in het resultaat terug krijgen?

A: OUTER JOINs!

Databases 1 31-12-22 | 20
OUTER JOIN

OUTER JOIN: Geef alle rijen uit de ene tabel weer, ook al
wordt er niet naar die specifieke rij gerefereerd vanuit de
andere tabel.

Bijvoorbeeld: In het resultaat toch een rij weergeven voor


Klootschieten en één voor Opschieten, ondanks dat er vanuit
belangstelling niet naar deze rijen wordt gerefereerd.

Databases 1 31-12-22 | 21
Soorten OUTER JOINs

• LEFT JOIN
• RIGHT JOIN
• FULL JOIN

Databases 1 31-12-22 | 22
Soorten OUTER JOINs

• LEFT JOIN of LEFT OUTER JOIN


• RIGHT JOIN of RIGHT OUTER JOIN
• FULL JOIN of FULL OUTER JOIN

(Er bestaat dus geen OUTER JOIN die OUTER JOIN heet)

Databases 1 31-12-22 | 23
Voorbeeld(1)

SELECT a.actomschr, COUNT(*) AS aantal


FROM activiteit AS a INNER JOIN belangstelling AS b
ON a.actcode = b.actcode GROUP BY a.actcode;

In plaats van de INNER JOIN gaan we nu een LEFT JOIN gebruiken.

Verander in je workbench de opdracht naar:

SELECT a.actomschr, COUNT(*) AS aantal


FROM activiteit AS a LEFT JOIN belangstelling AS b
ON a.actcode = b.actcode GROUP BY a.actcode;

We krijgen nu wel Klootschieten en Opschieten, maar bij aantal


staat 1. Niet correct! Hoe komt dat?

Databases 1 31-12-22 | 24
Voorbeeld(2)

Om daar het antwoord op te krijgen gaan we eerst eens kijken wat


er uit de LEFT JOIN komt.

Voer de volgende query uit in je Workbench:

SELECT * FROM activiteit AS a LEFT JOIN belangstelling AS b


ON a.actcode = b.actcode ORDER BY a.actomschr;

Wat zie je bij Klootschieten en Opschieten ingevuld voor de


belangstelling velden?

Antwoord: NULL

Vraag: Wat moeten we veranderen om te zorgen dat de rijen voor


Klootschieten en Opschieten niet worden meegeteld in de COUNT?

Databases 1 31-12-22 | 25
Voorbeeld(3)

Antwoord:
COUNT(studentnr) in plaats van COUNT(*)

De rij dus alleen meetellen als er inderdaad een student bij staat.

Verander in je workbench de opdracht naar:

SELECT a.actomschr, COUNT(studentnr) AS aantal


FROM activiteit AS a LEFT JOIN belangstelling AS b
ON a.actcode = b.actcode GROUP BY a.actcode;

Nu zie je dat er bij Klootschieten en Opschieten inderdaad een


aantal van 0 staat. Correct!

Databases 1 31-12-22 | 26
OUTER JOIN

Bij een outer join worden dus alle velden op NULL gezet die niet
bestaan.

Bijvoorbeeld: Alle velden van student worden op NULL gezet voor


de opleiding Virtueel Studeren, omdat daar geen enkele student bij
hoort.

Databases 1 31-12-22 | 27
Vraag

Waarom kijk je naar de PRIMARY KEY van de tabel die je OUTER


JOINed, en niet naar een willekeurig ander veld?

actcode actomschr prijs studentnr actcode datum


HAG Hangglijden 100.00 7 HAG NULL
KLS Klootschieten 10.00 NULL NULL NULL

Antwoord:
Omdat een PK nooit NULL kan zijn, en een willekeurig ander veld
zou dat wel kunnen zijn. Als het PK veld in het resultaat NULL is
dan betekent dat dus dat daar geen rij voor bestaat en dat de
OUTER JOIN deze NULL velden heeft toegevoegd.

Alleen NULL als Kan ook NULL zijn als


er geen belangstelling er wel een belangstelling is
is voor deze activiteit. maar geen datum is ingevuld.

Databases 1 31-12-22 | 28
LEFT JOIN vs. RIGHT JOIN

LEFT JOIN: Datgene wat links van de LEFT JOIN staat geschreven
in de query komt altijd in het resultaat, ook al is er geen rij aan
gekoppeld in de tabel die daar rechts van staat.

RIGHT JOIN: Datgene wat rechts van de RIGHT JOIN staat


geschreven in de query komt altijd in het resultaat, ook al is er
geen rij aan gekoppeld in de tabel die daar links van staat.

Het hangt er dus helemaal van af hoe je je query schrijft.

Databases 1 31-12-22 | 29
Voorbeeld(4)
activiteit staat hier links
van de LEFT JOIN.
Dus we kunnen onze query:

SELECT a.actomschr, COUNT(studentnr) AS aantal


FROM activiteit AS a LEFT JOIN belangstelling AS b
ON a.actcode = b.actcode GROUP BY a.actcode;
activiteit staat hier
Ook schrijven als: rechts van de
RIGHT JOIN.
SELECT a.actomschr, COUNT(studentnr) AS aantal
FROM belangstelling AS b RIGHT JOIN activiteit AS a
ON a.actcode = b.actcode GROUP BY a.actcode;

Beide queries geven precies hetzelfde resultaat.

Databases 1 31-12-22 | 30
Wanneer OUTER JOIN?

Je gebruikt meestal een OUTER JOIN als je wil vaststellen of dingen


ontbreken, of er niet zijn, of een aantal hebben van 0, of er geen
van zijn.

Als je deze woorden tegenkomt in een opdracht dan kan dat een
indicatie zijn dat je een OUTER JOIN moet gebruiken.

Bijvoorbeeld:
• Bij welke activiteiten ontbreekt er nog een planning?
• Bij welke opleidingen is er nog niet een student ingeschreven?
• Voor hoeveel activiteiten hebben 0 studenten belangstelling
getoond?
• Geef alle opleidingen waar geen studenten voor staan
ingeschreven.

Databases 1 31-12-22 | 31
Vraag

Opdracht: Geef alle studenten waarvoor nog geen oplcode is


ingevuld.
(fun4all database)

Is voor deze opdracht een OUTER JOIN nodig?

Antwoord:
Nee!
Er is helemaal geen JOIN nodig. (dus ook geen OUTER JOIN).

SELECT *
FROM student
WHERE oplcode IS NULL;

Databases 1 31-12-22 | 32
OUTER JOIN in stappen(1)

Gegeven de onderstaande tabellen.

Tabel: Opleiding
OPLCODE OMSCHRIJVING ACADEMIE
IN Informatica AII
BK Bouwkunde ABCT
ET Electrotechniek AII

Tabel: Student
STUDENT NAAM OPLCODE
NR
1 Kees de Vries IN
2 Jan de Wit IN
3 Koos Tomeloos BK

Databases 1 31-12-22 | 33
OUTER JOIN in stappen(2)

Gegeven de volgende query op die tabellen:

SELECT o.omschrijving, s.naam


FROM opleiding AS o LEFT JOIN student AS s
ON s.oplcode = o.oplcode;

Welke stappen gebeuren er in de server bij het verwerken van


bovenstaande query?

Notabene: in de werkelijkheid zullen deze stappen in de server


waarschijnlijk sterk geoptimaliseerd zijn (en dus anders lopen).
Maar voor ons begrip van de database is het goed om deze stappen
zo te beschouwen.

Databases 1 31-12-22 | 34
OUTER JOIN in stappen(3)

Stap 1: CROSS JOIN. Alle rijen van student worden gezet naast alle
rijen van opleiding.

oplcode omschrijving academie studentnr naam oplcode


IN Informatica AII 1 Kees de Vries IN
IN Informatica AII 2 Jan de Wit IN
IN Informatica AII 3 Koos Tomeloos BK
BK Bouwkunde ABCT 1 Kees de Vries IN
BK Bouwkunde ABCT 2 Jan de Wit IN
BK Bouwkunde ABCT 3 Koos Tomeloos BK
ET Electrotechniek AII 1 Kees de Vries IN
ET Electrotechniek AII 2 Jan de Wit IN
ET Electrotechniek AII 3 Koos Tomeloos BK

Databases 1 31-12-22 | 35
OUTER JOIN in stappen(4)

Stap 2: INNER JOIN. Alle rijen worden verwijderd die voor de ON


conditie false opleveren.

oplcode omschrijving academie studentnr naam oplcode


IN Informatica AII 1 Kees de Vries IN
IN Informatica AII 2 Jan de Wit IN
IN Informatica AII 3 Koos Tomeloos BK
BK Bouwkunde ABCT 1 Kees de Vries IN
BK Bouwkunde ABCT 2 Jan de Wit IN
BK Bouwkunde ABCT 3 Koos Tomeloos BK
ET Electrotechniek AII 1 Kees de Vries IN
ET Electrotechniek AII 2 Jan de Wit IN
ET Electrotechniek AII 3 Koos Tomeloos BK

Databases 1 31-12-22 | 36
OUTER JOIN in stappen(5)

Stap 2: INNER JOIN. Alle rijen worden verwijderd die voor de ON


conditie false opleveren.

oplcode omschrijving academie studentnr naam oplcode


IN Informatica AII 1 Kees de Vries IN
IN Informatica AII 2 Jan de Wit IN
BK Bouwkunde ABCT 3 Koos Tomeloos BK

(Er is nu dus geen enkele rij meer voor Electrotechniek)

Databases 1 31-12-22 | 37
OUTER JOIN in stappen(6)

Stap 3a: LEFT JOIN. Voeg voor elke rij uit de tabel die links van de
LEFT JOIN staat een rij toe, indien deze nog niet voorkomt in het
resultaat van de INNER JOIN.

oplcode omschrijving academie studentnr naam oplcode


IN Informatica AII 1 Kees de Vries IN
IN Informatica AII 2 Jan de Wit IN
BK Bouwkunde ABCT 3 Koos Tomeloos BK
ET Electrotechniek AII

Databases 1 31-12-22 | 38
OUTER JOIN in stappen(7)

Stap 3b: LEFT JOIN. Zet de velden die niet bekend zijn op NULL.

oplcode omschrijving academie studentnr naam oplcode


IN Informatica AII 1 Kees de Vries IN
IN Informatica AII 2 Jan de Wit IN
BK Bouwkunde ABCT 3 Koos Tomeloos BK
ET Electrotechniek AII NULL NULL NULL

Databases 1 31-12-22 | 39
FULL OUTER JOIN

Databases 1 31-12-22 | 40
FULL OUTER JOIN

FULL OUTER JOIN: Tegelijk een LEFT JOIN en een RIGHT JOIN.

Wordt vaak gebruikt om mismatches te vinden.

Bestaat niet in MySQL!

Databases 1 31-12-22 | 41
Nabootsen in MySQL van
FULL OUTER JOIN

Doen we door middel van UNION.

We plakken met een UNION een query met LEFT JOIN aan een
query met RIGHT JOIN:

SELECT *
FROM opleiding AS o LEFT JOIN student AS s
ON o.oplcode = s.oplcode
UNION
SELECT *
FROM opleiding AS o RIGHT JOIN student AS s
ON o.oplcode = s.oplcode;

Databases 1 31-12-22 | 42
UNION

Plakt twee queries aan elkaar, zolang de resultaten van de queries


maar hetzelfde aantal kolommen hebben (anders past het niet).

Eventuele dubbele rijen worden weggelaten, tenzij je UNION ALL


gebruikt.

Bijvoorbeeld:
SELECT * FROM opleiding UNION SELECT * FROM student;

Plakt alle rijen van student onder alle rijen van opleiding;

Databases 1 31-12-22 | 43
Nabootsen in MySQL van
FULL OUTER JOIN

En dat gebruiken we dus ook om een FULL OUTER JOIN na te


bootsen:

SELECT *
FROM opleiding AS o LEFT JOIN student AS s
ON o.oplcode = s.oplcode
UNION
SELECT *
FROM opleiding AS o RIGHT JOIN student AS s
ON o.oplcode = s.oplcode;

Voer deze query in je Workbench in en bekijk het resultaat.

Databases 1 31-12-22 | 44
Overzicht

Databases 1 31-12-22 | 45
Overzicht

Een FULL OUTER


JOIN bestaat dus
niet in MySQL,
maar is in dit
overzicht
opgenomen voor
volledigheid (hij
bestaat wel in bijv.
MSSQL of Oracle)

Overzicht gehaald van: https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins


Databases 1 31-12-22 | 46
Vragen?

Databases 1 31-12-22 | 47

You might also like