You are on page 1of 45

Databases 1

DATABASES 1
Week 3

Databases 1 31-12-22
Leerdoelen

Na deze les kun je:

• Aan het EER zien welke tabellen een relatie met elkaar hebben
• Uitleggen wat Primary Keys en Foreign Keys zijn
• Een query schrijven met een CROSS JOIN
• Een query schrijven met een INNER JOIN
• Meerdere verschillende schrijfwijzen gebruiken voor INNER JOINs
• Een query schrijven waar meer dan twee tabellen met een JOIN
aan elkaar gekoppeld worden

Databases 1 31-12-22 |3
Vorige week

Databases 1 31-12-22 |4
Opdrachten?

Over welke onderwerpen gingen de opdrachten van afgelopen


week?

• Functies (ROUND, LEFT, RIGHT, INSTR, etc.)


• Aggregatie Functies (COUNT, SUM, MIN, MAX, AVG)
• Operators (arithmetic, logical)
• GROUP BY
• HAVING

Databases 1 31-12-22 |5
Opdracht 1.6

Geef een rijtje met alle opleidingscodes waar


studenten bij aangemeld zijn (tabel student). Er
mogen geen dubbele opleidingscodes in het rijtje
staan.
Meerdere
SELECT DISTINCT oplcode FROM student; tabellen
nodig?
oplcode omschrijving
BK Bouwkunde
CT Civiele Techniek JOIN!

ET Electrotechniek
…… …..

Databases 1 31-12-22 |6
EER lezen deel 1
Sleutels & Relaties

Databases 1 31-12-22 |7
studentactiviteiten EER

Databases 1 31-12-22 |8
EER?

Enhanced Entity Relationship diagram

Gebruiken we in blok 2 om databases mee te ontwerpen.

Gebruiken we in dit blok om te zien:


• Welke tabellen we aan elkaar kunnen JOINen
• Hoe we die tabellen aan elkaar moeten JOINen

Databases 1 31-12-22 |9
JOIN op welke tabellen?

Tabellen die met elkaar verbonden zijn met een lijn


(doorgetrokken of gestippeld) kunnen aan elkaar
geJOINed worden.

Databases 1 31-12-22 | 10
Hoe zijn tabellen
verbonden?

Door middel van:


• PRIMARY KEYs (primaire sleutels)
• FOREIGN KEYs (vreemde sleutels)

PRIMARY
KEY

FOREIGN
KEY

Databases 1 31-12-22 | 11
PRIMARY KEY EER symbool

Geel sleutel symbool:


PRIMARY KEY

Rood sleutel symbool:


PRIMARY KEY die tegelijk ook FOREIGN KEY is

Databases 1 31-12-22 | 12
PRIMARY KEY betekenis

PRIMARY KEY (PK): Om uniek een rij in de tabel


te kunnen identificeren.
• Voor iedere rij is de PK altijd ingevuld en dus nooit NULL.
– Daar zorgt de database voor.
• Elke invulling van de PK in iedere rij is uniek.
– Als een rij een bepaalde waarde heeft voor de PK zal diezelfde
waarde nooit nogmaals voorkomen.
– Daar zorgt de database voor.

Bijvoorbeeld PK studentnr in tabel student:


• Geen enkel studentnr is NULL
• Als studentnr 123456 voorkomt, dan is er maar één rij met dit
studentnr. Er is gegarandeerd dat er niet nog een student is met
studentnr 123456.

Databases 1 31-12-22 | 13
Vraag

Is onderstaande invulling van een tabel met docenten mogelijk?

Voornaam Achternaam Postcode Huisnr


(PK)
Bart Gelens 1234AB 10
Bart Luijten 4567CD 20
Bart Mutsaers 7890EF 30

Antwoord:
NEE!
Alleen de voornaam is PK en die velden moeten dus uniek zijn.

Databases 1 31-12-22 | 14
FOREIGN KEY EER symbool

Gesloten rood ruitje symbool OF open rood ruitje symbool:


FOREIGN KEY

Rood sleutel symbool:


FOREIGN KEY die tegelijk ook PRIMARY KEY is

Databases 1 31-12-22 | 15
FOREIGN KEY betekenis

FOREIGN KEY (FK): Refereert naar de PRIMARY


KEY van andere tabel.
Zorgt hierdoor voor een relatie (getrokken of gestippelde lijn in het
EER)

FOREIGN KEY:
• Mag (in sommige gevallen) NULL zijn
• Dezelfde PK mag meerdere keren in zijn FK voorkomen
• Er kan nooit iets in de FK ingevuld zijn dat niet bestaat als PK in
de tabel waarnaar de FK refereert.
– Daar zorgt de database voor

Databases 1 31-12-22 | 16
FOREIGN KEY voorbeeld

Bijvoorbeeld de FK oplcode in de student tabel


