LEFT/RIGHT JOIN e join OUTER
Usi LEFT JOIN per mantenere le righe senza corrispondenza, comprenda le join RIGHT e FULL OUTER e rilevi i dati mancanti con WHERE x IS NULL
LEFT/RIGHT JOIN e join OUTER è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 3 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.
LEFT JOIN: conserva tutte le righe a sinistra
LEFT JOIN restituisce ogni riga della tabella a sinistra, con le colonne corrispondenti del lato destro oppure con NULL quando non esiste una corrispondenza.
SELECT u.id, u.email, o.id AS order_id
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;
-- Users without orders still appear, with order_id = NULL.RIGHT JOIN
È l'opposto di LEFT JOIN: conserva tutte le righe a DESTRA. Per maggiore leggibilità, la maggior parte delle persone riscrive semplicemente i RIGHT join come LEFT:
SELECT u.id, u.email, o.id
FROM orders o
RIGHT JOIN users u ON u.id = o.user_id;
-- Equivalent to LEFT JOIN with sides swapped:
SELECT u.id, u.email, o.id
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;FULL OUTER JOIN
Conserva le righe di entrambi i lati. Le colonne senza corrispondenza contengono NULL:
SELECT u.email, o.id AS order_id
FROM users u
FULL OUTER JOIN orders o ON o.user_id = u.id;Trovare le corrispondenze mancanti
Un LEFT JOIN con WHERE right.id IS NULL trova le righe nella tabella a sinistra che non hanno corrispondenze a destra: il classico "anti-join":
SELECT u.id, u.email
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL; -- users who have never placed an orderLEFT JOIN con aggregato
Utile per i report che devono mostrare "0 se manca":
SELECT u.id, u.email, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.email
ORDER BY order_count DESC;La posizione del filtro è importante
I filtri sulla tabella destra in WHERE trasformano un LEFT JOIN in un INNER JOIN. Li inserisca in ON per preservare il comportamento di LEFT:
-- Drops users without paid orders entirely:
SELECT u.id, COUNT(o.id)
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.status = 'paid'
GROUP BY u.id;
-- Keeps users with no paid orders:
SELECT u.id, COUNT(o.id)
FROM users u
LEFT JOIN orders o
ON o.user_id = u.id AND o.status = 'paid'
GROUP BY u.id;Più LEFT JOIN
Li concateni. Ogni LEFT preserva le righe a sinistra di quell'operatore:
SELECT u.email, o.id, p.name
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
LEFT JOIN products p ON p.id = o.product_id;Prestazioni di LEFT JOIN
LEFT JOIN comporta un piccolo costo aggiuntivo rispetto a INNER, perché il pianificatore deve conservare le righe senza corrispondenza. Spesso è trascurabile, ma se non ha bisogno delle righe senza corrispondenza, INNER JOIN è leggermente più economico.
Join esterno e output NULL
L'output NULL di un LEFT JOIN può sorprendere il codice che lo elabora. Utilizzi COALESCE per fornire valori predefiniti:
SELECT u.email, COALESCE(SUM(o.total), 0) AS revenue
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.email;CROSS JOIN — quando servono tutte le coppie
Esegue il join di ogni riga di A con ogni riga di B. Lo utilizzi con parsimonia:
SELECT d.date, u.id
FROM users u
CROSS JOIN generate_series('2024-01-01', '2024-01-07', INTERVAL '1 day') AS d(date);Pattern di anti-join
Tre approcci idiomatici per trovare le righe "a sinistra senza corrispondenza":
-- LEFT JOIN ... WHERE IS NULL
SELECT u.* FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL;
-- NOT EXISTS (often the planner's favourite)
SELECT u.* FROM users u
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);Riepilogo
I join OUTER conservano le righe senza corrispondenza.
- LEFT = tutte le righe a sinistra, NULL a destra quando non c'è corrispondenza
- RIGHT = l'opposto; utilizzi LEFT per maggiore leggibilità
- FULL OUTER = entrambi i lati
- Anti-join = LEFT JOIN ... WHERE right IS NULL
Verifica rapida
Quale tipo di JOIN restituisce gli utenti anche se NON hanno ordini?
Domande Frequenti
La lezione «LEFT/RIGHT JOIN e join OUTER» è gratuita?
Sì — il testo completo di «LEFT/RIGHT JOIN e join OUTER» è 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 «LEFT/RIGHT JOIN e join OUTER»?
Usi LEFT JOIN per mantenere le righe senza corrispondenza, comprenda le join RIGHT e FULL OUTER e rilevi i dati mancanti con WHERE x IS NULL 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 3 di 4.
Quanto tempo richiede la lezione «LEFT/RIGHT JOIN e join OUTER»?
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
- Perché usare le join (ripasso del modello relazionale)
- Meccanismi di INNER JOIN
- LEFT/RIGHT JOIN e join OUTER
- Self-join e alias