ProgrammazioneSviluppatore Backend

Spiega la differenza tra INNER JOIN e OUTER JOIN (LEFT, RIGHT, FULL OUTER JOIN) in SQL e come scegliere il tipo di join appropriato in diversi scenari di lavoro con i dati. Fornisci un esempio di utilizzo corretto di ciascun tipo di JOIN.

Supera i colloqui con l'assistente IA Hintsage

Risposta

INNER JOIN restituisce solo le righe per le quali è stata trovata una corrispondenza in entrambe le tabelle unite secondo una condizione specificata. Quando si utilizza OUTER JOIN (LEFT, RIGHT, FULL), il risultato include tutte le righe da una o entrambe le tabelle, anche se non ci sono corrispondenze nell'altra tabella.

  • LEFT OUTER JOIN: tutte le righe dalla tabella sinistra + corrispondenze dalla destra, se presenti (altrimenti NULL).
  • RIGHT OUTER JOIN: tutte le righe dalla tabella destra + corrispondenze dalla sinistra, se presenti (altrimenti NULL).
  • FULL OUTER JOIN: tutte le righe da entrambe le tabelle, dove non ci sono corrispondenze - valori opposti NULL.

Quando usare quale JOIN:

  • Usa INNER JOIN se hai bisogno solo di righe corrispondenti.
  • LEFT JOIN – se è importante avere tutte le righe dalla prima (sinistra) tabella indipendentemente dalla presenza di corrispondenze.
  • RIGHT JOIN – analogamente, ma per la tabella destra.
  • FULL OUTER JOIN – lista combinata completa (utile per cercare discrepanze).

Esempi:

-- INNER JOIN SELECT u.id, u.name, o.amount FROM users u INNER JOIN orders o ON u.id = o.user_id; -- LEFT OUTER JOIN SELECT u.id, u.name, o.amount FROM users u LEFT JOIN orders o ON u.id = o.user_id; -- FULL OUTER JOIN SELECT u.id, o.order_id FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;

Domanda insidiosa

Quale risultato restituirà LEFT JOIN se la tabella destra è vuota?

Spesso si risponde: "LEFT JOIN restituirà un risultato vuoto poiché non ci sono corrispondenze". Corretto: LEFT JOIN restituirà comunque tutte le righe dalla tabella sinistra, mentre le colonne dalla destra saranno NULL.

Esempio:

-- La tabella users ha record, orders è vuota SELECT u.id, u.name, o.amount FROM users u LEFT JOIN orders o ON u.id=o.user_id; -- Risultato: tutti gli utenti, o.amount = NULL

Esempi di errori reali causati dalla mancanza di conoscenza dei dettagli della materia


Storia

Progetto di analisi delle vendite. Per visualizzare l'elenco completo dei clienti e dei loro ordini è stata utilizzata INNER JOIN, escludendo i clienti senza ordini. Nel report sono stati persi clienti "importanti" a causa della loro assenza nella tabella destra. Soluzione: utilizzare LEFT JOIN.


Storia

Piattaforma di gestione dei dipendenti e dei reparti. L'uso di RIGHT JOIN invece di LEFT JOIN ha portato a confusione nell'aggiunta di nuovi reparti: alcuni dipendenti hanno smesso di apparire nel report. Motivo: ordine di unione invertito.


Storia

Migrazione dello schema dati. Dopo le modifiche uno dei JOIN è diventato un CROSS JOIN a causa di un errore di battitura nella condizione di unione. Risultato: aumento improvviso del volume delle selezioni e "gonfiaggio" dei dati. Conclusione: specificare sempre ON durante le unioni e controllare attentamente il tipo di JOIN.