SQL
voor de Arnhemmer: use Northwind;
Inhoudsopgave
1. SELECT
Met SELECT haal je data op uit een tabel.
SELECT * FROM gebruikers;
SELECT naam, leeftijd FROM gebruikers;
2. WHERE
WHERE filtert rijen. Je krijgt alleen data die voldoet aan jouw voorwaarden.
SELECT * FROM gebruikers WHERE leeftijd >= 18;
3. LIKE
LIKE gebruik je om gedeeltelijk te zoeken.
SELECT * FROM gebruikers WHERE naam LIKE '%jan%';
4. ORDER BY
ORDER BY sorteert resultaten.
SELECT * FROM gebruikers ORDER BY leeftijd DESC;
5. LIMIT
LIMIT beperkt het aantal resultaten.
SELECT * FROM gebruikers LIMIT 10;
6. Wat zijn JOINs
Een JOIN gebruik je om data uit meerdere tabellen te combineren. Tabellen zijn vaak opgesplitst om herhaling te voorkomen.
Voorbeelden in deze uitleg gebruiken deze tabellen.
gebruikers --------- id naam email bestellingen ------------ id gebruiker_id product prijs
De kolom gebruiker_id verwijst naar gebruikers.id. Zo weet SQL welke bestelling bij welke gebruiker hoort.
7. INNER JOIN
INNER JOIN geeft alleen resultaten waar een match is in beide tabellen.
Alleen gebruikers die ook echt een bestelling hebben.
SELECT gebruikers.naam, bestellingen.product FROM gebruikers INNER JOIN bestellingen ON gebruikers.id = bestellingen.gebruiker_id;
Wat gebeurt hier.
Je start bij gebruikers.
Je koppelt bestellingen.
De koppeling gebeurt via id en gebruiker_id.
Zonder match geen resultaat.
8. LEFT JOIN
LEFT JOIN geeft alles uit de linkertabel. Ook als er geen match is.
Alle gebruikers, ook zonder bestellingen.
SELECT gebruikers.naam, bestellingen.product FROM gebruikers LEFT JOIN bestellingen ON gebruikers.id = bestellingen.gebruiker_id;
Als een gebruiker geen bestelling heeft, dan is product leeg.
9. RIGHT JOIN
RIGHT JOIN werkt hetzelfde als LEFT JOIN, maar dan andersom.
Alle bestellingen, ook als de gebruiker ontbreekt.
SELECT gebruikers.naam, bestellingen.product FROM gebruikers RIGHT JOIN bestellingen ON gebruikers.id = bestellingen.gebruiker_id;
RIGHT JOIN gebruik je minder vaak. Meestal draai je de tabellen om en gebruik je LEFT JOIN.
10. Meerdere JOINs
Je kunt meerdere tabellen koppelen.
Extra tabel.
betalingen ---------- id bestelling_id status
Gebruiker, bestelling en betaling combineren.
SELECT gebruikers.naam, bestellingen.product, betalingen.status FROM gebruikers INNER JOIN bestellingen ON gebruikers.id = bestellingen.gebruiker_id INNER JOIN betalingen ON bestellingen.id = betalingen.bestelling_id;
Elke JOIN koppelt twee tabellen. Je leest de query van boven naar beneden.
11. GROUP BY – Groeperen van gegevens
Met GROUP BY bundel je rijen die dezelfde waarde hebben in één of meer kolommen.
Meestal gebruik je dit samen met aggregate-functies zoals:
COUNT()– aantalSUM()– totaalAVG()– gemiddeldeMAX()– hoogste waardeMIN()– laagste waarde
Voorbeeld tabel bestellingen:
id | gebruiker_id | product | prijs | stad 1 | 5 | Laptop | 1200 | Nijmegen 2 | 7 | Telefoon | 800 | Arnhem 3 | 5 | Muis | 25 | Nijmegen 4 | 12 | Toetsenbord | 90 | Utrecht 5 | 5 | Laptop | 1150 | Nijmegen
Voorbeeld: hoeveel bestellingen per stad?
SELECT stad, COUNT(*) AS aantal_bestellingen FROM bestellingen GROUP BY stad;
Resultaat:
stad | aantal_bestellingen Nijmegen | 3 Arnhem | 1 Utrecht | 1
Belangrijk: Alle kolommen in SELECT die geen aggregate-functie hebben (zoals COUNT, SUM, AVG), moeten in de GROUP BY staan!
12. HAVING – Filteren ná het groeperen
WHERE filtert rijen voordat er gegroepeerd wordt.
HAVING filtert groepen nadat de groepering klaar is.
Daarom kun je met HAVING werken met COUNT(), SUM(), AVG() enz.
Voorbeelden (zelfde bestellingen tabel):
-- Fout! Dit mag niet:
SELECT stad, COUNT(*) AS aantal
FROM bestellingen
WHERE COUNT(*) > 2 -- ← WHERE mag geen aggregate
GROUP BY stad;
-- Correct met HAVING:
SELECT stad, COUNT(*) AS aantal_bestellingen
FROM bestellingen
GROUP BY stad
HAVING COUNT(*) > 2;
Resultaat:
stad | aantal_bestellingen Nijmegen | 3
Meer voorbeelden:
-- Steden met meer dan €1000 totaal omzet SELECT stad, SUM(prijs) AS totaal_omzet FROM bestellingen GROUP BY stad HAVING SUM(prijs) > 1000; -- Gemiddelde prijs hoger dan 500 per stad SELECT stad, AVG(prijs) AS gemiddelde_prijs FROM bestellingen GROUP BY stad HAVING AVG(prijs) > 500;
13. WHERE vs HAVING – snel overzicht
| Kenmerk | WHERE | HAVING |
|---|---|---|
| Wanneer uitgevoerd? | Vóór GROUP BY | Ná GROUP BY |
| Filtert... | Individuele rijen | Groepen |
| Mag aggregate-functies gebruiken? | Nee | Ja (COUNT, SUM, AVG...) |
| Gebruik je met GROUP BY? | Ja, maar vóór de groepering | Alleen mét GROUP BY zinvol |
Tip voor het examen: vraag jezelf altijd af: "wil ik filteren vóór het tellen/sommen (→ WHERE) of ná het tellen/sommen (→ HAVING)?"