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 :
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 :
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 :
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 :
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