In MySQL, le JOIN sono utilizzate per combinare dati provenienti da due o più tabelle all’interno di un database. Le JOIN sono essenziali quando si desidera ottenere dati correlati da tabelle diverse in un’unica query.
Ecco alcuni tipi comuni di JOIN in MySQL:
- INNER JOIN: Restituisce solo i record che hanno corrispondenze in entrambe le tabelle. Ad esempio:
SELECT *
FROM tabella1
INNER JOIN tabella2 ON tabella1.id = tabella2.id;
2. LEFT JOIN (o LEFT OUTER JOIN): Restituisce tutti i record dalla tabella a sinistra e i record corrispondenti dalla tabella a destra. Se non ci sono corrispondenze, vengono restituiti valori NULL dalla tabella a destra. Ad esempio:
SELECT *
FROM tabella1
LEFT JOIN tabella2 ON tabella1.id = tabella2.id;
3. RIGHT JOIN (o RIGHT OUTER JOIN): Restituisce tutti i record dalla tabella a destra e i record corrispondenti dalla tabella a sinistra. Se non ci sono corrispondenze, vengono restituiti valori NULL dalla tabella a sinistra. Anche se supportato, viene meno utilizzato rispetto al LEFT JOIN.
4. FULL JOIN (o FULL OUTER JOIN): Restituisce tutti i record quando c’è una corrispondenza in una delle tabelle. Le righe senza corrispondenza nelle tabelle associate vengono comunque mostrate con valori NULL. MySQL non supporta il FULL JOIN direttamente, ma è possibile ottenere risultati simili tramite UNION di LEFT JOIN e RIGHT JOIN.
5.CROSS JOIN (o Cartesian Join): Restituisce il prodotto cartesiano delle righe tra le tabelle coinvolte. Questo tipo di JOIN può produrre un gran numero di righe e non è spesso utilizzato in scenari pratici senza una clausola WHERE appropriata per filtrare i risultati.
Ecco un esempio di come usare INNER JOIN per unire due tabelle:
Supponiamo di avere due tabelle: prodotti
e vendite
. La tabella prodotti
contiene informazioni sui prodotti, mentre vendite
contiene informazioni sulle vendite associate ai prodotti.
SELECT prodotti.nome, vendite.quantita
FROM prodotti
INNER JOIN vendite ON prodotti.id_prodotto = vendite.id_prodotto;
Questa query selezionerà il nome del prodotto dalla tabella prodotti
e la quantità venduta dalla tabella vendite
per ogni prodotto che ha una corrispondenza tra le due tabelle in base all’ID del prodotto.
Le JOIN in MySQL sono strumenti potenti per combinare dati da diverse tabelle in un’unica query, consentendo di ottenere informazioni complesse da un database relazionale.
Esempio di inner join
Immaginiamo di avere due tabelle: una tabella autori
e una tabella libri
, con una relazione uno-a-molti tra autori e libri, dove un autore può avere scritto più libri.
Ecco come potrebbero essere strutturate le tabelle:
Tabella autori
:
| id_autore | nome_autore |
|-----------|---------------|
| 1 | Paolo Coelho |
| 2 | J.K. Rowling |
| 3 | Stephen King |
Tabella libri
:
| id_libro | titolo | id_autore |
|----------|----------------------|-----------|
| 101 | L'Alchimista | 1 |
| 102 | Il Codice Da Vinci | 2 |
| 103 | IT | 3 |
| 104 | Brida | 1 |
| 105 | Harry Potter | 2 |
Ora, per ottenere i dati combinati utilizzando una JOIN, potremmo fare una query per vedere quali libri sono stati scritti da quali autori:
SELECT autori.nome_autore, libri.titolo
FROM autori
INNER JOIN libri ON autori.id_autore = libri.id_autore;
Questa query restituirebbe un risultato simile a questo:
| nome_autore | titolo |
|---------------|----------------------|
| Paolo Coelho | L'Alchimista |
| Paolo Coelho | Brida |
| J.K. Rowling | Il Codice Da Vinci |
| J.K. Rowling | Harry Potter |
| Stephen King | IT |
Esempio di left join
Supponiamo di avere una tabella autori di questo tipo:
| id_autore | nome_autore |
|-----------|--------------------|
| 1 | Paolo Coelho |
| 2 | J.K. Rowling |
| 3 | Stephen King |
| 4 | Agatha Christie |
Poi supponiamo di avere una tabella libri di questo tipo:
| id_libro | titolo | id_autore |
|----------|----------------------|-----------|
| 101 | L'Alchimista | 1 |
| 102 | Il Codice Da Vinci | 2 |
| 103 | IT | 3 |
Eseguendo una LEFT JOIN tra queste tabelle:
SELECT autori.nome_autore, libri.titolo
FROM autori
LEFT JOIN libri ON autori.id_autore = libri.id_autore;
Il risultato di questa query mostrerà tutti gli autori dalla tabella autori
e, se disponibili, i libri associati trovati nella tabella libri
. Tuttavia, il “Agatha Christie” (con id_autore = 4
) non ha libri associati, quindi verrà visualizzata una riga con valori NULL nella colonna titolo
per questo autore:
| nome_autore | titolo |
|-------------------|----------------------|
| Paolo Coelho | L'Alchimista |
| J.K. Rowling | Il Codice Da Vinci |
| Stephen King | IT |
| Agatha Christie | NULL |
In questo risultato, il “Agatha Christie” appare con NULL nella colonna titolo
perché non ci sono libri associati a lui nella tabella libri
.
Esempio di rigth join
Supponiamo di avere una tabella autori di questo tipo:
| id_autore | nome_autore |
|-----------|--------------------|
| 1 | Paolo Coelho |
| 2 | J.K. Rowling |
| 3 | Stephen King |
| 4 | Agatha Christie |
Poi supponiamo di avere una tabella libri di questo tipo:
| id_libro | titolo | id_autore |
|----------|----------------------|-----------|
| 101 | L'Alchimista | 1 |
| 102 | Il Codice Da Vinci | 2 |
| 103 | IT | 5 |
Eseguendo una RIGHT JOIN tra queste tabelle:
SELECT autori.nome_autore, libri.titolo
FROM libri
RIGHT JOIN autori ON autori.id_autore = libri.id_autore;
Il risultato di questa query mostrerà tutti i libri dalla tabella libri
e i rispettivi autori dalla tabella autori
. In questo caso, avremo una riga con valori NULL nella colonna nome_autore
per il libro con un id_autore
(5) che non ha corrispondenze nella tabella autori
:
| nome_autore | titolo |
|-------------------|----------------------|
| Paolo Coelho | L'Alchimista |
| J.K. Rowling | Il Codice Da Vinci |
| NULL | IT |