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.
-- 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.
-- 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.
-- 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.
-- 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.
-- 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.
-- 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.
-- 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.
-- 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
| SGBD | Syntaxe pour copier une table | Remarque |
|---|---|---|
| SQL Server | SELECT * INTO nouvelle FROM source | Syntaxe native, clause IN disponible |
| MS Access | SELECT * INTO nouvelle FROM source | Clause IN pour fichiers .mdb |
| MySQL / MariaDB | CREATE TABLE nouvelle AS SELECT * FROM source | Standard SQL, pas de clause IN |
| PostgreSQL | CREATE TABLE nouvelle AS SELECT * FROM source | SELECT INTO réservé au PL/pgSQL |
| Oracle | CREATE TABLE nouvelle AS SELECT * FROM source | Syntaxe CTAS |
| SQLite | CREATE TABLE nouvelle AS SELECT * FROM source | Syntaxe 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 TABLEaprès la copie. - Performance : sur SQL Server, SELECT INTO est souvent plus rapide qu'un
INSERT INTO ... SELECTen mode de récupération simple, car il opère avec une journalisation minimale. - Transactions : encapsulez l'opération dans
BEGIN TRANSACTION ... COMMIT / ROLLBACKpour 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