SQL
1 Introductie phpMyAdmin en SELECT
๐ฏ Leerdoelen
- Je weet hoe je XAMPP en phpMyAdmin gebruikt.
- Je kunt een database importeren.
- Je weet wat SQL is.
- Je kunt gegevens ophalen met
SELECT
enFROM
.
๐ก Uitleg
In deze eerste opdracht werk je met een database met informatie over films. Je gebruikt de SELECT
-instructie om gegevens op te halen uit de tabel movies
.
Je voert verschillende queries uit om de inhoud van de tabel te verkennen.
Wat is SQL precies?
SQL staat voor Structured Query Language. Het is een programmeertaal die speciaal is ontworpen om te "praten" met databases. Een database is eigenlijk gewoon een heel goed georganiseerde verzameling van gegevens. Denk bijvoorbeeld aan de databases van:
- Instagram: met alle gebruikers, foto's, likes en reacties.
- Fortnite: met alle spelers, hun skins, V-Bucks en statistieken.
- Een webshop: met alle producten, prijzen en voorraad.
Met SQL kun je deze databases vragen stellen (queries) of opdrachten geven.
Wat heb je nodig?
- XAMPP (Apache en MySQL moeten aan staan)
- De database
mdb_movies.sqlsql
XAMPP en phpMyAdmin
We gaan gebruik maken van phpMyAdmin.
phpMyAdmin is eenonderdeel van XAMPP en wordt veel gebruikt om met datbases te werken. Je kan databases aanmaken, verwijderen, aanpassen en inzien.
Je kunt phpMyAdmin pas opstarten als je XAMPP goed draait; Apache en mySQL staan aan.
Start localhost/phpmyadmin
Stappen om de database te importeren:
- Start Apache en MySQL via het XAMPP Control Panel.
- Ga naar
http://localhost/phpmyadmin
in je browser. - Maak een nieuwe database aan met de naam
imdb_movies
. - Selecteer de database en gebruik het tabblad Import om het bestand
imdb_movies.sql
te importeren.
Kom je er niet uit: hier staat met plaatjes uitgelegd hoe je een database importeert.
๐ ๏ธ Opdracht
- Je hebt de database imdb_movies.sql geimporteerd
- Voer de volgende drie SQL-queryโs uit op de tabel
movies
:SELECT * FROM movies;
SELECT title FROM movies;
SELECT title, rating FROM movies;
Heb je meer uitleg nodig over hoe je query maakt, hier staat een voorbeeld met plaatjes)
- Bekijk het resultaat van elke query. Wat valt je op?
๐ง Reflectie
- Welke kolommen lijken jou het nuttigst als je een lijst met filmaanbevelingen zou maken?
- Wat is het verschil tussen
SELECT *
enSELECT kolomnaam
?
๐ค Inleveren
- Maak een screenshot waarbij je laat zien dat je een query hebt uitgevoerd op de database imdb_movies.
- Beantwoord de refelctievragen en lever die in (txt of pdf).
2 WHERE en logica
๐ฏ Leerdoelen
- Je kunt gegevens filteren met
WHERE
. - Je begrijpt het gebruik van logische operatoren zoals
=
,>
,<
,AND
, enOR
. - Je kunt AI gebruiken om een query te genereren en deze zelf controleren en verbeteren.
๐ก Uitleg
Met SELECT
haal je gegevens op. Met WHERE
kun je die gegevens filteren. Bijvoorbeeld: alleen landen met een hoge geluksindex, of alleen landen uit Europa.
We gebruiken de database mod-mysql-basic-worldhappiness.sql. Deze bevat o.a. tabellen jaar2015
en jaar2016
met kolommen als country
, region
, rank
en score
.
Voorbeelden:
SELECT * FROM jaar2016 WHERE score > 7000;
SELECT country, region FROM jaar2015 WHERE region = "Western Europe";
SELECT country, score FROM jaar2016 WHERE region = "Western Europe" AND score > 7300;
๐ ๏ธ Opdracht
- Importeer de database mod-mysql-basic-worldhappiness.sql in phpMyAdmin en selecteer de database
worldhappiness
. - Voer de volgende query's uit en controleer het resultaat:
- Selecteer alle landen uit de tabel
jaar2015
. - Selecteer alleen
country
enscore
uitjaar2016
. - Selecteer alle regio's uit 2015.
- Selecteer alle scores hoger dan 7200 in 2016.
- Selecteer landen uit de regio "Western Europe" in 2015.
- Selecteer alle landen uit de tabel
- Gebruik ChatGPT om een extra query te genereren waarbij je gebruik maakt van
OR
.
๐ง Reflectie
- Welke query vond je het lastigst en waarom?
- Welke filters heb je gebruikt? Noem minstens twee logische operatoren.
- Wat heeft AI (ChatGPT) goed gedaan, en wat moest je zelf aanpassen?
๐ค Inleveren
- Lever de zelf gemaakte query (opdrachtstap 3) in en leg uit in eigen woorden hoe die werkt.
3 Aggregatiefuncties
๐ฏ Leerdoelen
- Je kunt gebruik maken van SQL-functies zoals
COUNT()
,AVG()
,SUM()
,MIN()
enMAX()
. - Je kunt kolommen hernoemen met
AS
(alias). - Je begrijpt het verschil tussen
SELECT
van rijen en het samenvatten van gegevens.
๐ก Uitleg
Aggregatiefuncties worden gebruikt om samenvattingen te maken van gegevens in een kolom. Ze voeren een berekening uit op meerdere rijen tegelijk in plaats van รฉรฉn rij.
Belangrijkste functies:
Functie | Doel | Voorbeeld |
---|---|---|
COUNT() |
Telt hoeveel rijen er zijn | SELECT COUNT(*) FROM players; |
AVG() |
Geeft het gemiddelde van een kolom met getallen | SELECT AVG(wage) FROM players; |
SUM() |
Telt alle waarden in een kolom bij elkaar op | SELECT SUM(value) FROM players; |
MIN() |
Laat de kleinste waarde zien | SELECT MIN(age) FROM players; |
MAX() |
Laat de grootste waarde zien | SELECT MAX(value) FROM players; |
Alias gebruiken met AS
Je kunt je resultaatkolom een duidelijke naam geven met het sleutelwoord AS
.
SELECT AVG(wage) AS gemiddeld_loon FROM players;
Bonus: afronden met ROUND()
SELECT ROUND(AVG(wage)) AS gemiddeld_loon_afgerond FROM players;
๐ ๏ธ Opdracht
Gebruik de database mod-mysql-basic-fifa2018.sql
- Voer de volgende queries uit in phpMyAdmin:
- Toon het gemiddelde loon van alle spelers bij Ajax.
- Toon de totale waarde van spelers onder de 20 jaar.
- Toon het hoogste loon van een speler bij FC Utrecht.
- Toon het aantal spelers uit Nederland.
- Toon het gemiddelde loon van alle Braziliaanse spelers, afgerond op hele euro's.
- Gebruik bij elke query een duidelijke alias via
AS
.
๐ง Reflectie
- Wat is het voordeel van een samenvattende query (zoals
AVG()
) in plaats van het handmatig bekijken van individuele rijen? - Welke query vond je het lastigst en waarom?
๐ค Inleveren
- Lever een .txt-bestand in met alle 5 queryโs.
Vergeer de aliasen niet!
4 DELETE en veiligheid
๐ฏ Leerdoelen
- Je begrijpt het doel van een
DELETE
-statement. - Je kunt een
DELETE
-statement schrijven met eenWHERE
-clausule. - Je weet waarom een
WHERE
-clausule cruciaal is bij verwijderen van gegevens.
๐ก Uitleg
Met SQL kun je niet alleen gegevens opvragen, maar ook verwijderen. Dat doe je met het DELETE
-statement. Hierbij is het essentieel dat je altijd een WHERE
-clausule gebruikt. Als je dat niet doet, verwijder je รกlle rijen in de tabel!
Voorbeeld:
DELETE FROM players WHERE name = "K. Huntelaar";
Deze query verwijdert alleen de speler met die naam.
Fout voorbeeld (NIET DOEN!):
DELETE FROM players;
Deze query verwijdert alle spelers uit de tabel. Dit is onherstelbaar.
๐ ๏ธ Opdracht
Gebruik de database mod-mysql-basic-fifa2018.sql (zoals in de vorige opdracht).
- Voer de volgende opdrachten uit met een
DELETE
-statement:- Verwijder de speler "David Silva".
- Verwijder alle spelers van de club "Willem II".
- Verwijder alle Braziliaanse spelers die ouder zijn dan 34.
- Verwijder alle spelers waarvan het loon (=wage) hoger is dan 200000.
- Gebruik daarna de volgende query om te controleren hoeveel spelers er nog zijn:
SELECT COUNT(*) FROM players;
Het antwoord dat hier uit moet komen als je alles goed hebt gedaan is 533
TIP: maak eerst een select en als je de juiste resultaten terug krijgt vervang dan de select * in delete
Mocht het niet goed gaan dan kun je de database altijd opnieuw importeren en opnieuw beginnen.
๐ง Reflectie
- Wat had er fout kunnen gaan als je de
WHERE
-clausule was vergeten? - Waarom is het handig om altijd eerst een
SELECT
met dezelfdeWHERE
-clausule te doen voordat jeDELETE
uitvoert?
๐ค Inleveren
- Voeg een screenshot toe van de output van je
SELECT COUNT(*)
-query. - antwoord op de reflectievragen (txt of pdf)
5 Introductie tot JOINs
๐ฏ Leerdoelen
- Je begrijpt het nut van tabellen koppelen met een
JOIN
. - Je weet wat een
PRIMARY KEY
enFOREIGN KEY
zijn. - Je kunt een eenvoudige
INNER JOIN
uitvoeren.
๐ก Uitleg
In een echte database worden gegevens vaak verdeeld over meerdere tabellen. Je gebruikt een JOIN om die tabellen aan elkaar te koppelen. Zo kun je bijvoorbeeld zien in welke klas een student zit en wie zijn studieloopbaanbegeleider is.
Wat is een JOIN
?
Een JOIN combineert rijen uit twee tabellen op basis van een kolom die ze gemeenschappelijk hebben. Dit is vaak een id-veld zoals klas_id
.
Voorbeeld:
Stel: we hebben twee tabellen:
studenten
+----+----------+-----------+----------+
| id | voornaam | achternaam| klas_id |
+----+----------+-----------+----------+
| 1 | Fatima | Bakker | 101 |
| 2 | Noah | de Vries | 101 |
| 3 | Aziz | Bouali | 102 |
klassen
+------+----------+------------------+
| id | klas_naam| studie_coach |
+------+----------+------------------+
| 101 | SD1A | meneer Willems |
| 102 | SD1B | mevrouw Jansen |
Met een JOIN kun je voor elke student zien in welke klas hij/zij zit รฉn wie zijn of haar studiecoach is:
SELECT studenten.voornaam, studenten.achternaam, klassen.klas_naam, klassen.studie_coach
FROM studenten
INNER JOIN klassen ON studenten.klas_id = klassen.id;
De tabel studenten wordt verbonden met klassen waarbij de primary key (id) van klassen wordt verbonden met de foreign key (klas_id) van studenten
๐ ๏ธ Opdracht
Maak een nieuwe database aan
- Open phpMyAdmin en maak een database aan met de naam
join_oefening
.
Maak deze twee tabellen aan
1. Mak een database en voer importeer deze database
CREATE TABLE studenten (
id INT AUTO_INCREMENT PRIMARY KEY,
voornaam VARCHAR(50),
achternaam VARCHAR(50),
klas_id INT
);
CREATE TABLE klassen (
id INT AUTO_INCREMENT PRIMARY KEY,
klas_naam VARCHAR(50),
aantal_leerlingen INT,
studie_coach VARCHAR(100)
);
INSERT INTO klassen (klas_naam, aantal_leerlingen, studie_coach) VALUES
('SD1A', 24, 'meneer Willems'),
('SD1B', 22, 'mevrouw Jansen'),
('SD1C', 25, 'meneer El Idrissi');
INSERT INTO studenten (voornaam, achternaam, klas_id) VALUES
('Fatima', 'Bakker', 1),
('Noah', 'de Vries', 1),
('Aziz', 'Bouali', 2),
('Eva', 'Peeters', 2),
('Liam', 'Meijer', 1),
('Sophie', 'van der Laan', 2),
('Daan', 'Mulder', 3),
('Aisha', 'Khan', 3);
Schrijf een JOIN-query
- Voer deze query uit:
SELECT studenten.voornaam, studenten.achternaam, klassen.klas_naam, klassen.studie_coach FROM studenten INNER JOIN klassen ON studenten.klas_id = klassen.id;
- Pas de query aan zodat je alleen studenten uit klas
SD1A
toont.
Stap 5: AI
- Vraag aan ChatGPT om een JOIN-query te schrijven die de studenten met hun klas en coach toont.
- Test of de AI-query werkt. Verbeter hem indien nodig.
๐ง Reflectie
- Wat is het voordeel van gegevens opsplitsen in meerdere tabellen?
- Wat gebeurt er als je geen JOIN gebruikt?
- Welke verschillen zag je tussen jouw JOIN en de AI-versie?
๐ค Inleveren
- Lever een .txt-bestand in met je JOIN-query + AI-query.
- Voeg een screenshot toe van de uitvoer in phpMyAdmin.
- Lever je reflectie in als .txt of .pdf.