logo oujood
🔍

INSERT INTO SELECT en SQL : comment copier des données d'une table à une autre

Requête SELECT comme source d'insertion — syntaxes, cas d'usage et exemples commentés.

OUJOOD.COM

À quoi sert INSERT INTO SELECT ?

En SQL, INSERT INTO SELECT permet d'alimenter une table directement depuis les résultats d'une requête SELECT. Pas besoin de passer par un fichier CSV ou un script externe : on lit dans une table source, et on écrit dans une table destination en une seule instruction.

C'est particulièrement utile pour archiver des données, préparer des tables de travail, ou alimenter une table de reporting sans toucher aux données d'origine.

Syntaxe de base

La forme la plus simple de INSERT INTO SELECT copie toutes les colonnes d'une table vers une autre :

INSERT INTO table_dest
SELECT *
FROM table_src

table_dest reçoit les nouvelles lignes. table_src est lue sans être modifiée. Le * sélectionne toutes les colonnes — les deux tables doivent donc avoir des structures compatibles.

Choisir des colonnes précises

Quand les deux tables n'ont pas exactement les mêmes colonnes, ou quand on veut n'en copier qu'une partie, on liste explicitement les colonnes des deux côtés :

INSERT INTO table_dest (colonne1, colonne2, ...)
SELECT colonne1, colonne2, ...
FROM table_src

On peut aussi passer des expressions calculées à la place des noms de colonnes bruts :

INSERT INTO table_dest (colonne1, colonne2, ...)
SELECT expression1, expression2, ...
FROM table_src

Exemples pratiques

Copier toutes les lignes d'une table

On veut dupliquer la table clients dans clients_copie — par exemple avant une opération risquée :

  📋 Copier le code

INSERT INTO clients_copie
SELECT *
FROM clients

Chaque ligne de clients génère une nouvelle ligne dans clients_copie. La table source reste intacte.

Copier uniquement certaines colonnes

Si clients_copie ne contient que le nom et l'email, on précise les colonnes des deux côtés :

  📋 Copier le code

INSERT INTO clients_copie (nom, email)
SELECT nom, email
FROM clients

Insérer une valeur calculée

On peut transformer les données à la volée. Ici, on incrémente l'âge de 1 au moment de la copie :

  📋 Copier le code

INSERT INTO clients_copie (nom, age)
SELECT nom, age + 1
FROM clients

Filtrer les lignes à copier avec WHERE

On n'est pas obligé de tout copier. Avec la clause WHERE, on ne sélectionne que les lignes qui correspondent à un critère :

  📋 Copier le code

INSERT INTO clients_copie (nom, email)
SELECT nom, email
FROM clients
WHERE age >= 18 -- on ne copie que les majeurs

Astuces utiles

  • Éviter les doublons : ajoutez DISTINCT dans le SELECT si la source contient des lignes répétées que vous ne voulez pas dupliquer dans la destination.
  • Contrôler l'ordre d'insertion : ORDER BY dans le SELECT détermine l'ordre dans lequel les lignes arrivent dans la table destination — utile si cette table a une logique de séquence.
  • Vérifier la compatibilité des types : les colonnes listées dans INSERT INTO et dans SELECT doivent avoir des types compatibles, sinon SQL retournera une erreur de conversion.
  • Les deux tables doivent exister : contrairement à SELECT INTO qui crée la table à la volée, INSERT INTO SELECT exige que la table destination existe déjà.

En résumé

INSERT INTO SELECT est l'instruction à connaître dès qu'on manipule des données entre tables : archivage, préparation de jeux de test, alimentation de tables analytiques. Elle se combine naturellement avec WHERE, DISTINCT et ORDER BY pour affiner ce qu'on copie et comment.


Par carabde | Mis à jour le 16 mai 2026