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

Suggerimenti sulle JOIN SQL per i principianti

Se siete principianti e volete sapere come iniziare a usare SQL JOINs nelle vostre query, siete nel posto giusto.

L'uso della clausola SQL JOIN è necessario se si desidera interrogare più tabelle. Prima o poi si dovrà utilizzare più di una tabella in una query. È la natura dei database relazionali in generale: sono costituiti da dati che di solito vengono salvati in più tabelle, che a loro volta formano un database. Una volta acquisita familiarità con le query SQL di base, è bene iniziare a imparare la clausola JOIN. Oltre ai suggerimenti di questo articolo, il nostro corso SQL JOINs può aiutarvi in questo senso.

In questo articolo vi illustrerò quattro suggerimenti per l'utilizzo della clausola JOIN. Prima, però, vi mostrerò le tabelle con cui lavoreremo.

Conoscere le tabelle

Per aiutarvi con JOINs, utilizzerò tre tabelle:

  • manufacturer
  • product_type
  • product

La tabella manufacturer contiene i seguenti attributi:

La tabella produttore contiene i seguenti attributi:

  • id - Il numero identificativo del produttore nel database.
  • nome_produttore - Il nome del produttore.

La seconda tabella è product_type, che contiene i seguenti attributi:

  • id - L'ID del tipo di prodotto.
  • nome_tipo - Il nome del tipo di prodotto.

L'ultima tabella è quella dei prodotti, che ha quattro attributi:

  • id - L'ID del prodotto.
  • nome_prodotto - Il nome del prodotto.
  • type - Il tipo di prodotto; fa riferimento alla tabella
  • manufactured_by - Il nome del produttore del prodotto; fa riferimento alla tabella

È il momento del primo suggerimento!

Suggerimento n. 1: utilizzare una sintassi JOIN esplicita

Probabilmente vi starete chiedendo che cosa significhi! Non preoccupatevi, sarà chiaro tra qualche istante.

Come sapete, la clausola JOIN viene utilizzata per combinare o unire i dati di due o più tabelle. Tuttavia, questo non è l'unico modo per unire le tabelle. Esiste anche una vecchia sintassi, risalente a prima di SQL-92, in cui le tabelle vengono unite elencandole nella clausola FROM. Questa sintassi è utilizzata da molti principianti, e va bene e svolge esattamente lo stesso lavoro di una sintassi di JOIN esplicita. Ma l'apprendimento della sintassi di JOIN esplicita è vantaggioso nel lungo periodo. Presenta diversi vantaggi rispetto all'elencazione delle tabelle nella clausola FROM, di cui parlerò più avanti in questo articolo.

Vi mostrerò come funzionano le unioni di tabelle non esplicite. Supponiamo di voler ottenere un elenco di prodotti insieme ai nomi dei loro produttori. Ecco come farlo elencando due tabelle nella clausola FROM:

SELECT	product.id,
		product.product_name,
		manufacturer.manufacturer_name
FROM product, manufacturer
WHERE product.manufactured_by = manufacturer.id;

Per prima cosa ho elencato le colonne che voglio nel risultato. Sono id e product_name dalla tabella product e manufacturer_name dalla tabella manufacturer. Poi ho elencato sia la colonna product e la tabella manufacturer nella clausola FROM. Infine, ho dichiarato che la colonna manufactured_by della tabella product deve essere uguale alla colonna id della tabella manufacturer.

Il risultato?

idproduct_namemanufacturer_name
1SuperFXQuazySoftware
2UnterBDieBeste
3HyperXYZFabricaInfinita
4TurboRayQuazySoftware
5VeryTradeDieBeste
6BlueSkyFabricaInfinita
7DirtyGrittyQuazySoftware
8SmoothUndertakerDieBeste
9HelioTrollFabricaInfinita

Si può ottenere lo stesso risultato utilizzando l'istruzione JOIN:

SELECT	product.id,
		product.product_name,
		manufacturer.manufacturer_name
