logo oujood
🔍

SQL SELECT INTO : Copier et créer une table depuis une sélection

Apprenez à utiliser l'instruction SQL SELECT INTO pour copier des données d'une table existante vers une nouvelle table, avec ou sans filtres conditionnels, alias de colonnes et bonnes pratiques professionnelles.

OUJOOD.COM

À quoi sert SQL SELECT INTO ?

SQL SELECT INTO crée une nouvelle table en copiant la structure et les données d'une table source en une seule opération. Contrairement à INSERT INTO ... SELECT, qui nécessite une table de destination déjà existante, SELECT INTO crée la table cible à la volée.

On l'utilise surtout pour les sauvegardes avant une opération critique, les migrations de données et la création de tables de staging sans toucher à la production. C'est aussi la façon la plus rapide de générer un jeu de données de test à partir de données réelles.

Ce guide couvre la syntaxe de SELECT INTO, ses variantes (alias, filtres WHERE, table vide, copie inter-bases), et son équivalent sous MySQL/PostgreSQL.

Syntaxe complète de SELECT INTO

SELECT colonne1, colonne2, ...
INTO nouvelle_table [IN autre_base_de_données]
FROM table_source
[WHERE condition]
[ORDER BY colonne];

Détail de chaque composant :

  • SELECT colonne1, colonne2 : colonnes à copier. Utilisez * pour toutes les sélectionner.
  • INTO nouvelle_table : nom de la nouvelle table à créer. Elle ne doit pas exister — sinon, erreur.
  • IN autre_base_de_données : clause optionnelle pour copier vers une base différente (SQL Server uniquement).
  • FROM table_source : table d'origine.
  • WHERE condition : filtre optionnel pour ne copier qu'un sous-ensemble de lignes.
  • ORDER BY : tri optionnel des lignes insérées.

Compatibilité SGBD : SELECT INTO est disponible nativement dans SQL Server (T-SQL) et MS Access. Sous MySQL, MariaDB et PostgreSQL, l'équivalent est CREATE TABLE nouvelle_table AS SELECT ....

Exemples pratiques de SQL SELECT INTO

Exemple 1 — Copier toute une table vers une table de sauvegarde

Créer une copie complète d'une table avant une mise à jour massive ou une suppression en lot. En cas d'erreur, les données sont restaurables depuis la copie.

  📋 Copier le code

-- Copie complète de products vers products_backup
-- SELECT * sélectionne toutes les colonnes
-- La table products_backup est créée automatiquement
SELECT *
INTO products_backup
FROM products;

-- Vérification : comparer le nombre de lignes entre les deux tables
SELECT COUNT(*) AS total_source FROM products;
SELECT COUNT(*) AS total_backup FROM products_backup;

Exemple 2 — Copier des colonnes spécifiques

Plutôt que de dupliquer toutes les colonnes, on liste uniquement les champs utiles. Pratique pour créer un catalogue simplifié destiné à un reporting ou une API publique.

  📋 Copier le code

-- Seulement 3 colonnes copiées vers products_catalogue
-- La nouvelle table n'aura pas les autres champs de products
SELECT product_id, product_name, product_price
INTO products_catalogue
FROM products;

Exemple 3 — Renommer les colonnes avec des alias

Les alias AS permettent de renommer les colonnes dans la nouvelle table lors de la copie. La table source reste inchangée.

  📋 Copier le code

-- Les colonnes sont renommées dans products_fr
-- La source products n'est pas modifiée
SELECT
  product_id    AS id_produit,
  product_name  AS nom_produit,
  product_price AS prix_produit
INTO products_fr
FROM products;

-- products_fr aura : id_produit, nom_produit, prix_produit
-- au lieu de : product_id, product_name, product_price

Exemple 4 — Filtrer avec WHERE

La clause WHERE filtre les lignes avant leur insertion. On ne transfère ici que les produits d'une catégorie précise.

  📋 Copier le code

-- Seuls les produits de la catégorie Électronique sont copiés
SELECT product_id, product_name, product_price, category
INTO products_electronique
FROM products
WHERE category = 'Électronique';

Exemple 5 — Plusieurs conditions et ORDER BY

