En subquery är en fråga kapslad inne i en annan fråga — använd i WHERE, FROM, SELECT, eller med EXISTS. Det låter dig använda resultatet från en fråga inom en annan, vilket möjliggör komplex filtrering och beräkningar.
En subquery är en fråga kapslad inne i en annan fråga — använd i WHERE, FROM, SELECT, eller med EXISTS. Det låter dig använda resultatet från en fråga inom en annan, vilket möjliggör komplex filtrering och beräkningar.
-- 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 subquery i WHERE ger värden att filtrera mot — en lista (med IN) eller ett enskilt värde (med jämförelseoperatorer).
-- 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 korrelerad subquery refererar till den yttre frågan — den körs en gång per yttre rad (potentiellt långsammare). En okorrelerad subquery körs en gång.
-- 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 kontrollerar om en subquery returnerar några rader — ofta mer effektivt än IN för existenskontroller (det kan stoppas vid första träffen).
-- 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.
Subqueries är en viktig SQL-teknik för komplex frågning — att använda resultatet av en fråga inom en annan möjliggör filtrering och beräkningar som enkla frågor inte kan uttrycka, så att förstå dem är värdefullt för att skriva verkliga frågor.
Att känna till formerna — subqueries i WHERE (filtrering efter en lista med IN eller ett enskilt värde med jämförelser), korrelerade subqueries (refererar den yttre frågan, körs per rad), EXISTS (effektiv existenskontroll), och subqueries i FROM (härledda tabeller) — täcker de vanliga mönstren för att uttrycka komplex logik.
Att förstå skillnaden mellan korrelerade och okorrelerade subqueries är viktig för prestanda (korrelerade subqueries körs en gång per yttre rad och kan vara långsamma).
Lika värdefullt är att veta förhållandet till JOINs och CTEs: många subqueries kan skrivas om som JOINs (ofta mer effektivt och läsbart) eller CTEs (renare för komplexa fall), så att förstå när man använder varje — subqueries för filtrering/aggregeringklarhet, JOINs för datakombination — är en praktisk färdighet.
Eftersom verkliga frågor ofta kräver kapslning (filtrering efter aggregerade resultat, existenskontroller, jämförelse med beräknade värden), och eftersom att förstå subqueries, deras prestandakarakteristika (särskilt korrelerade), och deras förhållande till JOINs/CTEs är viktigt för att skriva effektiva, effektiva komplexa frågor, är att bemästra subqueries värdefullt, ofta använd kunskap för SQL bortom grundläggande frågning och ett vanligt intervjuämne som visar förmåga att uttrycka komplexa datakrav.