• Refereert naar de PK oplcode in opleiding tabel
• oplcode in de student tabel mag NULL zijn
• Dezelfde oplcode mag voor meerdere studenten gebruikt worden
• Er mag geen oplcode gebruikt worden die niet bestaat in de
opleiding tabel.

Databases 1 31-12-22 | 17
Vraag

Is onderstaande invulling van een tabel met docenten mogelijk?


(niet lettend op PK)
(FK verwijst naar een tabel postcodes met PK postcode)

Voornaam Achternaam Postcode Huisnr


(FK)
Bart Gelens 1234AB 10
Bart Luijten NULL 20
Bart Mutsaers 1234AB 30

Antwoord:
Ja!
Dezelfde postcode mag meerdere keer voorkomen en kan leeg
zijn.

Databases 1 31-12-22 | 18
Meerdere FOREIGN KEYs

Het is mogelijk voor een tabel om meerdere FOREIGN KEYs te


bevatten.
– Er kunnen immers referenties/relaties zijn naar meerdere
andere tabellen.

Het is mogelijk voor een tabel om geen FOREIGN KEYs te


bevatten.
– Een tabel zonder referenties/relaties met andere tabellen.
Databases 1 31-12-22 | 19
Altijd één PK

Er is nooit meer dan één PRIMARY KEY in een


tabel.
(eigenlijk is er bijna altijd precies één, maar in theorie is het
mogelijk om er geen te hebben)

Databases 1 31-12-22 | 20
Eén PK met meerdere
velden

Een PRIMARY KEY kan wel uit meerdere velden


bestaan, maar we spreken dan nog steeds van maar
één primary key.

De combinatie van velden moet dan uniek zijn, niet


ieder veld afzonderlijk.

Databases 1 31-12-22 | 21
PK met meerdere velden
voorbeeld (1)

In dit voorbeeld wordt een reis uniek geïdentificeerd aan de hand


van zowel zijn maatschappij als zijn nummer.

De tabel reis heeft één primary key die bestaat uit twee velden.

Databases 1 31-12-22 | 22
PK met meerdere velden
voorbeeld (2)

Het reis nummer 1 mag meerdere keren voorkomen, zolang er dan


maar een andere maatschappij bij staat:

maatschappij Nummer
Spavans 1
Spavans 2
New Frontier 1

Databases 1 31-12-22 | 23
Vraag

Hoeveel PRIMARY KEYs staan


er in de volgende tabel:

Antwoord:
1

Altijd maximaal één


PRIMARY KEY!!

Databases 1 31-12-22 | 24
FK als PK

Het is mogelijk voor een PK om te bestaan uit één of meerdere


FK's.

• Het EER symbool is dan een rode sleutel.


• Alle eigenschappen van de FK en alle eigenschappen van de PK
blijven dan gehandhaafd.

Databases 1 31-12-22 | 25
FK als PK voorbeeld

• De PK studentnr van student is FK in belangstelling.


• De PK actcode van activiteit is FK in belangstelling.
• De PK van belangstelling bestaat dus uit twee FK's, namelijk
studentnr en actcode.
• De tabel belangstelling heeft één PK die bestaat uit twee velden.

Databases 1 31-12-22 | 26
PK en FK naamgeving

De FK hoeft niet per definitie dezelfde naam te hebben als de PK


waarnaar deze verwijst. Het data type is wel altijd gelijk.

• In de praktijk is er meestal een duidelijke link tussen de namen


van de FK en zijn PK.
• Tijdens databases tentamens wordt er voor gezorgd dat er geen
onduidelijkheid kan bestaan.
• Hover over de relatie in MySQL Workbench dan zie je welke FK bij
welke PK hoort.
Databases 1 31-12-22 | 27
CROSS JOIN

Databases 1 31-12-22 | 28
CROSS JOIN

Plak achter elke rij van de ene tabel elke rij van de andere
tabel.

Schrijfwijze:
SELECT * FROM opleiding CROSS JOIN student;
SELECT * FROM opleiding JOIN student;

Databases 1 31-12-22 | 29
Voorbeeld CROSS JOIN(1)

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

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

Databases 1 31-12-22 | 30
Voorbeeld CROSS JOIN(2)

SELECT * FROM opleiding CROSS JOIN student;

Resultaat:
OPL- OMSCHRIJ- ACA- STUDENT- NAAM OPL-
CODE VING DEMIE NR CODE
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

Elke rij uit de student tabel is achter iedere rij uit de opleiding tabel
geplakt.

Databases 1 31-12-22 | 31
CROSS JOIN resultaat

Normaalgesproken heeft het resultaat van een CROSS JOIN


weinig praktisch nut.

Hij maakt echter wel duidelijker wat er gebeurt als we een INNER
JOIN gebruiken.

Databases 1 31-12-22 | 32
Vraag

Als tabelA 10 rijen heeft en tabelB heeft 6 rijen,


