Professional Documents
Culture Documents
Les 4 Joins
Les 4 Joins
SQL
1
Inhoud
❖Relaties
❖Zoeken in 2 tabellen
– INNER JOIN
– LEFT OUTER JOIN
– RIGHT OUTER JOIN
– FULL OUTER JOIN
❖Aanpassen van kolomdefinitie
❖Zoeken in 3 of meer tabellen
❖Aliassen gebruiken voor kolommen en
tabellen
2
Relaties
3
Huidige situatie
*
Boete Speler
1 4
Relaties
5
Bij elke boete slaan we het spelerId op.
6
Relaties
1..1
Klant Order
0..*
7
Relaties (aard...connectiviteit)
⚫ de aard van een relatie:
9
Connectiviteit
⚫ Soorten relaties:
– Eén op één relatie
– Eén op veel relatie
– Veel op één relatie
– Veel op veel relatie
10
Connectiviteit
1 1
Student Studiebeurs
11
Connectiviteit
⚫ Eén op veel relatie
1
Klas Student
*
Men beschrijft eerst de relatie van links naar
rechts.
12
Connectiviteit
13
Connectiviteit
Student * Klas
1
14
Connectiviteit
Student * Klas
1
15
Connectiviteit
Student * Docent
*
16
Connectiviteit
Student * Docent
*
Deze relatie komt NOOIT voor in een ERD.
Later volgt de oplossing !
17
Relaties
18
Refererende sleutel of Foreign Key (FK)
19
Refererende sleutel of Foreign Key (FK)
⚫ Voorbeeld:
– Elk order wordt geplaatst door 1 klant
– Een klant heeft meerdere orders
– Dus er is een relatie tussen entiteiten
20
ERD voorbeeld – H&S
Klant Order
Product
21
ERD voorbeeld – H&S
(verplicht aanwezig – 1 exemplaar)
1..1
Klant Order
1..1
Product
22
ERD voorbeeld – H&S
# orders (optioneel – veel exemplaren)
1..1
Klant Order
0..*
0..*
Product
23
ERD voorbeeld – H&S
# orders (optioneel – veel exemplaren)
1..1
Klant Order
0..*
Klant Order
id PK id PK
familienaam klantId FK
voornaam
24
Associatie-entiteit?
Order 0..* Product
0..*
25
Associatie-entiteit?
Orderlijn
id PK
orderId FK
productId FK
hoeveelheid
1..1
Order Orderlijn
0..*
0..*
1..1 op 0..veel
0..veel op 1..1
1..1 op 0..*
0..* op 1 ..1
1..1
Product
28
ERD voorbeeld – H&S
1..1
Order Orderlijn
0..*
0..* 0..*
1..1 1..1
Klant Product
29
Zoeken in 2 tabellen
30
Voorbeeld
⚫ Speler:
SELECT
id,
CONCAT(TRIM(voornaam),SPACE(1),TRIM(naam)) AS 'naam',
straat,
huisnummer,
postcode,
plaats
FROM Tennis.Speler
WHERE id IN (6, 8, 27, 44, 104)
ORDER BY id; 33
Beter voorbeeld
34
Oplossing Join
PK
FK
Speler.id = Boete.spelerId
➔ Join-voorwaarde
36
Joins Speler
Spelers
zonder
boetes
Spelers met boetes
2
7 Boete
28
39 6
100 8
112 27
… 44
104
Niet in ons
voorbeeld
37
Joins
39
Ander voorbeeld : INNER JOIN
⚫ Tabel Les.Land
PK
⚫ Tabel Les.Staat
PK FK
40
Ander voorbeeld : INNER JOIN
Land Land
zonder
staat
Land met staten
id
Staat
3
landId
1
2
id
4
SELECT *
FROM
Les.Land INNER JOIN Les.Staat
ON Land.id = Staat.landId Resultaat
42
Aanpassen van kolom-definitie
Spelers Speler
zonder
boetes Spelers met boetes
2
7
28
39 Boete
100 6
112 8
… 27
44
104
Boete 10 – speler
NULL toevoegen
43
Aanpassen van kolom-definitie
44
Aanpassen van kolom-definitie
45
Aanpassen van kolom-definitie
⚫ Syntax:
⚫ Voorbeeld:
of
47
Joins Speler
Spelers
zonder
boetes
Spelers met boetes
2
7 Boete
28
39 6
100 8
112 27
… 44
104
NULL,’2019-03-05',25
49
Soorten Joins
50
Soorten Joins
⚫ Gevraagd:
– Spelers met hun boete
SELECT
Speler.id,
CONCAT(TRIM(Speler.voornaam),SPACE(1),TRIM(Speler.naam))
AS 'naam’,
Boete.datum,
Boete.bedrag
FROM
Tennis.Speler INNER JOIN Tennis.Boete
ON Speler.id = Boete.spelerId
;
51
Join: INNER JOIN
⚫ Syntax:
SELECT
kolomnaam1,
kolomnaam2,…
FROM
Schema.Tabel1 INNER JOIN Schema.Tabel2
ON Tabel1.kolomnaam = Tabel2.kolomnaam
;
52
Soorten Joins
⚫ Gevraagd:
– Spelers zonder boete
SELECT
Speler.id,
CONCAT(TRIM(Speler.voornaam),SPACE(1),TRIM(Speler.naam))
AS 'naam’,
Boete.datum,
Boete.bedrag
FROM
Tennis.Speler LEFT JOIN Tennis.Boete
ON Speler.id = Boete.spelerId
;
53
Soorten Joins
⚫ Gevraagd:
– Spelers zonder boete
⚫ Oplossing ≠ gevraagde
⚫ Oplossing = spelers met
hun eventuele boetes
54
Join: LEFT [OUTER] JOIN
⚫ Syntax:
SELECT
kolomnaam1,
kolomnaam2,…
FROM
Schema.Tabel1 LEFT [OUTER] JOIN Schema.Tabel2
ON Tabel1.kolomnaam = Tabel2.kolomnaam
;
55
Ander voorbeeld : LEFT JOIN
SELECT *
FROM
Les.Land LEFT JOIN Les.Staat
ON Land.id = Staat.landId
;
56
Soorten Joins
⚫ Oplossing = gevraagde
57
Soorten Joins
58
Soorten Joins
⚫ Oplossing ≠ gevraagde
⚫ Oplossing = boetes met de eventuele toegekende
spelers
59
Join: RIGHT OUTER JOIN
⚫ Syntax:
SELECT
kolomnaam1,
kolomnaam2,…
FROM
Schema.Tabel1 RIGHT [OUTER] JOIN Schema.Tabel2
ON Tabel1.kolomnaam = Tabel2.kolomnaam
;
60
Ander voorbeeld : RIGHT JOIN
SELECT *
FROM
Les.Land RIGHT JOIN Les.Staat
ON Land.id = Staat.landId
;
61
Soorten Joins
⚫ Oplossing = gevraagde
⚫ Oplossing = boetes niet toegekend aan een speler
62
Soorten Joins
63
Soorten Joins
64
Join: FULL OUTER JOIN
⚫ Syntax:
SELECT
kolomnaam1,
kolomnaam2,…
FROM
Schema.Tabel1 FULL [OUTER] JOIN Schema.Tabel2
ON Tabel1.kolomnaam = Tabel2.kolomnaam
;
65
Ander voorbeeld : FULL JOIN
SELECT *
FROM
Les.Land FULL JOIN Les.Staat
ON Land.id = Staat.landId
;
66
Zoeken in 3 of meer
tabellen
67
Voorbeelden
68
Voorbeelden
69
Voorbeelden: 1STE JOIN
Speler - Wedstrijd
PK
FK
Speler.id =
Wedstrijd.spelerId
70
Voorbeelden
71
Voorbeelden: 2de JOIN
Wedstrijd met Team
PK
FK FK
Speler.id =
Wedstrijd.spelerId
PK
Wedstrijd.teamId =
Team.id 72
1ste join:
Speler en Wedstrijd vastleggen
SELECT
Speler.id,
Speler.naam,
Wedstrijd.id AS 'wedstrijd',
Wedstrijd.aantalGewonnenSets,
Wedstrijd.aantalVerlorenSets
FROM
Tennis.Speler INNER JOIN Tennis.Wedstrijd
ON Speler.id = Wedstrijd.spelerId
;
73
2de join:
resultaat van 1ste join en Team vastleggen
SELECT
Speler.id,
Speler.naam,
Wedstrijd.id AS 'wedstrijd',
Wedstrijd.aantalGewonnenSets,
Wedstrijd.aantalVerlorenSets,
Team.id AS 'team',
Team.divisie
FROM
74
2de join:
resultaat van 1ste join en Team vastleggen
SELECT
Speler.id,
Speler.naam,
Wedstrijd.id AS 'wedstrijd',
Wedstrijd.aantalGewonnenSets,
Wedstrijd.aantalVerlorenSets,
Team.id AS 'team',
Team.divisie
FROM
Tennis.Speler INNER JOIN Tennis.Wedstrijd
ON Speler.id = Wedstrijd.spelerId
INNER JOIN Tennis.Team
ON Wedstrijd.teamId = Team.id
;
75
2de join:
resultaat van 1ste join en Team vastleggen
SELECT
kolomnaam1,
kolomnaam2,…
FROM
Tabel1 INNER JOIN Tabel2
ON Tabel1.kolomnaam = Tabel2.kolomnaam
INNER JOIN Tabel3
ON Tabel2.kolomnaam = Tabel3.kolomnaam
;
77
Voorbeelden
78
Voorbeelden
79
Voorbeelden
⚫ Merk op:
– Spelers die meerdere wedstrijden speelden
staan meerdere keren in de lijst
– Bij spelers die geen wedstrijd speelden wordt
alles opgevuld met NULL-waarden
80
Alias gebruiken
⚫ Kolom hernoemen
– Wedstrijd.id AS 'wedstrijd’
⚫ Tabelnaam hernoemen
– FROM Tennis.Speler AS S
– achter de tabelnaam schrijf je AS en 1, 2 of 3
letters, waarmee je weet over welke tabel het
gaat
– Afspraak:
• 1ste letter van de eigenlijke tabelnaam +
eventueel volgnummer (vb. zie later)
• Of 1ste letter van elk zelfstandig naamwoord
– WerknemerBedrijfJob wordt WBJ 81
Alias gebruiken
SELECT
S.id,
S.naam,
W.id AS 'wedstrijd’,
W.aantalGewonnenSets,
W.aantalVerlorenSets,
T.id AS 'team’,
T.divisie
FROM
Tennis.Speler AS S LEFT JOIN Tennis.Wedstrijd AS W
ON S.id = W.spelerId
LEFT JOIN Tennis.Team AS T
ON W.teamId = T.id
);
82
Voorbeelden
83
Voorbeelden
SELECT
S1.id,
S1.naam,
W.id AS 'wedstrijd’,
W.aantalGewonnenSets,
W.aantalVerlorenSets,
T.id AS 'team’,
T.divisie,
S2.id,
S2.naam
FROM
Tennis.Speler AS S1 LEFT JOIN Tennis.Wedstrijd AS W
ON S1.id = W.spelerId
LEFT JOIN Tennis.Team AS T
ON W.teamId = T.id
LEFT JOIN Tennis.Speler AS S2
ON T.spelerId = S2.id
;
84
Oefeningen
85