Torna all'elenco degli articoli Articoli
Tempo di lettura: 7 minuti

Qual è la differenza tra avere più tabelle in FROM e usare JOIN?

Qual è il vostro approccio all'unione di tabelle in SQL? In questo articolo discutiamo due approcci e spieghiamo perché molti sviluppatori SQL preferiscono decisamente JOIN.

Preferite elencare più tabelle in FROM e usare WHERE per impostare le condizioni di unione? Oppure utilizzare la parola chiave JOIN? SQL li supporta entrambi, ma ci sono differenze significative tra loro. Analizziamo ciascuna di esse in dettaglio e poi discutiamo perché JOIN è generalmente preferibile.

Unire le tabelle elencandole in FROM

Supponiamo di gestire un negozio di giocattoli e di avere due tabelle di database che vogliamo unire: toys e sales.

Giocattoli

idnamebrandprice
1BumblebeeTransformers14.99
2Optimus PrimeTransformers19.99
3Lightning McQueenDisney Cars23.97
4RamoneDisney Cars20.99
5Wonder WomanBarbie39.99
6Princess LeiaBarbie99.99
7Wizard of Oz: GlindaBarbie43.95

Vendite

idtoy_idemployee_iddatequantity
1532020-07-011
2112020-07-011
3312020-07-021
4632020-07-031
5232020-07-031

Possiamo semplicemente elencare entrambe le tabelle nella clausola FROM e dichiarare nella clausola WHERE che l'indirizzo id dalla tabella toy deve corrispondere a toy_id della tabella sales della tabella:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t, sales s
WHERE t.id = s.toy_id;

Otterremo il seguente risultato:

idnamebrandpricequantitydate
1BumblebeeTransformers14.9912020-07-01
2Optimus PrimeTransformers19.9912020-07-03
3Lightning McQueenDisney Cars23.9712020-07-02
5Wonder WomanBarbie39.9912020-07-01
6Princess LeiaBarbie99.9912020-07-03

Tutto ha funzionato come previsto: abbiamo unito due tabelle e ottenuto i risultati che ci aspettavamo.

Questa è sicuramente una soluzione funzionante per unire le tabelle in SQL. Tuttavia, utilizza una vecchia sintassi che era comune prima che lo standard SQL-92 introducesse la parola chiave JOIN. Vediamo ora come ottenere lo stesso risultato utilizzando un approccio moderno all'unione delle tabelle.

Unire tabelle con la parola chiave JOIN

Per ottenere lo stesso risultato possiamo utilizzare la seguente query con la parola chiave JOIN:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
JOIN sales s
ON t.id = s.toy_id;

Questa sintassi è stata introdotta dallo standard SQL-92. Qui abbiamo una sola tabella nella clausola FROM; la tabella che vogliamo unire è elencata nella clausola JOIN. Poi, abbiamo la parola chiave ON per specificare le colonne da utilizzare per l'unione di queste tabelle.

Il risultato di questa query è lo stesso di quella precedente. Tuttavia, questo approccio presenta una serie di vantaggi che lo rendono più diffuso tra i professionisti di SQL. Se preferite usare la vecchia sintassi per unire le tabelle, date un'occhiata ai seguenti argomenti. Potrebbero farvi cambiare idea.

Perché usare la nuova sintassi per le unioni SQL?

Iniziamo chiarendo che dal punto di vista delle prestazioni non c'è alcuna differenza tra le due sintassi. L'uso della parola chiave JOIN non è solo uno standard formale, ma anche una pratica comune tra gli utenti di SQL. Quali sono i vantaggi dell'uso della clausola JOIN?

Le condizioni di join sono separate dalle condizioni di filtraggio

Quando si utilizza la vecchia sintassi, le condizioni di join e le condizioni di filtraggio sono fisicamente raggruppate nella clausola WHERE. Questo può causare una certa confusione.

Ad esempio, si vuole vedere solo le vendite del 3 luglio. Dovremo aggiungere un'altra condizione alla clausola WHERE:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t, sales s
WHERE t.id = s.toy_id AND s.date = '2020-07-03';

Ora abbiamo due condizioni in WHERE, ma solo una di esse è una vera condizione di filtraggio. L'altra serve solo a specificare le colonne su cui unire le tabelle.

Con la parola chiave JOIN, le condizioni di unione sono separate da quelle di filtraggio:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
JOIN sales s
ON t.id = s.toy_id
WHERE s.date = '2020-07-03';

In questo caso, specifichiamo la condizione di unione in ON e usiamo WHERE per filtrare i risultati.

Entrambe le query produrranno lo stesso risultato, ma la nuova sintassi rende chiaro dove si uniscono le tabelle e dove si filtrano i risultati.

È più facile unire più tabelle

Spesso è necessario unire più tabelle con SQL. Per esempio, supponiamo di voler unire la tabella employees alla tabella toys e sales in modo da sapere chi ha venduto ciascun giocattolo.

