SQL Academy · Lektion

Korrelerede kontra ikke-korrelerede underforespørgsler

Forstå korrelerede underforespørgsler, der refererer til den ydre række, deres ydelsesegenskaber, og hvornår EXISTS er bedre end IN.

Lektion 2 af 413 trin

Korrelerede kontra ikke-korrelerede underforespørgsler er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.

Ikke-korrelerede underforespørgsler

En ikke-korreleret underforespørgsel refererer ikke til den ydre række. Den køres én gang, og resultatet genbruges:

SELECT * FROM users
WHERE id IN (
  SELECT user_id FROM orders WHERE status = 'paid'
);

Korrelerede underforespørgsler

En korreleret underforespørgsel refererer til den ydre række — logisk set køres den igen for hver ydre række:

SELECT u.id, u.email
FROM users u
WHERE EXISTS (
  SELECT 1 FROM orders o
  WHERE o.user_id = u.id
    AND o.total > 1000
);

Sådan ser du forskellen

Hvis den indre SELECT refererer til en kolonne fra den ydre FROM, er den korreleret.

Konsekvenser for ydeevnen

En naiv korreleret underforespørgsel er O(outer × inner). Moderne forespørgselsplanlæggere omskriver den ofte til en semijoin eller hash-join — men du bør stadig skrive den enkleste form, når det er muligt.

EXISTS kontra IN

Ved "mindst ét match":

-- IN with non-correlated subquery (often the planner's favourite):
SELECT u.* FROM users u
WHERE u.id IN (SELECT user_id FROM orders);

-- EXISTS with correlated subquery (NULL-safe alternative):
SELECT u.* FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);

NOT EXISTS er altid bedre end NOT IN

NOT IN fejler, når det indre sæt indeholder NULL. Det gør NOT EXISTS ikke. Foretræk altid NOT EXISTS til en anti-join:

-- BUG-prone:
SELECT u.* FROM users u
WHERE u.id NOT IN (SELECT excluded_id FROM blocklist);

-- Safe:
SELECT u.* FROM users u
WHERE NOT EXISTS (SELECT 1 FROM blocklist b WHERE b.excluded_id = u.id);

Korrelerede underforespørgsler i SELECT

Mønsteret "opslag pr. række":

SELECT u.id, u.email,
  (SELECT MAX(created_at) FROM orders o WHERE o.user_id = u.id) AS last_order_at
FROM users u;

-- Often readable, but consider a LEFT JOIN + GROUP BY.

Korrelerede underforespørgsler i UPDATE

Hent en afledt værdi pr. række:

UPDATE products p
SET review_count = (
  SELECT COUNT(*) FROM reviews r WHERE r.product_id = p.id
);

LATERAL JOIN: Et renere korrelationsmønster

Ved "opslag af nogle rækker pr. ydre række" er LATERAL ofte tydeligere og hurtigere — det gennemgås i Avancerede JOIN-mønstre.

Cachelagring af underforespørgsler

PostgreSQL cachelagrer ikke resultater af underforespørgsler på tværs af rækker som standard. Hvis det samme indre resultat er nødvendigt mange gange, skal du bruge en CTE.

Indeksér korrelationskolonnen

Den indre underforespørgsel filtrerer efter nøglen fra den ydre række. Uden et indeks på den nøgle får du en fuld gennemgang for hver ydre række.

-- For the orders example, this is essential:
CREATE INDEX orders_user_id_idx ON orders(user_id);

Opsummering

Korrelerede underforespørgsler refererer til den ydre række.

  • EXISTS er den klassiske korrelerede form
  • Foretræk NOT EXISTS frem for NOT IN
  • Indeksér korrelationskolonnen
  • LATERAL er et renere alternativ i mange tilfælde

Hurtigt tjek

Hvorfor er NOT EXISTS sikrere end NOT IN, når det indre sæt kan indeholde NULL?

Gratis at komme i gang

Lær SQL med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
46
Lektioner
183

Ofte stillede spørgsmål

Er lektionen “Korrelerede kontra ikke-korrelerede underforespørgsler” gratis?

Ja — hele teksten til “Korrelerede kontra ikke-korrelerede underforespørgsler” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Korrelerede kontra ikke-korrelerede underforespørgsler”?

Forstå korrelerede underforespørgsler, der refererer til den ydre række, deres ydelsesegenskaber, og hvornår EXISTS er bedre end IN. Du øver dig i SQL Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på SQL Academy?

Der kræves ingen tidligere erfaring. SQL Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Korrelerede kontra ikke-korrelerede underforespørgsler”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne SQL Academy-lektion?

Ja. Alle SQL Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Skalar-, række- og tabelunderforespørgsler
  2. Korrelerede kontra ikke-korrelerede underforespørgsler
  3. Common Table Expressions (WITH)
  4. Rekursive CTE'er til hierarkier
← Tilbage til SQL Academy