Skip to content

Join SQL spiegate

Tutti i tipi di JOIN SQL a confronto: inner, outer, cross, self, lateral, natural — cosa restituisce ciascuno, con un esempio di una riga.

Le join combinano le righe di due tabelle tramite una chiave condivisa. Il tipo di join decide quali righe sopravvivono quando le chiavi coincidono, mancano o si ripetono.

Tabella di riferimento · 8 voci
8 of 8 rows
Inner e outer
Solo le righe in cui la condizione ON trova corrispondenza in entrambe le tabelle. Le righe senza corrispondenza, da entrambi i lati, vengono scartate.SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id;
Tutte le righe della tabella di sinistra. Le colonne di destra sono NULL dove non esiste corrispondenza.SELECT u.name, o.total FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
Tutte le righe della tabella di destra. Le colonne di sinistra sono NULL dove non esiste corrispondenza.SELECT u.name, o.total FROM users u RIGHT OUTER JOIN orders o ON u.id = o.user_id;
Tutte le righe di entrambe le tabelle. I lati senza corrispondenza vengono riempiti con NULL.SELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Cross e self
Prodotto cartesiano. Ogni riga di sinistra si accoppia con ogni riga di destra. Nessuna clausola ON.SELECT u.name, o.total FROM users u CROSS JOIN orders o;
Una tabella unita a se stessa tramite alias. Confronta righe all'interno di una sola tabella.SELECT a.id AS o1, b.id AS o2 FROM orders a JOIN orders b ON a.user_id = b.user_id WHERE a.id < b.id;
Avanzate
Una subquery in FROM valutata per ogni riga esterna. La subquery può riferirsi alle colonne della tabella esterna.SELECT u.name, o.total FROM users u, LATERAL (SELECT total FROM orders WHERE user_id = u.id LIMIT 1) o;
Unisce le colonne che condividono lo stesso nome. Nessuna clausola ON. Attenzione alle collisioni di chiavi involontarie.SELECT u.name, o.total FROM users u NATURAL JOIN orders o;