# JOIN per MariaDB: unire record di più tabelle

In un sistema di gestione di database relazionali è possibile confrontare i record di diverse tabelle fra di loro, consentendo di creare collegamenti ed estrarre i valori corrispondenti da due tabelle. Questo compito in MariaDB è svolto da `JOIN`. L’istruzione, usata in combinazione con `SELECT`, può essere suddivisa in diverse categorie. Qui ti presentiamo più dettagliatamente `INNER JOIN`, `LEFT OUTER JOIN` e `RIGHT OUTER JOIN`.

## Sintassi e funzionamento

Per darti una visione d’insieme delle diverse istruzioni `JOIN` in MariaDB iniziamo dalla sintassi di base. Per `INNER JOIN` è la seguente:

```sql
SELECT colonna(e)
FROM tabella_1
INNER JOIN tabella_2
ON tabella_1ªcolonna = tabella_2ªcolonna;
```

Con `SELECT` seleziona la colonna (o le colonne) da considerare. Per il segnaposto “tabella\_1” inserisci la prima tabella e al posto di “tabella\_2” la seconda tabella da collegare con la prima. Con `INNER JOIN` **tutte le righe della prima tabella vengono confrontate con tutte le righe della seconda tabella**. I risultati corrispondenti (ovvero che sono presenti in entrambe le tabelle) vengono riportati insieme in una tabella dei risultati. Le voci che non corrispondono sono invece tralasciate.

## Esempio di `INNER JOIN` in MariaDB

Per spiegare come funziona `INNER JOIN` in MariaDB ricorriamo a un semplice esempio. Partiamo da un database che contiene due tabelle. La prima tabella è denominata “ListaClienti”, la seconda “Ordini”. Creiamo “ListaClienti” con [MariaDB CREATE TABLE](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/mariadb-create-table/). Contiene le colonne “NumeroCliente”, “Cognome”, “Nome”, “Città” e “DataCreazione”. Il codice si presenta come segue:

```sql
CREATE TABLE ListaClienti (
	NumeroCliente INT PRIMARY KEY,
	Cognome VARCHAR(50),
	Nome VARCHAR(50),
	Città VARCHAR(50),
	Data di creazione DATE
);
```

Riempiamo ora la tabella con alcuni valori utilizzando `INSERT INTO`:

```sql
INSERT INTO ListaClienti VALUES
(1, 'Russo', 'Martina', 'Roma', '2022-07-19'),
(2, 'Rossi', 'Mario', 'Milano', '2023-03-03'),
(3, 'Ferrari', 'Pietro', 'Milano', '2023-07-09'),
(4, 'Gallo', 'Sara', 'Napoli', '2023-12-10'),
(5, 'Martini', 'Lisa', 'Roma', '2024-01-17');
```

Creiamo poi la tabella “Ordini”. Qui sono contenute le colonne “NumeroOrdine”, “NumeroArticolo”, “NomeCliente” e “DataOrdine”. Il codice si presenta come segue:

```sql
CREATE TABLE Ordini (
	NumeroOrdine INT AUTO_INCREMENT PRIMARY KEY,
	NumeroArticolo INT,
	NomeCliente VARCHAR(50),
	DataOrdine DATE
);
```

Riempiamo anche questa tabella con valori di esempio:

```sql
INSERT INTO ordini VALUES
(101, 247, 'Mancini', '2024-02-20'),
(102, 332, 'Ferrari', '2024-03-03'),
(103, 247, 'Costa', '2024-03-09'),
(104, 191, 'Rossi', '2024-03-17'),
(105, 499, 'Albertini', '2024-03-17');
```

Ora usiamo `INNER JOIN` per MariaDB per filtrare tutti quei clienti che **compaiono nella lista clienti e hanno fatto un ordine** che sono elencati nella tabella “Ordini”. Il codice si presenta come segue:

