SQLShack (Français)
Cet article traite de linstruction SQL INSERT INTO SELECT ainsi que sa syntaxe, ses exemples et ses cas dutilisation.
Dans mon article précédent Instruction SQL SELECT INTO, nous avons exploré les tâches suivantes.
- Créer une table SQL à la volée tout en insérant des enregistrements avec les types de données appropriés
- Utilisez SQL SELECT INTO pour insérer des enregistrements dans un groupe de fichiers particulier
- Nous ne pouvons pas lutiliser pour insérer des données dans une table existante
Linstruction INSERT INTO SELECT
Nous voulons insérer des enregistrements comme une activité de base de données régulière. Nous pouvons insérer des données directement à laide doutils clients tels que SSMS, Azure Data Studio ou directement à partir dune application. En SQL, nous utilisons linstruction SQL INSERT INTO pour insérer des enregistrements.
La syntaxe de INSERT INTO
Une fois que nous insérons des données dans la table, nous pouvons utiliser la syntaxe suivante pour notre Instruction SQL INSERT INTO.
1
2
|
INSERT INTO nom_table (Colonne1, Colonne 2 ….)
VALEURS (valeur1, valeur2, …);
|
Si nous avons spécifié toutes les valeurs de colonne selon la colonne du tableau commandes, nous navons pas besoin de spécifier les noms de colonne. Nous pouvons directement insérer des enregistrements dans la table.
1
2
|
INSERT INTO nom_table
VALEURS (valeur1, valeur2, …);
|
Créons un exemple de tableau et y insérons des données .
1
2
3
4
|
CREATE TABLE Employés
(ID INT,
Nom VARCHAR (20)
);
|
Nous pouvons insérer des données en utilisant les requêtes suivantes. Les deux requêtes sont valides pour linsertion de données.
1
2
|
Insérer dans les valeurs Employés (ID, Nom) (1, « raj »)
Insérer dans les valeurs Employés (2, « raj »)
|
Nous ne pouvons pas insérer de données sans spécifier de nom de colonne sil y a un la non-concordance entre linsertion de données et lordre des valeurs de colonne est différente. Nous pouvons obtenir le message derreur suivant.
- Msg 213, niveau 16, état 1, ligne 6
Le nom de colonne ou le nombre de valeurs fournies ne correspond à la définition de la table.
- Msg 245, niveau 16, état 1, ligne 6
La conversion a échoué lors de la conversion de la valeur varchar raj en type de données int.
Dans cet exemple, nous utiliserons linstruction SQL INSERT INTO en fournissant des valeurs directement dans une instruction. Supposons que nous voulions insérer des données dune autre table. Nous pouvons toujours utiliser linstruction SQL INSERT INTO avec une instruction select. Explorons cela dans la section suivante.
Syntaxe de linstruction INSERT INTO SELECT
Nous pouvons insérer des données dautres tables SQL dans une table avec linstruction INSERT INTO SELECT suivante.
1
2
3
|
INSERT INTO table1 (col1, col2, col3,…)
SELECT col1, col2, col3,…
FROM table2
|
Cette requête exécute les tâches suivantes:
- Il sélectionne dabord les enregistrements dans une table (instruction Select)
- Ensuite, il sinsère dans une table spécifiée avec INSERT INTO
- Remarque: La structure Column doit correspondre entre la colonne renvoyée par linstruction SELECT et la table de destination.
Exemples INSERT INTO SELECT
Exemple 1: insérer des données de toutes les colonnes de la table source vers la table de destination
Nous avons les enregistrements suivants dans un table Employee existante.
Créons une autre table Clients avec la requête suivante.
1
2
3
4
|
CREATE TABLE Clients
(ID INT,
Nom VARCHAR (20)
);
|
Nous voulons insérer tous les enregistrements de la table Employés dans la table Clients. Nous pouvons utiliser linstruction SQL INSERT INTO SELECT pour ce faire.
1
2
3
|
INSERT INTO Clients
SELECT *
FROM Employés;
|
Il insère tous les enregistrements dans la table Clients. Nous pouvons vérifier que les enregistrements de la table Clients sont similaires à la table Employés.
Dans cet exemple, nous avons inséré des enregistrements pour tous colonnes à la table Clients.
Exemple 2: Insérez des lignes de la table source à la table de destination en spécifiant les noms de colonne
Supprimons la table Clients existante avant daller de lavant. Maintenant, nous voulons créer une table avec une colonne IDENTITY supplémentaire. La colonne IDENTITY insère automatiquement les valeurs didentité dans une table. Nous avons également ajouté une colonne Ville qui autorise les valeurs NULL
1
2
3
4
5
6
|
CRÉER TABLE Clients
(ID INT IDENTITY (1, 1),
Emp_ID INT,
Nom VARCHAR (20),
Ville VARCHAR (20) NULL,
);
|
Nous ne pouvons pas utiliser linstruction INSERT INTO SELECT similaire à la exemple ci-dessus. Si nous essayons dexécuter ce code, nous obtenons un message derreur.
1
2
3
|
INSERT INTO Clients
SELECT *
FROM Employés ;
|
Dans ce cas, nous devons spécifier le nom de la colonne avec linstruction INSERT INTO.
1
2
3
|
INSERT INTO Clients (Emp_ID, Name)
SELECT *
FROM Employés;
|
Dans le tableau Clients, nous avons une colonne supplémentaire avec autorise les valeurs NULL. Lançons une table Sélectionner sur les clients. Dans la capture décran suivante, nous pouvons voir les valeurs NULL dans la colonne Ville.
Supposons que vous ayez une colonne différente dans la table source. Vous pouvez toujours insérer des enregistrements dans la table de destination en spécifiant des noms de colonne dans linstruction INSERT INTO SELECT. Nous devrions avoir un type de données approprié pour insérer des données. Vous ne pouvez pas insérer de données de colonne varchar dans une colonne INT.
Ajoutez une nouvelle colonne dans la table Employees à laide de linstruction ALTER TABLE.
1
2
|
ALTER TABLE Employés
ADD Pays varchar (50);
|
Mettez à jour les enregistrements de la table avec la valeur du pays Inde.
1
|
Mettre à jour lensemble des employés Country = « India »
|
Maintenant, relancez INSERT INTO Instruction SELECT. Vous pouvez remarquer que nous utilisons SELECT * au lieu de spécifier des noms de colonnes.
1
2
3
|
INSERT INTO Clients (Emp_ID, Name)
SELECT *
FROM Employés;
|
Nous obtenons le message derreur suivant. Cette erreur est due à lincompatibilité de colonne entre la table source et la table de destination.
Nous pouvons mapper la colonne entre la table source et la table de destination en utilisant la requête suivante.
1
2
3
4
5
6
|
INSERT INTO Clients
(Emp_ID,
Nom
)
SELECT ID, Nom
FROM Employés;
|
Exemple 3: insérer les premières lignes en utilisant INSERT INTO SELECT instruction
Supposons que nous voulions insérer les N premières lignes de la table source vers la table de destination. Nous pouvons utiliser la clause Top dans linstruction INSERT INTO SELECT. Dans la requête suivante, il insère la première ligne de la table Employés dans la table Clients.
1
2
3
4
5
6
|
INSERT TOP (1) INTO Clients
(Emp_ID,
Name
)
SELECT ID, nom
FROM Employés;
|
Exemple 4: Insérer en utilisant les deux colonnes et les valeurs définies dans linstruction SQL INSERT INTO SELECT
Dans les exemples précédents, nous avons soit spécifié des valeurs spécifiques dans linstruction INSERT INTO, soit utilisé INSERT INTO SELECT pour obtenir des enregistrements de la table source et les insérer dans la table de destination.
Nous pouvons combiner les colonnes et les valeurs définies dans linstruction SQL INSERT INTO SELECT.
Nous avons les colonnes suivantes dans le tableau Clients et Employés. Auparavant, nous navions inséré aucune valeur pour la colonne Ville. Nous navons pas non plus les valeurs requises dans la table Employee. Nous devons spécifier une valeur explicite pour la colonne Ville.
Dans la requête suivante, nous avons spécifié une valeur pour la ville colonne tandis que le reste des valeurs que nous avons insérées à partir de la table Employés.
1
2
|
INSERT TOP (1) INTO Clients (Emp_ID, Name, City)
SELECT ID, Name, « Delhi » FROM employés;
|
Dans la requête suivante, nous pouvons voir quil en insère un row (en raison de la clause Top (1)) avec la valeur de la colonne City.
Exemple 5: INSERT INTO SELECT instruction avec clause Join pour obtenir des données de plusieurs tables
Nous pouvons utiliser une clause JOIN pour obtenir des données de plusieurs tables. Ces tables sont jointes avec les conditions spécifiées avec la clause ON. Supposons que nous voulions obtenir des données de plusieurs tables et les insérer dans une table.
Dans cet exemple, jutilise la base de données AdventureWorks2017. Commencez par créer une nouvelle table avec les types de données appropriés.
Cette table doit contenir les enregistrements de la sortie dune requête de jointure de tables multiples. Exécutez la requête suivante pour insérer des données dans la table HumanResources.EmployeeData.
Exemple 6: Instruction INSERT INTO SELECT avec expression de table commune
Nous utilisons des expressions de table communes (CTE) pour simplifier la jointure complexe à partir de plusieurs colonnes. Dans lexemple précédent, nous avons utilisé JOINS dans une instruction Select pour insérer des données dans une table SQL. Dans cette partie, nous réécrirons la requête avec CTE.
Dans un CTE, nous pouvons diviser le code en deux parties.
- Nous définissons CTE par une clause WITH avant linstruction SELECT, INSERT, UPDATE, DELETE
- Une fois que nous avons défini CTE, nous pouvons prendre référence le CTE similaire à une table SQL relationnelle
Exécutez le code suivant pour insérer des données à laide dun CTE.
Exemple 7 : Instruction INSERT INTO SELECT avec une variable Table
Nous utilisons les variables Table de la même manière quune table temporaire. Nous pouvons les déclarer en utilisant le type de données table. Cette table peut être utilisée pour effectuer des activités dans SQL Server où nous navons pas besoin dune table permanente. Vous pouvez diviser la requête suivante en trois parties.
- Créez une variable de table SQL avec les types de données de colonne appropriés. Nous devons utiliser le type de données TABLE pour la variable de table
- Exécuter une instruction INSERT INTO SELECT pour insérer des données dans une variable de table
- Afficher lensemble de résultats de la variable de table
Conclusion
Dans cet article, nous explorons les cas dutilisation de linstruction INSERT INTO SELECT. Jespère que vous avez trouvé cet article utile. Nhésitez pas à nous faire part de vos commentaires dans les commentaires ci-dessous.
- Auteur
- Messages récents
Il est le créateur de lune des plus grandes collections darticles en ligne gratuits sur un seul sujet, avec sa série de 50 articles sur les groupes de disponibilité Always On SQL Server. Sur la base de sa contribution à la communauté SQL Server, il a été récompensé par divers prix dont le prestigieux « Meilleur auteur de lannée » en continu en 2020 et 2021 chez SQLShack.
Raj est toujours intéressé par de nouveaux défis, donc si vous avez besoin de conseil aide sur tout sujet traité dans ses écrits, il peut être contacté à [email protected]
Voir tous les articles de Rajendra Gupta
- Mise à niveau des versions mineures et majeures pour AWS RDS SQL Server – 29 janvier 2021
- Déploiement dinstances AWS RDS PostgreSQL – 27 janvier 2021
- Migration de vos bases de données SQL sur site vers AWS RDS SQL Server à laide dAWS DMS – 25 janvier , 2021