SQL Cheat Sheet – Zoeken en Joins

SQL

voor de Arnhemmer: use Northwind;


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() – aantal
  • SUM() – totaal
  • AVG() – gemiddelde
  • MAX() – hoogste waarde
  • MIN() – 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)?"