```sql
SELECT ListaClienti.NumeroCliente, ListaClienti.Cognome, Ordini.NumeroOrdine, Ordini.NumeroArticolo
FROM ListaClienti
INNER JOIN Ordini
ON ListaClienti.Cognome = Ordini.NomeCliente;
```

Qui poniamo l’accento sui cognomi della lista clienti e sui nomi dei clienti negli ordini. Se questi valori corrispondono, vengono acquisiti. Siccome i clienti Ferrari e Rossi compaiono in entrambe le tabelle, il risultato sarà il seguente:

<table>
  <thead>
    <tr>
      <th>NumeroCliente</th>
      <th>NomeCliente</th>
      <th>NumeroOrdine</th>
      <th>NumeroArticolo</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>3</td>
      <td>Ferrari</td>
      <td>102</td>
      <td>332</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Rossi</td>
      <td>104</td>
      <td>191</td>
    </tr>
  </tbody>
</table>

## `LEFT OUTER JOIN`

`LEFT OUTER JOIN` in MariaDB funziona secondo un principio analogo e usa anche una sintassi pressoché identica. A differenza di `INNER JOIN`, però, **vengono acquisiti tutti i record dalla prima tabella a sinistra** (nel nostro esempio “ListaClienti”), ma solo i record adatti dalla seconda tabella a destra (“Ordini”). Se non c’è una corrispondenza nella seconda tabella, il valore viene **indicato con NULL**. Per il nostro esempio sopra, il comando si presenta come segue:

```sql
SELECT ListaClienti.Cognome, Ordini.NumeroArticolo
FROM ListaClienti
LEFT OUTER JOIN Ordini
ON ListaClienti.Cognome = Ordini.NomeCliente;
```

In questo modo otteniamo il risultato seguente:

<table>
  <thead>
    <tr>
      <th>NomeCliente</th>
      <th>NumeroArticolo</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Russo</td>
      <td>NULL</td>
    </tr>
    <tr>
      <td>Rossi</td>
      <td>191</td>
    </tr>
    <tr>
      <td>Ferrari</td>
      <td>332</td>
    </tr>
    <tr>
      <td>Gallo</td>
      <td>NULL</td>
    </tr>
    <tr>
      <td>Martini</td>
      <td>NULL</td>
    </tr>
  </tbody>
</table>

## `RIGHT OUTER JOIN`

Esattamente al contrario funziona `RIGHT OUTER JOIN` in MariaDB. Questa volta i **dati della seconda tabella a destra vengono collegati con i valori corrispondenti della prima tabella a sinistra**. In assenza di una corrispondenza, il valore resta NULL. Ne risulta il seguente codice:

```sql
SELECT ListaClienti.Cognome, Ordini.NumeroArticolo
FROM ListaClienti
RIGHT OUTER JOIN Ordini
ON ListaClienti.Cognome = Ordini.NomeCliente;
```

L’output si presenterà di conseguenza così:

<table>
  <thead>
    <tr>
      <th>NomeCliente</th>
      <th>NumeroArticolo</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>NULL</td>
      <td>247</td>
    </tr>
    <tr>
      <td>Ferrari</td>
      <td>332</td>
    </tr>
    <tr>
      <td>NULL</td>
      <td>247</td>
    </tr>
    <tr>
      <td>Rossi</td>
      <td>191</td>
    </tr>
    <tr>
      <td>NULL</td>
      <td>499</td>
    </tr>
  </tbody>
</table>

Consiglio Nella nostra Digital Guide trovi tante utili guide e spiegazioni su MariaDB. Ad esempio trovi un [confronto tra MariaDB e MySQL](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/mariadb-vs-mysql/) e tutto quello che devi sapere sull’[installazione di MariaDB](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/come-installare-mysql-o-mariadb/). Puoi anche scoprire [come collegare i programmi Python con MariaDB](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/python-mariadb/) e molto altro.


This is a markdown version of: [https://www.ionos.it/digitalguide/hosting/tecniche-hosting/mariadb-join/](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/mariadb-join/) for AI/LLM consumption.