Samenvatting · Informatica · havo 5 Databases en SQL: tabellen, sleutels, SELECT, JOIN en GROUP BY
Bewaar deze samenvatting
Een webwinkel, een school en een bibliotheek hebben allemaal grote hoeveelheden gegevens die ze ordelijk moeten bewaren en snel moeten terugvinden. Dat doe je in een database. Na deze samenvatting begrijp je hoe een relationele database is opgebouwd en schrijf en lees je de belangrijkste SQL-opdrachten.
De relationele database
In een relationele database staan de gegevens in tabellen. Elke rij (record) is één geval, elke kolom (veld) is één eigenschap. Een voorbeeld met twee tabellen:
Tabel leerling:
| id | naam | klas |
|---|---|---|
| 1 | Eva | 4A |
| 2 | Bram | 4A |
| 3 | Chloë | 4B |
| 4 | Daan | 4B |
| 5 | Fien | 4B |
Tabel cijfers:
| leerling_id | vak | cijfer |
|---|---|---|
| 1 | wi | 8 |
| 1 | ne | 6 |
| 2 | wi | 5 |
| 2 | ne | 7 |
| 3 | wi | 9 |
| 4 | wi | 6 |
| 4 | ne | 4 |
| 5 | en | 8 |
Sleutels en relaties
- Een primaire sleutel is een kolom (of combinatie) die elke rij uniek identificeert. In leerling is dat id.
- Een vreemde sleutel is een kolom die verwijst naar de primaire sleutel van een andere tabel. In cijfers verwijst leerling_id naar leerling.id.
Zo ontstaat een relatie tussen tabellen. Hier is het een één-op-veel-relatie: één leerling heeft meerdere cijfers. Door gegevens over tabellen te verdelen voorkom je redundantie (dubbele opslag): de naam van een leerling staat één keer in leerling in plaats van bij elk cijfer.
SELECT: gegevens opvragen
Basisvorm: SELECT kolommen FROM tabel WHERE voorwaarde ORDER BY kolom.
- SELECT naam FROM leerling WHERE klas = '4B' geeft Chloë, Daan en Fien.
- SELECT naam FROM leerling WHERE klas = '4A' ORDER BY naam geeft Bram en Eva (alfabetisch; met DESC achter de kolom van Z naar A).
- SELECT * FROM leerling geeft alle kolommen van alle rijen.
Tekst en datums staan in de voorwaarde tussen enkele aanhalingstekens. Met AND, OR en NOT combineer je voorwaarden. Met LIKE zoek je op een patroon: naam LIKE 'C%' vindt namen die met C beginnen.
Rekenen met functies
Met aggregatiefuncties vat je meerdere rijen samen:
| functie | resultaat |
|---|---|
| COUNT(*) | aantal rijen |
| SUM(kolom) | som |
| AVG(kolom) | gemiddelde |
| MIN(kolom), MAX(kolom) | kleinste en grootste |
- SELECT COUNT(*) FROM leerling WHERE klas = '4B' geeft 3.
- SELECT AVG(cijfer) FROM cijfers WHERE vak = 'wi' geeft 7 (want 8, 5, 9 en 6 hebben gemiddelde 7).
- SELECT MAX(cijfer) FROM cijfers WHERE leerling_id = 1 geeft 8.
GROUP BY: per groep
Met GROUP BY maak je groepen en pas je de functie per groep toe:
SELECT vak, COUNT(*) FROM cijfers GROUP BY vak
Dit geeft wi met 4, ne met 3 en en met 1: het aantal cijfers per vak.
JOIN: tabellen samenvoegen
Met een JOIN haal je gegevens uit meerdere tabellen tegelijk. Je koppelt rijen via de sleutels:
SELECT leerling.naam, cijfers.cijfer FROM leerling JOIN cijfers ON leerling.id = cijfers.leerling_id WHERE cijfers.vak = 'wi' AND cijfers.cijfer >= 8
Dit geeft Eva met 8 en Chloë met 9: de wiskundecijfers van 8 of hoger, mét de naam erbij. Zet bij elke kolom de tabelnaam ervoor als de naam in beide tabellen kan voorkomen.
Gegevens wijzigen
- INSERT INTO voegt een rij toe: INSERT INTO leerling VALUES (6, 'Gijs', '4A').
- UPDATE wijzigt rijen: UPDATE cijfers SET cijfer = 6 WHERE leerling_id = 4 AND vak = 'ne'.
- DELETE FROM verwijdert rijen: DELETE FROM cijfers WHERE vak = 'en'.
Vergeet bij UPDATE en DELETE de WHERE niet: zonder WHERE geldt de wijziging voor alle rijen van de tabel.
Let op
- COUNT(*) telt rijen, AVG rekent een gemiddelde. Kies de juiste functie.
- WHERE filtert rijen vóór het groeperen. Een voorwaarde op de uitkomst van een functie hoort niet in WHERE.
- Tekst tussen enkele aanhalingstekens, getallen zonder.
- Een JOIN zonder ON-voorwaarde koppelt elke rij aan elke rij en levert een enorme, zinloze tabel.
- UPDATE en DELETE zonder WHERE treffen de hele tabel.
In het kort
- Een tabel heeft rijen (records) en kolommen (velden); de primaire sleutel is uniek per rij.
- Een vreemde sleutel verwijst naar de primaire sleutel van een andere tabel.
- SELECT, FROM, WHERE en ORDER BY vragen en sorteren gegevens op.
- COUNT, SUM, AVG, MIN en MAX vatten rijen samen; GROUP BY doet dat per groep.
- JOIN koppelt tabellen via een ON-voorwaarde; UPDATE en DELETE vragen altijd een WHERE.
Staat hier iets dat niet klopt of niet hoort? .