FROM product JOIN manufacturer 
ON product.manufactured_by = manufacturer.id;

La parte SELECT è la stessa in entrambe le query. Ma invece di elencare semplicemente le due tabelle nella clausola FROM, le ho unite scrivendo esplicitamente la clausola JOIN. Se si scrive questa clausola, è necessario specificare quali colonne saranno utilizzate per collegare le due tabelle. Lo si fa utilizzando la clausola ON e collegando la colonna manufactured_by della tabella product con la colonna id della tabella manufacturer. Se si osserva attentamente, si noterà che la clausola ON funziona come la clausola WHERE della query precedente.

Perché consiglio di usare una dichiarazione esplicita JOIN? Innanzitutto, in questo modo è possibile vedere facilmente quale tipo di join viene utilizzato per combinare le tabelle. Esistono quattro tipi di join (inner join, left join, right join e full join), di cui parleremo più avanti. Quando il tipo di join è esplicitamente indicato nella query, è più facile capire cosa fa la query.

L'altra ragione per usare la sintassi esplicita di JOIN è quella di vedere la differenza tra le condizioni di join e le condizioni di filtraggio. Poiché la clausola WHERE è usata per filtrare i dati, può essere fonte di confusione usarla per unire le tabelle.

I vantaggi dell'uso delle JOIN esplicite sono molti di più e non ho lo spazio per descriverli; per maggiori dettagli, consultate questo articolo, che parla dei vantaggi di SQL JOINs.

Se avete bisogno di riepilogare le vostre conoscenze di base di SQL prima di proseguire, il nostro corso SQL Basics potrebbe essere l'ideale per questo. Si può anche utilizzare la sezione JOIN per iniziare a imparare a unire le tabelle.

Suggerimento n. 2: utilizzare gli alias delle tabelle

Per farvi capire cosa intendo con gli alias e perché sono utili, vi mostro come appare una query senza di essi. Se volessi elencare tutti i prodotti e i loro nomi di tipo di prodotto, ecco un modo per farlo:

SELECT	product.id,
		product.product_name,
		product_type.type_name
FROM product 
JOIN product_type 
ON product.type = product_type.id;

Innanzitutto, la spiegazione della query. Come nell'esempio precedente, questa query seleziona le colonne id e product_name dalla tabella product. Seleziona anche la colonna type_name dalla tabella product_type. Le tabelle product e product_type sono unite dal tipo di colonna della tabella product e la colonna id dalla tabella product_type.

Ecco il risultato:

idproduct_nametype_name
1SuperFXServer
2UnterBServer
3HyperXYZServer
4TurboRayLaptop
5VeryTradeLaptop
6BlueSkyLaptop
7DirtyGrittySoftware
8SmoothUndertakerSoftware
9HelioTrollSoftware

Anche se questa query non è complicata, la sua stesura è pesante. Ogni volta che voglio fare riferimento alla tabella, devo scrivere il suo nome completo. Come se non bastasse, c'è anche una tabella il cui nome è composto da due parole e un trattino basso. Immaginate se ci fossero più tabelle e con nomi più lunghi! Tuttavia, c'è un modo per semplificare la vita. Invece di scrivere i nomi completi delle tabelle, si può assegnare a ciascuna di esse un alias:

SELECT	p.id,
		p.product_name,
		pt.type_name
FROM product p 
JOIN product_type pt 
ON p.type = pt.id;

Questa è esattamente la stessa query di cui sopra, ma utilizza gli alias delle tabelle invece dei nomi completi. Date un'occhiata! Ho assegnato gli alias nelle clausole FROM e JOIN. Si noterà la differenza: la tabella product si chiama ora pe la tabella product_type si chiama ora pt. Naturalmente, poiché i nomi delle tabelle sono cambiati, questi nuovi nomi devono essere utilizzati per selezionare le colonne id, product_name e type_name.

