# Il comando SQL INSERT INTO SELECT: copiare i dati da una tabella all’altra

L’istruzione SQL INSERT INTO SELECT si usa per trasferire i dati da una tabella all’altra, a patto che sia già stata creata una nuova tabella. Le colonne vuote ottengono il valore NULL anche nella nuova tabella.

## Cos’è SQL INSERT INTO SELECT?

Lo [Structured Query Language](https://www.ionos.it/digitalguide/server/know-how/che-cose-sql/) consente di creare numerose tabelle all’interno di un database e di compilarle con dati. In alcuni casi potresti voler trasferire **da una tabella all’altra** tutti i dati, in altri invece desideri spostare solo una porzione di informazioni. Piuttosto che inserire tutte le voci manualmente, puoi semplicemente copiare i dati e inserirli nella posizione desiderata. Il comando più adatto a questo scopo è SQL INSERT INTO SELECT: consente di copiare i dati in base alle proprie esigenze e di inserirli nella nuova tabella. Nel fare questo le voci esistenti non vengono sovrascritte, sempre ammesso che i tipi di dati della tabella originale e di quella nuova corrispondano.

## Sintassi e funzionamento

La sintassi di SQL INSERT INTO SELECT cambia a seconda che vogliamo copiare **tutte le colonne** da una tabella all’altra oppure che vengano copiate **solo alcune colonne**. Per spostare tutti i dati da una tabella all’altra usiamo questo codice:

```sql
INSERT INTO nuova_tabella
SELECT * FROM vecchia_tabella
WHERE condizione;
```

In questo caso la condizione `WHERE` è opzionale.

Se invece desideri spostare solo alcune colonne, la sintassi è questa:

```sql
INSERT INTO nuova_tabella (colonna1, colonna2, colonna3, …)
SELECT colonna1, colonna2, colonna3, … FROM vecchia_tabella
WHERE condizione;
```

In questo caso specifichi le singole colonne e per selezionarle, usi il [comando SQL](https://www.ionos.it/digitalguide/server/configurazione/comandi-sql/) `SELECT`. In entrambi i casi è importante che la tabella `nuova_tabella` **esista già nel database**. Inoltre, i nomi di tutte le colonne della vecchia e nuova tabella devono coincidere. Le colonne che non contengono alcun valore presentano il valore NULL.

## Copiare e inserire una tabella intera

Per mostrarti come funziona SQL INSERT INTO SELECT nella pratica, creiamo la tabella “Lista\_clienti\_2023”. Questa contiene informazioni riguardanti il numero cliente, il cognome, la città e la quantità di articoli ordinati. La relativa sintassi si scrive così:

<table>
  <thead>
    <tr>
      <th>Numero cliente</th>
      <th>Cognome</th>
      <th>Città</th>
      <th>Articoli</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Rossi</td>
      <td>Roma</td>
      <td>13</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Bianchi</td>
      <td>Milano</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Ferrari</td>
      <td>Milano</td>
      <td>15</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Costa</td>
      <td>Firenze</td>
      <td>22</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Russo</td>
      <td>Roma</td>
      <td>10</td>
    </tr>
  </tbody>
</table>

In più abbiamo una nuova tabella intitolata “Lista\_clienti\_2024”, al momento ancora vuota.

Se vogliamo spostare tutte le voci della tabella “Lista\_clienti\_2023” nella nuova tabella “Lista\_clienti\_2024”, procediamo come segue:

```sql
INSERT INTO Lista_clienti_2024
SELECT * Lista_clienti_2023;
```

Ora, tutte le voci della vecchia lista clienti si trovano anche nella nuova lista:

<table>
  <thead>
    <tr>
      <th>Numero cliente</th>
      <th>Cognome</th>
      <th>Città</th>
      <th>Articoli</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Rossi</td>
      <td>Roma</td>
      <td>13</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Bianchi</td>
      <td>Milano</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Ferrari</td>
      <td>Milano</td>
      <td>15</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Costa</td>
      <td>Firenze</td>
      <td>22</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Russo</td>
      <td>Roma</td>
      <td>10</td>
    </tr>
  </tbody>
</table>

## Spostare solo alcune colonne

Tuttavia, può succedere che si desiderino copiare solo determinate colonne della tabella. Ad esempio, nel nostro caso il numero di articoli ordinati non è rilevante per la nuova tabella. Quindi selezioniamo solo le colonne che vogliamo copiare:

```sql
INSERT INTO Lista_clienti_2024 (Numero cliente, Cognome, Città)
SELECT Numero cliente, Cognome, Città FROM Lista_clienti_2023;
```

In tal modo otteniamo questa nuova tabella:

<table>
  <thead>
    <tr>
      <th>Numero cliente</th>
      <th>Cognome</th>
      <th>Città</th>
      <th>Articoli</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Rossi</td>
      <td>Roma</td>
      <td></td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Bianchi</td>
      <td>Milano</td>
      <td></td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Ferrari</td>
      <td>Milano</td>
      <td></td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Costa</td>
      <td>Firenze</td>
      <td></td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Russo</td>
      <td>Roma</td>
      <td></td>
    </tr>
  </tbody>
</table>

La colonna articoli contiene solo valori NULL.

## Definire condizioni per lo spostamento

Per copiare solo determinate righe è possibile usare la condizione `WHERE`. Nel caso della nostra tabella, ad esempio, vogliamo trasferire solo i clienti di Milano. Il relativo codice è:

```sql
INSERT INTO Lista_clienti_2024
SELECT * FROM Lista_clienti_2023
WHERE Città = 'Milano';
```

Questa la nuova tabella:

<table>
  <thead>
    <tr>
      <th>Numero cliente</th>
      <th>Cognome</th>
      <th>Città</th>
      <th>Articoli</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1377</td>
      <td>Bianchi</td>
      <td>Milano</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Ferrari</td>
      <td>Milano</td>
      <td>15</td>
    </tr>
  </tbody>
</table>

## Alternativa a SQL INSERT INTO SELECT

Un’alternativa a SQL INSERT INTO SELECT è `SELECT INTO`. Entrambe le istruzioni si usano per trasferire dati da una tabella a un’altra e sono parte di un comando più ampio. Tuttavia, mentre SQL INSERT INTO SELECT richiede una tabella esistente in cui trasferire i dati, `SELECT INTO` crea una nuova tabella.

Consiglio A te la scelta: grazie all’[hosting SQL server](https://www.ionos.it/cloud/sql-server-hosting "Hosting SQL server di IONOS") di IONOS puoi scegliere fra MSSQL, MySQL e MariaDB. Prestazioni eccellenti, funzionalità di sicurezza e consulenza personalizzata sono garantite in ogni caso.


This is a markdown version of: [https://www.ionos.it/digitalguide/server/configurazione/sql-insert-into-select/](https://www.ionos.it/digitalguide/server/configurazione/sql-insert-into-select/) for AI/LLM consumption.