Appuntiphp.com

28 gennaio 2010

MySQL JOIN: Relazioni tra le tabelle di un database

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.

Nessun commento »

Non c'è ancora nessun commento.

RSS feed dei commenti a questo articolo. TrackBack URL

Lascia un commento

Appuntiphp.com è il blog italiano su PHP - Funziona con WordPress