Sottoquery correlate e non correlate
Comprenda le sottoquery correlate che fanno riferimento alla riga esterna, le loro caratteristiche prestazionali e quando EXISTS è preferibile a IN
Sottoquery correlate e non correlate è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.
Sottoquery non correlate
Una sottoquery non correlata non fa riferimento alla riga esterna. Viene eseguita una volta e il risultato viene riutilizzato:
SELECT * FROM users
WHERE id IN (
SELECT user_id FROM orders WHERE status = 'paid'
);Sottoquery correlate
Una sottoquery correlata fa riferimento alla riga esterna: logicamente viene rieseguita per ogni riga esterna:
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
);Come distinguere i due casi
Se la SELECT interna fa riferimento a una colonna del FROM esterno, è correlata.
Implicazioni sulle prestazioni
Una sottoquery correlata ingenua ha complessità O(outer × inner). I planner moderni spesso la riscrivono come semi-join o hash join, ma conviene comunque scrivere la forma più semplice quando possibile.
EXISTS vs IN
Per verificare «almeno una corrispondenza»:
-- 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 è sempre preferibile a NOT IN
NOT IN non funziona quando l'insieme interno contiene NULL. NOT EXISTS invece sì. Preferisca sempre NOT EXISTS per l'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);Sottoquery correlate in SELECT
Il pattern «ricerca per ogni riga»:
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.Sottoquery correlate in UPDATE
Recuperi un valore derivato per ogni riga:
UPDATE products p
SET review_count = (
SELECT COUNT(*) FROM reviews r WHERE r.product_id = p.id
);LATERAL JOIN: un pattern correlato più chiaro
Per «cercare alcune righe per ogni riga esterna», LATERAL è spesso più chiaro e veloce: l'argomento è trattato nella lezione sui pattern JOIN avanzati.
Memorizzazione nella cache delle sottoquery
Per impostazione predefinita, PostgreSQL non memorizza nella cache i risultati delle sottoquery tra una riga e l'altra. Se lo stesso risultato interno serve molte volte, usi una CTE.
Indicizzare la colonna di correlazione
La sottoquery interna filtra in base alla chiave della riga esterna. Senza un indice su quella chiave, viene eseguita una scansione completa per ogni riga esterna.
-- For the orders example, this is essential:
CREATE INDEX orders_user_id_idx ON orders(user_id);Riepilogo
Le sottoquery correlate fanno riferimento alla riga esterna.
- EXISTS è la forma correlata canonica
- Preferisca NOT EXISTS a NOT IN
- Indicizzi la colonna di correlazione
- LATERAL è un'alternativa più chiara in molti casi
Verifica rapida
Perché NOT EXISTS è più sicuro di NOT IN quando l'insieme interno può contenere NULL?
Impara SQL con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 46
- Lezioni
- 183
Domande Frequenti
La lezione «Sottoquery correlate e non correlate» è gratuita?
Sì — il testo completo di «Sottoquery correlate e non correlate» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.
Cosa imparerò in «Sottoquery correlate e non correlate»?
Comprenda le sottoquery correlate che fanno riferimento alla riga esterna, le loro caratteristiche prestazionali e quando EXISTS è preferibile a IN Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare SQL Academy?
Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Sottoquery correlate e non correlate»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione SQL Academy?
Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Sottoquery scalari, di riga e di tabella
- Sottoquery correlate e non correlate
- Espressioni di tabella comuni (WITH)
- CTE ricorsive per le gerarchie