Dipendenti

idname
1Rob Stevens
2Jane White
3Sofia Clark

Con la vecchia sintassi, avremmo la seguente query:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date, e.name AS employee
FROM toys t, sales s, employees e
WHERE t.id = s.toy_id AND e.id = s.employee_id;

Per unire le stesse tre tabelle con la sintassi JOIN, useremmo questa query:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date, e.name AS employee
FROM toys t
JOIN sales s
ON t.id = s.toy_id
JOIN employees e
ON e.id = s.employee_id;

Il risultato è lo stesso:

idnamebrandpricequantitydateemployee
1BumblebeeTransformers14.9912020-07-01Rob Stevens
2Optimus PrimeTransformers19.9912020-07-03Sofia Clark
3Lightning McQueenDisney Cars23.9712020-07-02Rob Stevens
5Wonder WomanBarbie39.9912020-07-01Sofia Clark
6Princess LeiaBarbie99.9912020-07-03Sofia Clark

La "catena" di tabelle che vogliamo unire è più visibile nella nuova sintassi, dove prima uniamo due tabelle su colonne specifiche e poi uniamo la terza tabella usando un'altra condizione di unione. Con la vecchia sintassi, le tre tabelle sono elencate insieme in FROM e le due condizioni di unione sono specificate (in qualsiasi ordine) in WHERE. Quale condizione corrisponda a quale unione, soprattutto se si devono unire più di tre tabelle, diventa rapidamente confusa con questa sintassi.

Le JOIN SINISTRA / DESTRA / COMPLETA sono più semplici

La sintassi JOIN rende molto semplici tutti i tipi di join esterni. È possibile eseguire join (esterni) a sinistra, join (esterni) a destra o join (esterni) completi utilizzando semplicemente le rispettive parole chiave (LEFT JOIN, RIGHT JOIN o FULL JOIN).

Supponiamo di voler unire le tabelle toys e sales in modo da avere tutti i giocattoli visualizzati nel risultato, anche se non ci sono state vendite per un giocattolo nel periodo indicato. È possibile eseguire questa unione facilmente in qualsiasi database, semplicemente utilizzando la funzione LEFT JOIN:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
LEFT JOIN sales s
ON t.id = s.toy_id;

Il risultato includerà tutti i giocattoli e le informazioni di vendita corrispondenti, se del caso:

idnamebrandpricequantitydate
5Wonder WomanBarbie39.9912020-07-01
1BumblebeeTransformers14.9912020-07-01
3Lightning McQueenDisney Cars23.9712020-07-02
6Princess LeiaBarbie99.9912020-07-03
2Optimus PrimeTransformers19.9912020-07-03
4RamoneDisney Cars20.99NULLNULL
7Wizard of Oz: GlindaBarbie43.95NULLNULL

Se non conoscete le LEFT JOIN, leggete questa guida completa sulle unioni a sinistra di più tabelle.

E la vecchia sintassi? È complicato. Alcuni database possono consentire alcuni trucchi per unire le tabelle a sinistra senza utilizzare la parola chiave JOIN, ma non esiste una soluzione coerente che funzioni in tutti i casi.

Ad esempio, in Oracle è possibile utilizzare l'operatore (+) per effettuare un join a sinistra:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.day
FROM toys t, sales s
WHERE t.id = s.toy_id (+);

Tuttavia, questa sintassi non funziona in altri database.

Si evitano le CROSS JOIN accidentali

Un altro problema comune nell'unione di tabelle con FROM è la CROSS JOIN accidentale. Se si omette una condizione di join in WHERE, si otterranno tutte le righe della prima tabella combinate con tutte le righe della seconda tabella. Pertanto, il numero di righe nel set di risultati sarà la moltiplicazione del numero di righe di ciascuna tabella. Un errore di questo tipo può essere difficile da individuare e da debuggare.

Allo stesso tempo, quando si utilizza lo standard SQL-92 per unire le tabelle, si ottiene un errore di sintassi se si omette la condizione di unione. Naturalmente, è possibile effettuare unioni incrociate tra tabelle con la nuova sintassi, ma solo se si utilizza esplicitamente la parola chiave corrispondente (CROSS JOIN).

È ora di imparare la nuova sintassi per SQL JOINs!

La maggior parte dei professionisti di SQL concorda sul fatto che la nuova sintassi è più leggibile una volta che ci si abitua. Si spera che anche voi siate convinti che l'approccio moderno all'unione delle tabelle in SQL meriti la vostra attenzione.

LearnSQL offre un corso completo su SQL JOINs che comprende 93 esercizi interattivi. Avrete l'opportunità di esercitarvi con le unioni interne, tutti i tipi di unioni esterne, le unioni non-equi e le auto-unioni.

Oltre agli esercizi, potrebbe essere utile rinfrescare le proprie conoscenze su SQL JOINs con le nostre guide per principianti:

Buon apprendimento!