La grande potenza dei database, nel caso corrente di MySQL, è quella di creare relazioni tra tabelle. Una relazione è un sistema di query tra due o più tabelle, contenenti informazioni differenti, basato su una relazione logica tra i dati.
Le relazioni possono essere fondamentalmente di due tipi: uno a uno, ovvero ad un record di una tabella può corrispondere un solo record dell’altra tabella; uno a molti, ovvero ad un record di una tabella possono corrispondere più record dell’altra tabella, e questo è il caso più diffuso.
Un esempio chiarirà le idee. Immaginiamo di gestire una libreria e di avere autori e libri, dove per ogni autore possono corrispondere più libri; ecco un caso concreto di relazione uno a molti.
Utilizzeremo questo esempio per effettuare dei test pratici, scrivendo codice SQL attraverso il proprio gestore MySQL preferito.
Esistono due sistemi in SQL per scrivere delle relazioni; il primo è attraverso la semplice sintassi SQL, specificando le tabelle su cui agire e, nella clausola WHERE, la condizione di relazione; il secondo è attraverso l’istruzione JOIN ed alle sue clausole accessorie.
Facciamo un esempio di entrambi i casi:
SELECT * FROM tab_1, tab_2 WHERE campo_tab_1 = campo_tab_2
SELECT * FROM tab_1 INNER JOIN ta_2 ON campo_tab_1 = campo_tab_2
Le due istruzioni praticamente si equivalgono, solo che la prima versione sforza meno il motore MySQL ed ottiene tempi di risposta più veloci. E’ inoltre più semplice scrivere relazioni su più di due tabelle:
SELECT * FROM tab_1, tab_2, tab_3 WHERE campo_tab_1 = campo_tab_2 AND campo_tab_2 = campo_tab_3
Con ulteriori clausole AND potremo andare a definire altri filtri di ricerca.
Una nota importante: i tipi di dato dei campi che di relazioni (altresì detti campi di JOIN) devono essere dello stesso tipo!
Mettiamo in pratica l’esempio della libreria. Si crei il database “libreria” corredato dalle seguenti tabelle, campi e tipi di dato:
autori
aut_id (int 20 - autoincrement - chiave primaria)
aut_nome (varchar 50)
libri
lib_id (int 20 - autoincrement - chiave primaria)
lib_autore (int 20)
lib_titolo (varchar 100)
Il campo “lib_autore” è il campo di join con la tabella degli autori, quindi se l’autore “Oscar Wilde” avrò il campo “aut_id” uguale a 1, il campo “lib_autore” avrò valore 1 dove “lib_titolo” sarà valorizzato con “Il ritratto di Dorian Gray”, “The importance of being Ernest” ed altri suoi libri, e cosi via per gli altri autori.
Creiamo dunque una query che, attraverso una relazione, estragga il nome dell’autore ed il titolo dei suoi libri:
SELECT
aut_nome, lib_titolo
FROM
autori, libri
WHERE
aut_id = lib_autore
AND
aut_nome = 'Oscar Wilde'
Scriviamo la stessa cosa utilizzando l’istruzione JOIN:
SELECT
aut_nome, lib_titolo
FROM
autori
INNER JOIN
libri
ON
aut_id = lib_autore
WHERE
aut_nome = 'Oscar Wilde'
Naturalmente le query sono state scritte a capo per ragioni di spazio, ma invito il lettore a scriverle su di una sola riga.
