operatore Join con linguaggio SQL

Join tra tabelle con il linguaggio SQL

In questo articolo vedremo come scrivere una JOIN con il linguaggio SQL per collegare i dati presenti in più tabelle di un database relazionale. Utilizzare correttamente l’operatore di JOIN è un’aspetto importantissimo che chiunque si avvicini al mondo delle query con l’SQL deve imparare a padroneggiare. Iniziamo riportandovi questa presentazione disponibile su SlideShare perfetta per chi ha da poco iniziato a studiare l’SQL. Come al solito consigliamo la visualizzazione a schermo intero.

 

Perché è importante esplicitare il costrutto JOIN

Aggiungiamo alcuni commenti alla presentazione partendo dal sottolineare i vantaggi di esplicitare la parola JOIN all’interno della query. Purtroppo infatti, anche a causa di ragioni e abitudini storiche, molti programmatori utilizzano una sintassi Sql che, se pur non errata, presenta svantaggi in termini di leggibilità e manutenibilità. Mi riferisco a query in cui la Join è “implicita” come nel seguente esempio:

SELECT Clienti.*, Conti.*

FROM Clienti, Conti

WHERE  Clienti.IdCliente = Conti.IdCliente

and Clienti. RegioneResidenza = ‘Piemonte’

Questa sintassi risulta equivalente a

SELECT Clienti.*, Conti.*

FROM Clienti

INNER JOIN Conti

ON Clienti.IdCliente = Conti.IdCliente

WHERE  Clienti. RegioneResidenza = ‘Piemonte’

Tuttavia la seconda si fa sicuramente preferire per una serie di ragioni:

  • Leggibilità: ricordiamo che l’SQL è un linguaggio english-Like, la query deve riflettere il modo di esprimersi nel nostro linguaggio naturale. Qui l’obiettivo è collegare le tabelle utilizzando la colonna in comune IdCliente. Per far questo la seconda sintassi è sicuramente più chiara, basta pensare alla traduzione in italiano della parola JOIN. In questo modo teniamo ben distinta la porzione di codice che esplica il collegamento tra le tabelle, da quella dove impostiamo un filtro sui dati (nell’esempio sulla regione di residenza). Nella prima query invece tale distinzione risulta più difficile. Pensato a cosa succede quando la query è più complessa e sono presenti svariate join e svariati “filtri”.

 

  • Manutenitibilità: supponiamo di dover trasformare l’inner join in una Left join. Nella seconda query ci basterà modificare una parola! Nel primo caso invece, su molti database dovremmo riscrivere completamente la query.

 

  • Facilità di scrittura: supponiamo di voler eliminare temporaneamente la join. Nel secondo caso ci basterà commentare le due righe consecutive relative alla tabella conti. Nel primo invece l’operazione risulta sicuramente più complessa e comprende il rischio di commentare per errore anche il filtro sulla regione di residenza.

 

Gestire la presenza di valori NULL nelle JOIN

La presenza di NULL complica spesso la scrittura di una query soprattutto quando la condizione di JOIN coinvolge più colonne. Supponiamo ad esempio che la tabella dei clienti e dei conti devono essere collegate secondo questa specifica: devono avere lo stesso codice_conto e, se presente, lo stesso codice_valuta. Chi lavora in ambito banking avrà sicuramente riconosciuto questa specifica collegata alla presenza di conti in più valute.

Occorre fare molta attenzione perché la seguente query, all’apparenza corretta, esclude tutti quei conti che hanno NULL nella colonna codice_valuta

SELECT *

FROM   DimConto c

INNER JOIN SnapshotConto s

ON c.codice_conto = s.codice_conto

AND c.codice_valuta = s.codice_valuta

Per risolvere questa fastidiosa situazione, vi lascio un link ad un fantastico articolo di Itzik Ben Gan legato alla gestione del NULL. Vi riporto la soluzione più “elegante”.

SELECT  c.*, s.* 

FROM   DimConto c

INNER JOIN SnapshotConto s

   ON exists (SELECT c.codice_conto, c.codice_valuta

                          INTERSECT

                      SELECT s.codice_conto, s.codice_valuta)

 

Join con l’SQL: e adesso?

Se vuoi seguire un percorso completo sui database relazionali visita la pagina sul mio corso introduttivo a SQL.

Torna su