Credo che ora la query abbia un aspetto molto migliore. E sicuramente è stato più comodo scriverla! Un altro consiglio: usate alias significativi! Di solito si usa la prima o le prime due lettere del nome della tabella o la prima lettera di ogni parola del nome della tabella. Il punto è che il vostro alias deve essere il più breve possibile, ma deve anche sembrare una scelta "naturale" per un alias; dovreste essere in grado di sapere immediatamente quale alias si riferisce a quale tabella.

Suggerimento n. 3: conoscere la differenza tra i diversi tipi di JOIN

Ho già detto in precedenza che esistono quattro tipi di base di JOIN:

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL OUTER JOIN

La clausola INNER JOIN restituisce solo i record corrispondenti che sono uguali in entrambe le tabelle. Si noti che INNER JOIN è la stessa cosa di JOIN.

La clausola LEFT JOIN restituisce tutti i record della tabella di sinistra (la prima tabella, posta dopo FROM) e solo i record corrispondenti della tabella di destra (la seconda tabella, posta dopo JOIN).

D'altra parte, RIGHT JOIN restituisce tutti i record della tabella di destra e solo i record corrispondenti della tabella di sinistra.

Infine, FULL OUTER JOIN restituisce tutti i record di entrambe le tabelle. Tutti i record non corrispondenti vengono riempiti con i valori di NULL. Questa unione restituisce potenzialmente un'enorme quantità di dati. Si noti che FULL OUTER JOIN è la stessa cosa di FULL JOIN.

Una spiegazione più dettagliata, ma adatta ai principianti, si trova in questo articolo sui tipi di JOIN in SQL.

So che può essere difficile ricordare tutto, soprattutto se si è alle prime armi o se non si usano spesso le join. Ma non c'è bisogno di ricordare tutto, perché c'è il foglio informativo sulle JOIN in SQL. Potete salvarlo o stamparlo e utilizzarlo ogni volta che utilizzate la clausola JOIN o volete imparare qualcosa di nuovo a colpo d'occhio.

In pratica, si useranno più spesso INNER JOIN e LEFT JOIN, quindi concentriamoci su queste due. Avete visto come usare INNER JOIN negli esempi precedenti. Ora vi mostrerò come funziona LEFT JOIN.

In questo esempio, elencheremo tutti i tipi di prodotto e i prodotti appartenenti a ciascuna categoria. Si potrebbe fare in questo modo:

SELECT	pt.id,
		pt.type_name,
		p.product_name
FROM product_type pt 
LEFT JOIN product p 
ON pt.id = p.type;

Questa query seleziona innanzitutto le colonne desiderate; niente di nuovo. Poi unisce le due tabelle e assegna loro degli alias. Ho unito le tabelle usando una novità: l'istruzione LEFT JOIN. Giusto per ricordare, questa unione seleziona tutte le righe della tabella di sinistra (product_type) e le righe corrispondenti della tabella di destra (product). Questo è esattamente ciò di cui avevo bisogno; date un'occhiata:

idtype_nameproduct_name
1SoftwareDirtyGritty
1SoftwareSmoothUndertaker
1SoftwareHelioTroll
2LaptopTurboRay
2LaptopVeryTrade
2LaptopBlueSky
3ServerSuperFX
3ServerUnterB
3ServerHyperXYZ
4ScooterNULL
5PrinterNULL

Si noti che non ci sono prodotti per le categorie "Scooter" e "Stampante". Se non ci sono righe corrispondenti nella tabella giusta, il risultato sarà NULL.

Suggerimento n. 4: tracciare più join

Non ci si può limitare a unire solo due tabelle, ma si possono unire tre o più tabelle. Prima vi mostrerò come farlo e poi vi darò alcuni consigli utili.

Il vostro compito è quello di elencare tutti i prodotti insieme al loro tipo e al nome del produttore. Questo codice lo farà:

SELECT	p.id,
		p.product_name,
		pt.type_name,
		m.manufacturer_name
FROM product p 
JOIN product_type pt
	ON p.type = pt.id 
JOIN manufacturer m 
	ON p.manufactured_by = m.id;

