# SQL INSERT INTO SELECT : copier/coller des données d’une table à une autre

L’instruction SQL `INSERT INTO SELECT` est utilisée pour copier des données d’une table vers une autre. Pour cela, la nouvelle table doit déjà être créée. Les colonnes sans contenu reçoivent la valeur NULL par défaut dans la nouvelle table.

## SQL `INSERT INTO SELECT` : qu’est-ce que c’est ?

Le [Structured Query Language](https://www.ionos.fr/digitalguide/serveur/configuration/introduction-a-sql-a-laide-dexemples/) (SQL) vous permet de créer de nombreuses tables dans une base de données et de les alimenter en données. Il peut arriver que vous souhaitiez transférer **une partie ou la totalité des données d’une table vers une autre**. Au lieu de saisir à nouveau toutes les données, vous avez la possibilité de les copier et de les coller à l’endroit souhaité. L’instruction appropriée pour ce projet est SQL `INSERT INTO SELECT`. Celle-ci copie les données selon vos souhaits et les insère dans le nouveau tableau. Ce faisant, les entrées déjà existantes ne sont pas écrasées. La condition préalable est que le type de données de la table d’origine et de la nouvelle table soient identiques.

## Syntaxe et fonctionnement

La syntaxe de SQL `INSERT INTO SELECT` diffère selon que vous souhaitez copier **toutes les colonnes** d’une table à une autre ou uniquement **certaines colonnes sélectionnées**. Pour un transfert complet, voici la structure du code :

```sql
INSERT INTO nouvelle_table
SELECT * FROM ancienne_table
WHERE condition;
```

La condition `WHERE` est facultative et permet de filtrer les lignes à insérer.

Si vous voulez seulement transférer certaines colonnes de votre choix et non la table entière, voici le code à entrer :

```sql
INSERT INTO nouvelle_table (colonne1, colonne2, colonne3, ...)
SELECT colonne1, colonne2, colonne3, ... FROM ancienne_table
WHERE condition;
```

Ici, vous spécifiez donc les différentes colonnes et utilisez également la [commande SQL](https://www.ionos.fr/digitalguide/serveur/configuration/commandes-sql/) `SELECT` pour les choisir. Dans les deux cas, il est important que la table `nouvelle_table` soit **déjà créée dans la base de données**. De plus, les noms de toutes les colonnes de l’ancienne et de la nouvelle table doivent être identiques. Les colonnes pour lesquelles aucune donnée n’est disponible contiendront la valeur NULL.

## Copier et coller la table entière

Pour vous montrer comment SQL `INSERT INTO SELECT` fonctionne dans la pratique, nous allons créer un exemple de table appelé « Liste de clients\_2023 ». Celle-ci contient des informations sur le numéro de client, le nom, la ville et le nombre d’articles commandés par chacun des clients. Elle se présente ainsi :

<table>
  <thead>
    <tr>
      <th>Numéro de client</th>
      <th>Nom</th>
      <th>Ville</th>
      <th>Articles</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Berron</td>
      <td>Paris</td>
      <td>13</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Froissy</td>
      <td>Strasbourg</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Sulis</td>
      <td>Strasbourg</td>
      <td>15</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Verdon</td>
      <td>Lille</td>
      <td>22</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Paré</td>
      <td>Paris</td>
      <td>10</td>
    </tr>
  </tbody>
</table>

Il existe nouveau tableau intitulé « Liste de clients\_2024 ». Ce dernier est jusqu’à présent vide.

Si nous voulons insérer complètement les entrées de la table « Liste de clients\_2023 » dans la nouvelle table « Liste de clients\_2024 », nous procédons comme suit :

```sql
INSERT INTO Liste de clients_2024
SELECT * FROM Liste de clients_2023;
```

Désormais, toutes les entrées de l’ancienne liste de clients se trouvent dans la nouvelle liste de clients :

<table>
  <thead>
    <tr>
      <th>Numéro de client</th>
      <th>Nom</th>
      <th>Ville</th>
      <th>Articles</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Berron</td>
      <td>Paris</td>
      <td>13</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Froissy</td>
      <td>Strasbourg</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Sulis</td>
      <td>Strasbourg</td>
      <td>15</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Verdon</td>
      <td>Lille</td>
      <td>22</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Paré</td>
      <td>Paris</td>
      <td>10</td>
    </tr>
  </tbody>
</table>

## Transférer des colonnes sélectionnées

Il peut également arriver que vous ne souhaitiez transférer que certaines colonnes. Par exemple, dans notre cas, le nombre d’articles commandés pourrait ne pas être pertinent pour le nouveau tableau. C’est pourquoi nous ne sélectionnons maintenant que certaines colonnes pour la copie :

```sql
INSERT INTO Liste de clients_2024 (Numéro de client, Nom, Ville)
SELECT Numéro de client, Nom, Ville FROM Liste de clients_2023 ;
```

Nous obtenons ainsi ce nouveau tableau :

<table>
  <thead>
    <tr>
      <th>Numéro de client</th>
      <th>Nom</th>
      <th>Ville</th>
      <th>Articles</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Berron</td>
      <td>Paris</td>
      <td></td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Froissy</td>
      <td>Strasbourg</td>
      <td></td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Sulis</td>
      <td>Strasbourg</td>
      <td></td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Verdon</td>
      <td>Lille</td>
      <td></td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Paré</td>
      <td>Paris</td>
      <td></td>
    </tr>
  </tbody>
</table>

La colonne « Articles » ne contient donc que des entrées avec la valeur NULL.

## Intégrer des conditions pour le report

Vous pouvez aussi utiliser une condition `WHERE` pour ne copier que certaines lignes sélectionnées. Pour notre tableau, nous souhaitons par exemple ne transférer que les clients de Strasbourg. Le code approprié est celui-ci :

```sql
INSERT INTO Liste de clients_2024
SELECT * FROM Liste de clients_2023
WHERE Ville = 'Strasbourg' ;
```

Voici le contenu de notre nouvelle table :

<table>
  <thead>
    <tr>
      <th>Numéro de client</th>
      <th>Nom</th>
      <th>Vile</th>
      <th>Articles</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1377</td>
      <td>Froissy</td>
      <td>Strasbourg</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Sulis</td>
      <td>Strasbourg</td>
      <td>15</td>
    </tr>
  </tbody>
</table>

## Alternative à SQL `INSERT INTO SELECT`

Une alternative à SQL `INSERT INTO SELECT` est `SELECT INTO`. Les deux instructions sont utilisées pour transférer des données d’une table à une autre. De plus, elles agissent comme partie d’une instruction plus large. Cependant, alors que SQL `INSERT INTO SELECT` nécessite une table existante dans laquelle transférer les données, `SELECT INTO` crée une nouvelle table.

Conseil Vous avez le choix ! Avec le [serveur d’hébergement SQL](https://www.ionos.fr/cloud/hebergement-serveur-sql "Hébergement SQL pour les bases de données MSSQL, MySQL et MariaDB | IONOS") de IONOS, vous pouvez utiliser MSSQL, MySQL ou MariaDB. Des performances de pointe, de puissantes fonctions de sécurité et un conseil personnalisé sont garantis dans tous les cas !


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