Een subquery is een query genest in een andere query — gebruikt in WHERE, FROM, SELECT, of met EXISTS. Het laat je het resultaat van één query binnen een ander gebruiken, wat complexe filtering en berekeningen mogelijk maakt.
Een subquery is een query genest in een andere query — gebruikt in WHERE, FROM, SELECT, of met EXISTS. Het laat je het resultaat van één query binnen een ander gebruiken, wat complexe filtering en berekeningen mogelijk maakt.
-- find users who have placed an order (their id is in the orders table)
SELECT name FROM users
WHERE id IN (SELECT user_id FROM orders); -- the subquery returns a list of user_ids
-- find products more expensive than the average
SELECT name, price FROM products
WHERE price > (SELECT AVG(price) FROM products); -- subquery returns a single value
Een subquery in WHERE levert waarden om tegenaan te filteren — een lijst (met IN) of een enkele waarde (met vergelijkingsoperatoren).
-- for each user, find those with above-average orders FOR THEIR COUNTRY
SELECT name FROM users u
WHERE order_count > (
SELECT AVG(order_count) FROM users
WHERE country = u.country -- references the OUTER query's row (correlated)
);
Een gecorreleerde subquery verwijst naar het buitenste query — het wordt eenmaal per buitenste rij uitgevoerd (mogelijk langzamer). Een niet-gecorreleerde subquery wordt eenmaal uitgevoerd.
-- users who have at least one order (often more efficient than IN)
SELECT name FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id -- just checks existence
);
EXISTS controleert of een subquery enige rijen retourneert — vaak efficiënter dan IN voor bestaanschecks (het kan stoppen bij de eerste overeenkomst).
-- use a subquery result as a table
SELECT country, avg_age FROM (
SELECT country, AVG(age) AS avg_age FROM users GROUP BY country
) AS country_stats
WHERE avg_age > 30;
Many subqueries can be rewritten as JOINs (often more efficient/readable).
WHERE id IN (SELECT ...) → can often be a JOIN
Use subqueries for clarity in filtering/aggregation; JOINs for combining data.
CTEs (WITH) are often a cleaner alternative to complex nested subqueries.
Subquery's zijn een belangrijke SQL-techniek voor complexe query's — het gebruik van het resultaat van één query binnen een ander maakt filtering en berekeningen mogelijk die eenvoudige query's niet kunnen uitdrukken, dus het begrijpen ervan is waardevol voor het schrijven van praktische query's.
Het kennen van de vormen — subquery's in WHERE (filteren op een lijst met IN of een enkele waarde met vergelijkingen), gecorreleerde subquery's (verwijzen naar het buitenste query, eenmaal per rij uitgevoerd), EXISTS (efficiënte bestaanschecks), en subquery's in FROM (afgeleide tabellen) — dekt de veelgebruikte patronen voor het uitdrukken van complexe logica.
Het begrijpen van het onderscheid tussen gecorreleerde en niet-gecorreleerde subquery's is belangrijk voor prestaties (gecorreleerde subquery's worden eenmaal per buitenste rij uitgevoerd en kunnen langzaam zijn).
Evenals waardevol is het kennen van de relatie tot JOINs en CTEs: veel subquery's kunnen worden herschreven als JOINs (meestal efficiënter en leesbaarder) of CTEs (schoner voor complexe gevallen), dus begrijpen wanneer elk moet worden gebruikt — subquery's voor filtering/aggregatie-helderheid, JOINs voor het combineren van gegevens — is een praktische vaardigheid.
Omdat real-world query's vaak nesting vereisen (filteren op samengevoegde resultaten, bestaanschecks, vergelijken met berekende waarden), en omdat het begrijpen van subquery's, hun prestatiekenmerken (vooral gecorreleerde), en hun relatie tot JOINs/CTEs belangrijk is voor het schrijven van effectieve, efficiënte complexe query's, is het beheersen van subquery's waardevolle, veelvuldig toegepaste kennis voor SQL voorbij basale query's en een veelvoorkomend interviewonderwerp dat de mogelijkheid aantoont om complexe datavereisten uit te drukken.