Come negli esempi precedenti, questo codice seleziona prima le colonne che verranno mostrate nel risultato. La tabella product viene unita alla tabella product_type; l'avete già sperimentato. Ok, ma ora avete bisogno di dati dalla tabella manufacturerCome si fa a unirli? È sufficiente scrivere un'altra clausola JOIN e specificare la tabella desiderata.

Tuttavia, anche se il join viene dopo la tabella product_typenon significa che la tabella manufacturer è unita a questa tabella, almeno in questo caso. No, è unita alla tabella product. Questo è evidente dalle colonne che ho specificato; le tabelle sono collegate tramite le colonne manufactured_by della tabella product e id della tabella manufacturer.

Ecco il risultato:

idproduct_nametype_namemanufacturer_name
1SuperFXServerQuazySoftware
2UnterBServerDieBeste
3HyperXYZServerFabricaInfinita
4TurboRayLaptopQuazySoftware
5VeryTradeLaptopDieBeste
6BlueSkyLaptopFabricaInfinita
7DirtyGrittySoftwareQuazySoftware
8SmoothUndertakerSoftwareDieBeste
9HelioTrollSoftwareFabricaInfinita

Quando si uniscono più tabelle, è bene tracciare una mappa delle tabelle che si vogliono unire. Fate un piccolo disegno; in questo modo è più facile visualizzare le unioni. Questo è particolarmente utile se si esegue un join a destra o a sinistra. Non dovrete immaginarlo: la tabella disegnata sul lato sinistro è la vostra tabella di sinistra e LEFT JOIN vi fornirà tutti i dati da essa. La tabella disegnata a destra è la tabella di destra. Sembra ovvio, ma è più difficile immaginarlo senza disegnare, soprattutto se si è alle prime armi. Il disegno potrebbe essere qualcosa di semplice come questo:

Disegno

Un altro consiglio è quello di elencare le colonne nell'istruzione SELECT nello stesso ordine in cui si uniscono le tabelle. Se si osserva la query precedente, le colonne provengono dalle tabelle product, product_type, e manufacturer, rispettivamente. Le tabelle sono unite esattamente nello stesso ordine. Questo renderà il codice più leggibile e più facile da modificare.

Infine, ma non meno importante, unite sempre le tabelle in una sorta di catena. In altre parole, ogni tabella che si unisce deve essere unita alle tabelle già unite nella query. Se si uniscono due tabelle e poi si decide di unirne un'altra, la terza tabella non può essere lasciata "in sospeso", non collegata alle tabelle precedenti. Assicurarsi che le condizioni di ON colleghino la nuova tabella alle tabelle precedentemente unite. Ecco come NON farlo:

Disegno

Avete imparato molto. Naturalmente, questo non è tutto quello che c'è da sapere sull'unione di tre tabelle. Ci sono dettagli che non ho menzionato e che sono ben spiegati in questo articolo sulle giunzioni di più tabelle. Ora che conoscete la funzione LEFT JOIN e l'unione di più tabelle, perché non imparare a unire più tabelle?

È stato possibile imparare tutto questo?

Con questi suggerimenti sull'uso delle unioni in SQL, ho cercato di rendere i vostri primi passi il più semplice possibile. Avete imparato come unire due tabelle utilizzando sia la sintassi esplicita di JOIN sia l'elenco delle tabelle nella clausola FROM. Inoltre, avete imparato a usare gli alias e a capire cosa fanno le diverse unioni. Infine, vi ho mostrato come unire tre tabelle. Credo che questo sia un passo importante fatto in poco tempo. Congratulazioni!

Come mettere in pratica tutti questi suggerimenti? Questo articolo su SQL JOINs vi aiuterà a trovare l'approccio più adatto a voi. Oppure potete esercitarvi utilizzando il nostro corso SQL Basics o il corso SQL JOINs . Dipende da quanto volete approfondire le vostre conoscenze.

Volete condividere la vostra esperienza di unione di tabelle? La sezione commenti vi aspetta!