Draken temmen: 5 tips voor leesbare SQL-query's

Draken bestaan niet, maar draken van query's kom ik veel te vaak tegen: complex ogende code waar je op het eerste gezicht liever niet het gevecht mee aangaat. Vijf manieren om te zorgen dat jouw query's geen draken worden.

1. Vriendelijk uitziende draken

Met een beetje opmaak ziet een draak er al een stuk minder imponerend uit. Drie regels volstaan. Verdeel de query over meerdere regels; dat hij lang wordt is geen probleem, duidelijkheid gaat boven kortheid. Zet de SQL-woorden in hoofdletters, SELECT, FROM, WHERE, en ook functies als ROUND en SUM: zo herken je in één oogopslag wat de taal is en wat jouw namen zijn. En spring in, zodat de onderdelen onder elkaar uitlijnen.

SELECT c.cursus_naam,
 COUNT(*) AS aantal,
 ROUND(AVG(u.resultaat), 1) AS gemiddelde
FROM Uitslagen AS u
 JOIN Cursussen AS c ON c.cursus_id = u.cursus_id
WHERE u.datum >= '2026-01-01'
GROUP BY c.cursus_naam
HAVING COUNT(*) >= 5
ORDER BY gemiddelde DESC;

Je hoeft dat niet met de hand te doen. De meeste editors hebben een opmaakfunctie ingebouwd, en anders is er een online opmaker als sqlformat: je voert een draak in en krijgt een leesbare query terug.

2. Documentatie in de query zelf

Bij een ingewikkelde query komt puzzelwerk kijken, en welke stappen je hebt genomen is later niet terug te lezen. Zet dat er dus bij. Documentatie hoeft geen boekwerk te zijn: alles achter -- wordt bij het uitvoeren genegeerd.

-- Gemiddeld cijfer per cursus, alleen cursussen met vijf of meer deelnemers.
-- Let op: proefexamens staan ook in Uitslagen, die filteren we met soort = 'E'.

Zet boven elke query wat hij doet en waar de valkuilen zitten. Besteed extra aandacht aan subquery's, want die voegen complexiteit toe die uitleg nodig heeft.

3. Het beestje bij zijn naam noemen

Tabelnamen zijn soms lang en cryptisch. Om ze niet steeds te hoeven typen kun je een alias gebruiken. Doe dat met een korte naam of afkorting die iets zegt, en niet met een losse letter: Uitslagen AS u leest prettiger dan Uitslagen AS a, en in een query met zes tabellen weet niemand meer wie e en f waren. Ook hier: duidelijkheid boven kortheid.

4. Verdeel en heers

Soms is het handig om het probleem in stukken te knippen, bijvoorbeeld als je veel tabellen combineert en daarna nog moet filteren. Een view kan zo'n tussenstap zijn, en voor een tussenstap die je maar één keer nodig hebt is een WITH-blok handiger: je zet het tussenresultaat bovenaan, geeft het een naam, en gebruikt het daaronder alsof het een tabel is.

WITH per_cursus AS (
 SELECT cursus_id,
 COUNT(*) AS aantal,
 AVG(resultaat) AS gemiddelde
 FROM Uitslagen
 GROUP BY cursus_id
)
SELECT c.cursus_naam, p.aantal, ROUND(p.gemiddelde, 1) AS gemiddelde
FROM per_cursus AS p
 JOIN Cursussen AS c ON c.cursus_id = p.cursus_id
WHERE p.aantal >= 5
ORDER BY gemiddelde DESC;

Dat is dezelfde query als hierboven, in twee stappen die je los kunt nakijken. Werkt het niet, dan kun je het bovenste blok apart uitvoeren en zien waar het misgaat.

5. Laat een draak uitleggen wat hij doet

Erf je een query van een voorganger, dan kun je een AI-hulpje vragen wat hij doet en hem netjes op te maken. Dat werkt goed als leeswijzer, en controleer de uitleg voordat je erop vertrouwt: een model raadt de bedoeling van een filter, het weet niet wat er in jouw tabellen staat. Voer daarna de query uit met een COUNT(*) erbij en kijk of het aantal rijen klopt met wat je verwacht.

En kijk voordat je gaat sleutelen naar het uitvoeringsplan van je query, met EXPLAIN of in de editor. Een draak is meestal niet langzaam omdat hij lang is, maar omdat er één index ontbreekt.

Zelf leren

Wil je leren werken met aliassen, subquery's, joins en views? Dat komt allemaal aan bod in de cursus SQL Basis en de cursus SQL Vervolg.