hoeveel rijen heeft het resultaat dan van: SELECT *
FROM tabelA CROSS JOIN tabelB;?

Antwoord:
60 = 10 * 6

Aan iedere rij in tabelA wordt iedere rij uit tabelB


geplakt.

Databases 1 31-12-22 | 33
INNER JOIN

Databases 1 31-12-22 | 34
INNER JOIN

Lijkt op CROSS JOIN.

We selecteren alleen die rijen uit het CROSS JOIN resultaat


waarvan de inhoud van het PK veld overeenkomt met de inhoud
van het FK.

In andere woorden: We houden alleen die rijen over waarvan de


inhoud met elkaar te maken heeft.

Schrijfwijze:
SELECT * FROM opleiding INNER JOIN student
ON opleiding.oplcode = student.oplcode;

SELECT * FROM opleiding JOIN student


ON opleiding.oplcode = student.oplcode;

Databases 1 31-12-22 | 35
Voorbeeld INNER JOIN(1)

SELECT * FROM opleiding CROSS JOIN student;

Resultaat:
OPL- OMSCHRIJ- ACA- STUDENT- NAAM OPL-
CODE VING DEMIE NR CODE
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

Databases 1 31-12-22 | 36
Voorbeeld INNER JOIN(2)

SELECT * FROM opleiding JOIN student


ON opleiding.oplcode = student.oplcode;
PK FK

OPL- OMSCHRIJ- ACA- STUDENT- NAAM OPL-


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

Alleen die rijen waar de PK overeenkomt met de FK zijn


overgebleven.

Databases 1 31-12-22 | 37
Voorbeeld INNER JOIN(3)

SELECT * FROM opleiding JOIN student


ON opleiding.oplcode = student.oplcode;

De onderste regel uit de query is toegevoegd aan de CROSS JOIN.

Hier wordt aangegeven hoe de PK uit de ene tabel gekoppeld moet


worden aan de FK uit de andere tabel.

Databases 1 31-12-22 | 38
JOIN welke tabellen?

Normaalgesproken JOIN je alleen de tabellen die met een relatie


met elkaar verbonden zijn.

Een relatie geeft immers aan dat er een bij elkaar horend FK en PK
paar is.

Die FK en PK kun je dus in de ON conditie verwerken.

Databases 1 31-12-22 | 39
Vraag

Maak de volgende query af:


SELECT * FROM inschrijving INNER JOIN planning ON …

Antwoord:
ON inschrijving.planningsnr = planning.planningsnr;

Databases 1 31-12-22 | 40
SELECT bij INNER JOIN

Let op de naamgeving in het SELECT statement:

SELECT oplcode FROM opleiding JOIN student


ON opleiding.oplcode = student.oplcode;

ERROR: Column 'oplcode' in field list is ambiguous

Reden: server weet niet of er opleiding.oplcode bedoeld wordt of


student.oplcode.

Dus:
SELECT opleiding.oplcode FROM opleiding JOIN student
ON opleiding.oplcode = student.oplcode;

(maar student.oplcode geeft zelfde resultaat)

Databases 1 31-12-22 | 41
Alternatief voor ON

In plaats van:
SELECT * FROM opleiding JOIN student
ON opleiding.oplcode = student.oplcode;

Mag je ook schrijven:


SELECT * FROM opleiding, student
WHERE opleiding.oplcode = student.oplcode;

Beide schrijfwijzes geven hetzelfde resultaat.


Persoonlijke voorkeur, maar:
• Bovenste manier is ANSI SQL
• Bovenste manier is beter leesbaar
• Bij de bovenste manier zijn de woorden van je query makkelijker te
veranderen in OUTER JOIN (maar daarover volgende week meer)
• Bij een JOIN van meerdere tabellen is bij de onderste manier
duidelijker welke rijen je weglaat uit de CROSS JOIN

Databases 1 31-12-22 | 42
JOIN multiple tables

Het is mogelijk om meerdere tabellen te JOINen in één query door


meerdere JOINS achter elkaar te schrijven.

Bijvoorbeeld:

SELECT * FROM
opleiding JOIN student
ON opleiding.oplcode = student.oplcode
JOIN belangstelling
ON belangstelling.studentnr = student.studentnr;

Het resultaat van de eerste JOIN (opleiding met student) wordt op


zichzelf weer geJOINed met de tabel van belangstelling.

Databases 1 31-12-22 | 43
JOIN multiple field PK

Indien een PK uit meerdere velden bestaat (en dus ook de FK)
wordt deze op de volgende manier geJOINed:

SELECT * FROM
instrument AS i JOIN stukinstrument AS s
ON i.instrumentnaam = s.instrumentnaam
AND i.toonhoogte = s.toonhoogte;

Een alias gebruiken is


vaak handig bij JOINS

Databases 1 31-12-22 | 44
Vragen?

Databases 1 31-12-22 | 45

You might also like