En delspørring er et spørsmål som er nestet inne i et annet spørsmål — brukt i WHERE, FROM, SELECT, eller med EXISTS. Det lar deg bruke resultatet av ett spørsmål innenfor et annet, og muliggjør kompleks filtrering og beregninger.
En delspørring er et spørsmål som er nestet inne i et annet spørsmål — brukt i WHERE, FROM, SELECT, eller med EXISTS. Det lar deg bruke resultatet av ett spørsmål innenfor et annet, og muliggjør kompleks filtrering og beregninger.
-- 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
En delspørring i WHERE gir verdier å filtrere mot — en liste (med IN) eller en enkelt verdi (med sammenligningsoperatorer).
-- 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)
);
En korrelert delspørring refererer til det ytre spørsmålet — den kjøres én gang per ytre rad (potensielt langsommere). En ukorrelert delspørring kjøres én gang.
-- 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 sjekker om en delspørring returnerer noen rader — ofte mer effektiv enn IN for eksistenskontroller (den kan stoppe ved første treff).
-- 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.
Delspørringer er en viktig SQL-teknikk for kompleks spørring — å bruke resultatet av ett spørsmål innenfor et annet muliggjør filtrering og beregninger som enkle spørsmål ikke kan uttrykke, så å forstå dem er verdifullt for å skrive virkelige spørsmål.
Å kjenne formene — delspørringer i WHERE (filtrering etter en liste med IN eller en enkelt verdi med sammenligninger), korrelerte delspørringer (som refererer til det ytre spørsmålet, kjøres per rad), EXISTS (effektive eksistenskontroller), og delspørringer i FROM (avledede tabeller) — dekker de vanlige mønstrene for å uttrykke kompleks logikk.
Å forstå skillet mellom korrelerte og ukorrelerte delspørringer er viktig for ytelse (korrelerte delspørringer kjøres én gang per ytre rad og kan være langsomme).
Like verdifullt er å kjenne forholdet til JOINs og CTEs: mange delspørringer kan skrives om til JOINs (ofte mer effektive og lesbare) eller CTEs (renere for komplekse tilfeller), så å forstå når du skal bruke hver — delspørringer for filtrering/aggregeringklarhet, JOINs for datakombinering — er en praktisk ferdighet.
Ettersom virkelige spørsmål ofte krever nesting (filtrering etter aggregerte resultater, eksistenskontroller, sammenlikning med beregnede verdier), og siden å forstå delspørringer, deres ytelseskarakteristikk (spesielt korrelerte), og deres forhold til JOINs/CTEs er viktig for å skrive effektive, effektive komplekse spørsmål, er det verdifullt og hyppig brukt kunnskap å mestre delspørringer for SQL utover grunnleggende spørring og et vanlig intervjutema som demonstrerer evne til å uttrykke komplekse datakrav.