In questa lezione della nostra Guida al linguaggio SQL vedremo come creare relazioni tra le tabelle utilizzando le cosiddette JOIN, termine anglosassone traducibile in italiano come "giunzione".
Prima di affrontare la tematica in oggetto, tuttavia, è opportuno fare una premessa introducendo i concetti di ridondanza e normalizzaione in quanto propedeutici all’utilizzo delle JOIN.
Normalizzazione e Ridondanza
Lo scopo di una database è quello di conservare i dati in maniera stabile, ma anche quello di organizzarli in forma normalizzata, evitando la ridondanza dei dati.
Normalizzare un database significa creare una struttura tale in cui i dati sono fisicamente separati tra loro (all’interno di diverse tabelle) ma possono essere "messi insieme" attraverso dellerelazioni.
I casi di studio sono molteplici e di diversa natura, in cui si può arrivare a diverse soluzioni, magari altrettanto valide. Prendiamo il caso delle nostre due tabelle, autori e libri; la tabella libri contiene un campo di riferimento all’autore del libro specificato, il cui nome si trova fisicamente all’interno della tabella autori.
In realtà avremmo potuto anche inserire ogni volta il nome dell’autore nella tabella "libri" all’interno del record in cui sono specificati i dati del libro. Per ottenere l’elenco degli autori, in questo caso, avremmo potuto utilizzare una query del genere facendo ricorso a SELECT DISTINCT:
SELECT DISTINCT autore FROM libri
Attraverso questa query possiamo ottenere un report descrittivo di tutti gli autori presenti.
Questa scelta, tuttavia, non sarebbe "ottimale" in quanto il nostro database sarebbe affetto da ridondanza, cioè una ripetizione dei medesimi dati all’interno di tabelle differenti.
Pro e contro di un database normalizzato
La scelta di due distribuire i dati tra più tabelle (per un’esigenza come quella della nostra libreria informatizzata) ha dei pro e dei contro. Il pro è che si ottiene un database normalizzato che evita la ridondanza dei dati; il contro è che l’implementazione di una relazione tra due o più tabelle determina un maggior dispendio di memoria in fase di esecuzione di una query che coinvolge dati distribuiti i diverse tabelle.
Nel corso di questa lezione della nostra guida al linguaggio SQL vedremo come implementare delle relazioni tra tabelle.
Creare relazioni tra differenti tabelle di un database
Esistono due sistemi differenti per implementare una relazione, ovvero utilizzando una semplice clausola WHERE, oppure utilizzando il comando JOIN; la differenza tra i due è nel rapporto potenza/dispendio di memoria: il comando JOIN è più performante in termini di potenza ma richiede un maggior impiego di memoria in fase di esecuzione della query.
Creare una relazione tra tabelle senza utilizzare JOIN
Facciamo un esempio con la modalità tradizionale in cui ricerchiamo tutti i libri scritti da Tolkien, visualizzando anche il nome dell’autore al posto dell’id di riferimento.
Premetto che per indicare un campo contenuto in una determinata tabella, in SQL si usa la forma nome_tabella.nome_campo, ad esempio libri.titolo e autori.autore.
Ecco il codice della nostra query:
SELECT
autori.autore,
libri.titolo,
libri.prezzo
FROM
autori,
libri
WHERE
autori.id = libri.id_autore
AND
autori.id = 1
All’interno della SELECT specifico i nomi dei campi che voglio visualizzare associandoli alla tabella di appartenenza; specifico le tabelle in cui sono contenuti i dati che mi interessano; nel WHERE indico per prima cosa i campi di relazione (detti comunque anche campi di JOIN), ovvero effettuo l’associazione tra il’id della tabella autori con l’id di riferimento all’autore nella tabella dei libri; con una clausola AND specifico che voglio estrarre i libri scritti dall’autore che ha id = 1, ovvero Tolkien nel nostro esempio.
Creare una relazione tra tabelle utilizzando una JOIN
Scriviamo ora la stessa query utilizzando l’istruzione INNER JOIN:
SELECT
autori.autore,
libri.titolo,
libri.prezzo
FROM
autori
INNER JOIN
libri
ON
autori.id = libri.id_autore
WHERE
autori.id = 1
Con questo codice: specifico i campi che desidero estrarre dalle due tabelle coinvolte nella JOIN; specifico la prima tabella dopo FROM e poi la seconda dopo INNER JOIN, associando i campi di relazione con la clausola ON a cui segue una egualianza; per finire utilizzo WHERE per stabilire il criterio di ricerca da applicare alla selezione di dati.
L’output prodotto da questa query comprenderà, come potete sperimentare da soli, dati contenuti nella tabella autori (il nome dell’autore) ed altri contenuti nella tabella libri (titolo e prezzo).
Come abbiamo potuto vedere dal esempi presentati in questa pagina, attraverso la creazione di relazioni tra tabelle è possibile eliminare la ridondanza dei dati ed effettuare la normalizzazione di un database.