Scalaire subquery's in SELECT en WHERE
Subquery's met één waarde en de fout die ontstaat wanneer ze meer dan één rij retourneren
Scalaire subquery's in SELECT en WHERE is een gratis Voorbereiding op SQL-sollicitatiegesprekken-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Voorbereiding op SQL-sollicitatiegesprekken. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Voorbereiding op SQL-sollicitatiegesprekken bevat in totaal 4 lessen.
Wat een interviewer bedoelt met een scalaire subquery
Een scalaire subquery is een query die precies één rij en één kolom oplevert — één enkele waarde. Omdat deze query tot één waarde wordt gereduceerd, kun je haar in SQL bijna overal plaatsen waar ook een letterlijke waarde kan staan: in SELECT, WHERE, HAVING en zelfs ORDER BY.
- Interviewers toetsen of je de regel één rij, één kolom kent.
- De klassieke valkuil: een subquery die per ongeluk meer dan één rij oplevert.
Als je die definitie helder kunt formuleren, heb je het eerste controlepunt al gehaald.
Een scalaire subquery in de SELECT-lijst
Door een scalaire subquery in de SELECT-lijst te plaatsen, kun je aan elke uitvoerrij één berekende waarde toevoegen. Hier tonen we elke werknemer naast het gemiddelde salaris over het hele bedrijf.
De subquery (SELECT AVG(salary) FROM employees) wordt uitgevoerd en reduceert de hele tabel tot één getal; dat getal wordt vervolgens op elke rij herhaald.
SELECT
name,
salary,
(SELECT AVG(salary) FROM employees) AS company_avg
FROM employees;Een scalaire subquery in WHERE
Dezelfde ene waarde kan een filter aansturen. Een veelvoorkomende vraag in sollicitatiegesprekken is vind iedereen die meer verdient dan het bedrijfsgemiddelde.
De subquery berekent het gemiddelde één keer, waarna elke rij in de buitenste query ermee wordt vergeleken. Dit is niet gecorreleerd — de binnenste query hangt niet af van de buitenste rij en wordt dus maar één keer uitgevoerd.
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);De fout 'Meer dan één rij'
Dit is de fout waarop interviewers verwachten dat je anticipeert. Als je subquery wordt gebruikt met = of >, maar meerdere rijen oplevert, geeft de engine een fout:
- Postgres: meer dan één rij geretourneerd door een subquery die als expressie wordt gebruikt
- MySQL: subquery retourneert meer dan 1 rij
De query hieronder mislukt omdat er meerdere werknemers op afdeling 5 kunnen zijn — de subquery is niet scalair.
SELECT name
FROM employees
WHERE salary = (SELECT salary FROM employees WHERE dept_id = 5);Een subquery scalair maken
Twee betrouwbare manieren om één waarde te garanderen:
- Gebruik een aggregatiefunctie zoals
MAX,MINofAVG— aggregaties zonderGROUP BYleveren altijd één rij op. - Gebruik
LIMIT 1(Postgres/MySQL) ofFETCH FIRST 1 ROW ONLYna eenORDER BY.
De herstelde versie hieronder vraagt om het hoogste salaris op afdeling 5.
SELECT name
FROM employees
WHERE salary = (
SELECT MAX(salary) FROM employees WHERE dept_id = 5
);Scalaire subqueries leveren NULL op als er geen rijen zijn
Een subtiel punt voor sollicitatiegesprekken: als een scalaire subquery nul rijen vindt, ontstaat er geen fout — ze levert NULL op. Die NULL werkt vervolgens door in je vergelijking.
Omdat salary > NULL de waarde UNKNOWN oplevert (niet waar), geeft de buitenste query geen rijen terug. Kandidaten verwachten hier vaak een fout; het juiste antwoord is stilletjes een leeg resultaat.
SELECT name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary) FROM employees WHERE dept_id = 9999
);Voorbeeld: werknemers boven het gemiddelde met het verschil
Laten we beide toepassingen combineren. We tonen elke werknemer die boven het gemiddelde verdient en hoeveel hoger hun salaris is dan het gemiddelde. Dezelfde scalaire subquery staat in SELECT en WHERE.
Een interviewer kan vragen of de subquery twee keer wordt uitgevoerd. Logisch gezien staat hij er twee keer, maar een goede optimalisatie kan de niet-gecorreleerde subquery één keer uitvoeren en het resultaat hergebruiken.
SELECT
name,
salary,
salary - (SELECT AVG(salary) FROM employees) AS above_avg
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees)
ORDER BY above_avg DESC;Een scalaire subquery in ORDER BY
Omdat een scalaire subquery slechts een waarde is, is ze ook toegestaan in ORDER BY. Dit is zelden de duidelijkste aanpak, maar interviewers willen graag controleren of je weet dat het mag.
Hier sorteren we afdelingen op een waarde uit een andere tabel — het aantal werknemers per afdeling — zonder een join te gebruiken.
SELECT d.dept_name
FROM departments d
ORDER BY (
SELECT COUNT(*) FROM employees e WHERE e.dept_id = d.id
) DESC;Scalair versus gecorreleerd: ken het verschil
Het bovenstaande ORDER BY-voorbeeld verwijst ongemerkt naar d.id uit de buitenste query — daardoor is het een gecorreleerde scalaire subquery, die één keer per buitenste rij wordt uitgevoerd.
Interviewers zijn dol op dit onderscheid:
- Niet-gecorreleerde scalaire subquery: zelfstandig, wordt één keer uitgevoerd.
- Gecorreleerde scalaire subquery: verwijst naar de buitenste rij, wordt per rij uitgevoerd.
Beide leveren nog steeds één waarde op, maar de prestaties kunnen sterk verschillen.
Wanneer je geen scalaire subquery moet gebruiken
Een gecorreleerde scalaire subquery in de SELECT-lijst is handig, maar kan traag zijn bij grote tabellen — hij wordt per rij uitgevoerd. Interviewers verwachten dat je de alternatieven kent:
- Een
LEFT JOINmet een vooraf geaggregeerde afgeleide tabel. - Een vensterfunctie zoals
AVG(salary) OVER ().
De venstervorm hieronder levert dezelfde kolom met het bedrijfsgemiddelde op zonder een afzonderlijke subqueryscan.
SELECT
name,
salary,
AVG(salary) OVER () AS company_avg
FROM employees;Kernzin voor het sollicitatiegesprek
Als je wordt gevraagd een scalaire subquery te definiëren, zeg je: "Een scalaire subquery levert één rij en één kolom op, gedraagt zich dus als één enkele waarde en kan overal worden gebruikt waar een letterlijke waarde is toegestaan. Als ze meer dan één rij oplevert, geeft de engine een fout; als ze geen rijen oplevert, resulteert ze in NULL."
Die ene zin bevat de definitie, het foutgeval en het NULL-randgeval — de drie dingen waarop elke interviewer let.
Snelle controle
Toets je begrip van het gedrag van scalaire subqueries.
Samenvatting
Je beheerst nu scalaire subqueries:
- Definitie: één rij, één kolom — bruikbaar als een letterlijke waarde in SELECT, WHERE, HAVING en ORDER BY.
- Meerdere rijen met =/> veroorzaken een fout; maak de subquery scalair met een aggregatie of
LIMIT 1. - Nul rijen leveren NULL op, waardoor rijen in een filter stilletjes verdwijnen.
- Gecorreleerde scalaire subqueries worden per rij uitgevoerd; geef de voorkeur aan joins of vensterfuncties wanneer prestaties belangrijk zijn.
Volgende onderwerp: subqueries in de FROM-clausule, waar het resultaat een volledige virtuele tabel is.
Leer SQL met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 30
- Lessen
- 120
Veelgestelde vragen
Is de les “Scalaire subquery's in SELECT en WHERE” gratis?
Ja — de volledige tekst van “Scalaire subquery's in SELECT en WHERE” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Voorbereiding op SQL-sollicitatiegesprekken wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Voorbereiding op SQL-sollicitatiegesprekken bevat in totaal 4 lessen.
Wat leer ik in “Scalaire subquery's in SELECT en WHERE”?
Subquery's met één waarde en de fout die ontstaat wanneer ze meer dan één rij retourneren Je oefent met Voorbereiding op SQL-sollicitatiegesprekken door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Voorbereiding op SQL-sollicitatiegesprekken te beginnen?
Ervaring vooraf is niet nodig. Voorbereiding op SQL-sollicitatiegesprekken op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.
Hoe lang duurt de les “Scalaire subquery's in SELECT en WHERE”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Voorbereiding op SQL-sollicitatiegesprekken?
Ja. Elke les over Voorbereiding op SQL-sollicitatiegesprekken bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Scalaire subquery's in SELECT en WHERE
- Subquery's in de FROM-component (derived tables)
- IN-, ANY- en ALL-subquery's
- EXISTS versus IN: prestaties