JOIN - Relazioni tra più tabelle
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 ma possono essere messi insieme con le relazioni.
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. Avremmo potuto inserire ogni volta il nome dell'autore nel record in cui sono specificati i dati del libro ed avremmo potuto definire una query del tipo
SELECT DISTINCT autore FROM libriper ottenere un report descrittivo di tutti gli autori presenti, elencandoli una singola volta.
La scelta di due 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 della ricerca. A seconda delle esigenze e delle tecnologie a disposizione potremmo effettuare scelte differenti per ottenere le soluzioni ottimali in funzione delle esigenze pratiche: da qui si determinerà la nostra bravura di progettisti di database.
Veniamo alla pratica.
Esistono due sistemi differenti per implementare una relazione, ovvero utilizzando una semplice clausola WHERE, oppure utilizzando il comando INNER 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 ricerca.
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.noe_campo, ad esempio libri.titolo.
Ecco il codice:
SELECT
autori.autore,
libri.titolo,
libri.prezzo
FROM
autori,
libri
WHERE
autori.id = libri.id_autore
AND
autori.id = 1
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 dell'autore con l'id di riferimento all'autore nel record del libro; con una clausola AND specifico che voglio estrarre i libri scritti dall'autore che ha id = 1, ovvero Tolkien.
Scriviamo 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; specifico la prima tabella e poi la seconda, associandole i campi di relazione con la clausola ON ed utilizzo il WHERE per stabilire il criterio (o filtro, che dir si voglia) di ricerca.
Divertitevi ad effettuare ricerche in base a dei criteri relazionando le due tabelle.