On peut combiner plusieurs conditions WHERE et un tri ORDER BY. Ici, les produits électronique à plus de 100 €, triés par prix décroissant.

  📋 Copier le code

-- AND combine deux conditions : catégorie ET prix minimum
-- ORDER BY trie les lignes dans la nouvelle table
SELECT product_id, product_name, product_price, category
INTO products_premium_electronique
FROM products
WHERE category = 'Électronique'
  AND product_price > 100
ORDER BY product_price DESC;

Exemple 6 — Créer une table vide avec la même structure

WHERE 1 = 0 est une condition toujours fausse : aucune ligne n'est copiée, mais la structure (colonnes, types) est reproduite. C'est la façon la plus rapide de préparer une table de staging sans réécrire un CREATE TABLE.

  📋 Copier le code

-- WHERE 1 = 0 : condition toujours fausse, aucune ligne insérée
-- products_staging hérite de la structure mais reste vide
SELECT *
INTO products_staging
FROM products
WHERE 1 = 0;

Exemple 7 — Copier vers une autre base de données (SQL Server)

En SQL Server, la clause IN permet de copier une table vers une base différente sur le même serveur, sans export/import manuel. Cette syntaxe est propre à SQL Server et MS Access.

  📋 Copier le code

-- Méthode 1 : notation en trois parties (base.schéma.table)
SELECT *
INTO archive_db.dbo.products_archive
FROM products;

-- Méthode 2 : clause IN explicite (MS Access / fichier .mdb)
SELECT *
INTO products_archive IN 'C:\bases\archive.mdb'
FROM products;

-- Prérequis : droits INSERT et CREATE TABLE sur la base cible

Équivalent MySQL, MariaDB et PostgreSQL : CREATE TABLE AS SELECT

Sous MySQL, MariaDB et PostgreSQL, SELECT INTO n'est pas supporté pour créer une table. L'équivalent fonctionnel est CREATE TABLE AS SELECT, compatible avec la majorité des SGBD modernes.

  📋 Copier le code

-- MySQL / MariaDB / PostgreSQL : équivalent de SELECT INTO
CREATE TABLE products_backup AS
SELECT * FROM products;

-- Avec filtre :
CREATE TABLE products_electronique AS
SELECT * FROM products
WHERE category = 'Électronique';

-- Table vide :
CREATE TABLE products_staging AS
SELECT * FROM products
WHERE 1 = 0;

-- Cette syntaxe fonctionne aussi sous Oracle (CTAS)

Récapitulatif par SGBD

SGBDSyntaxe pour copier une tableRemarque
SQL ServerSELECT * INTO nouvelle FROM sourceSyntaxe native, clause IN disponible
MS AccessSELECT * INTO nouvelle FROM sourceClause IN pour fichiers .mdb
MySQL / MariaDBCREATE TABLE nouvelle AS SELECT * FROM sourceStandard SQL, pas de clause IN
PostgreSQLCREATE TABLE nouvelle AS SELECT * FROM sourceSELECT INTO réservé au PL/pgSQL
OracleCREATE TABLE nouvelle AS SELECT * FROM sourceSyntaxe CTAS
SQLiteCREATE TABLE nouvelle AS SELECT * FROM sourceSyntaxe standard supportée

Points à retenir

  • Table cible existante : si elle existe déjà, une erreur est levée. Utilisez DROP TABLE IF EXISTS nouvelle_table; avant si vous voulez la recréer.
  • Les contraintes ne sont pas copiées : clés primaires, clés étrangères, index et valeurs par défaut doivent être ajoutés manuellement via ALTER TABLE après la copie.
  • Performance : sur SQL Server, SELECT INTO est souvent plus rapide qu'un INSERT INTO ... SELECT en mode de récupération simple, car il opère avec une journalisation minimale.
  • Transactions : encapsulez l'opération dans BEGIN TRANSACTION ... COMMIT / ROLLBACK pour garantir l'atomicité.
  • Types de données : copiés automatiquement. Vérifiez leur compatibilité si vous utilisez CAST ou CONVERT dans le SELECT.
  • Nommage : adoptez une convention explicite — _backup, _archive_YYYYMMDD, _staging — pour faciliter la maintenance.

Par carabde | Mis à jour le 29 avril 2026