En el presente artículo cubriremos la instrucción SQL INSERT INTO SELECT junto con su sintaxis, ejemplos y casos de uso.
En mi artículo anterior SQL SELECT INTO Statement, efectuamos la exploración de las siguientes tareas.
- Cree una tabla SQL inmediatamente mientras inserta registros con los tipos de datos apropiados
- Use SQL SELECT INTO para insertar registros en un grupo de archivos particular
- No podemos usarlo para insertar datos en una tabla existente
La instrucción INSERT INTO SELECT
Queremos insertar como una actividad regular de la base de datos. En esta instancia Podemos insertar datos directamente usando herramientas de cliente como SSMS, Azure Data Studio o directamente desde una aplicación. Por esta razón En SQL, usamos la instrucción SQL INSERT INTO para insertar los mencionados registros.
La sintaxis de INSERT INTO
Una vez que insertemos los datos en la tabla, podremos usar la siguiente sintaxis para nuestra instrucción SQL INSERT INTO.
1 2 |
INSERT INTO table_name (Column1, Column 2....) VALUES (value1, value2, ...); |
Si hemos especificado todos los valores de la referida columna según las órdenes de la misma columna de la tabla, entonces no necesitamos especificar nombres de columna. En consecuencia, Podemos insertar registros directamente en la tabla.
1 2 |
INSERT INTO table_name VALUES (value1, value2, ...); |
Vayamos a crear una tabla de muestra e insertemos datos en ella.
1 2 3 4 |
CREATE TABLE Employees (ID INT, Name VARCHAR(20) ); |
Podemos insertar datos usando las siguientes requerimientos o consultas. Ambas consultas son válidas para la inserción de datos.
1 2 |
Insert into Employees (ID, Name) values (1,'raj') Insert into Employees values (2,'raj') |
Vale la pena mencionar que no podremos insertar datos sin especificar los nombres de las columnas si en el orden de las columnas se hallan diferencias y hay una falta de coincidencia entre la inserción de datos y el orden de los valores de las columnas es diferente. Entonces Podemos obtener el siguiente mensaje de error.
-
Mensaje 213, Nivel 16, Estado 1, Línea 6
El nombre de la columna o el número de valores proporcionados no coincide con la definición de la tabla.
-
Mensaje 245, Nivel 16, Estado 1, Línea 6
La conversión falló al convertir el valor varchar ‘raj’ al tipo de datos int.
Es importante indicar que, en este ejemplo, nosotros usaremos la instrucción SQL INSERT INTO con el suministro de valores directamente en el requerimiento o una instrucción. Supongamos que queremos insertar datos de otra tabla. Es importante indicar que todavía podemos usar la instrucción SQL INSERT INTO con una instrucción select. Exploremos esto en la siguiente sección.
INSERTAR EN SELECCIONAR Sintaxis de declaración
Verifique que Podemos insertar datos de otras tablas SQL en una tabla cualquiera con la siguiente instrucción INSERT INTO SELECT.
1 2 3 |
INSERT INTO table1 (col1, col2, col3, …) SELECT col1, col2, col3, … FROM table2 |
Esta consulta realiza las siguientes tareas:
- Primero selecciona registros de una tabla (instrucción Select)
- A continuación, se inserta en una tabla especificada con INSERT INTO
- Nota: La estructura de la columna debe coincidir entre la columna devuelta inicialmente por la instrucción SELECT y la tabla de destino final.
INSERTAR EN SELECCIONAR ejemplos
Ejemplo 1: inserte datos de todas las columnas de la tabla de inicial origen a la tabla final de destino
En este caso nosotros tenemos los siguientes registros en una tabla de empleados existente.
Para tal fin nosotros crearemos otra tabla Clientes con la siguiente consulta.
1 2 3 4 |
CREATE TABLE Customers (ID INT, Name VARCHAR(20) ); |
Queremos insertar todos los registros de la tabla Empleados en la tabla Clientes. Para tal fin podemos usar la instrucción SQL INSERT INTO SELECT para hacer esto.
1 2 3 |
INSERT INTO Customers SELECT * FROM Employees; |
Esta instrucción Inserta todos los registros en la tabla Clientes. Por esta razón podemos verificar que los registros en la tabla Clientes sean similares a la tabla Empleados.
En este ejemplo, insertamos registros para todas las columnas en la tabla Clientes.
Ejemplo 2: inserte filas de la tabla de origen a la de destino especificando nombres de columna
Para este fin nosotros descartaremos la tabla de Clientes existente antes de seguir adelante. Ahora, queremos crear una tabla con una columna IDENTIDAD adicional. En este caso, la columna IDENTIDAD inserta automáticamente valores de identidad en una tabla. Así mismo también agregamos una columna Ciudad que permite obtener los valores NULL.
1 2 3 4 5 6 |
CREATE TABLE Customers (ID INT IDENTITY(1, 1), Emp_ID INT, Name VARCHAR(20), City VARCHAR(20) NULL, ); |
No podemos usar la instrucción INSERT INTO SELECT en un caso similar al ejemplo anterior. Si intentamos ejecutar este código, recibimos un mensaje de error.
1 2 3 |
INSERT INTO Customers SELECT * FROM Employees; |
En este caso, es importante mencionar que debemos especificar el nombre de la columna con la instrucción INSERT INTO.
1 2 3 |
INSERT INTO Customers (Emp_ID ,Name) SELECT * FROM Employees; |
En la tabla Clientes podemos observar que tenemos una columna adicional con valores NULL permitidos en el momento en que nosotros ejecutemos select en la tabla clientes. En la siguiente captura de pantalla, podemos ver valores NULOS en la columna Ciudad.
Supongamos que usted tiene una columna diferente en la tabla de origen. Pese a ello, usted aún puede insertar registros en la tabla de destino con la especificación de nombres de columna en la instrucción INSERT INTO SELECT. Por esta razón deberíamos tener un tipo de datos apropiado para insertar los mencionados datos. No se puede insertar datos de una columna varchar en una columna INT.
Agregue una nueva columna en la tabla Empleados utilizando la instrucción ALTER TABLE.
1 2 |
ALTER TABLE Employees ADD Country varchar(50); |
Actualice los registros de la tabla con el valor del país India.
1 |
Update Employees set Country='India' |
Ahora, vuelva a ejecutar la instrucción INSERT INTO SELECT. En este caso usted puede notar que estamos usando SELECT * en lugar de especificar nombres de columna.
1 2 3 |
INSERT INTO Customers (Emp_ID ,Name) SELECT * FROM Employees; |
Usted puede observar que recibimos el siguiente mensaje de error. Este error se debe fundamentalmente a que existe una falta de coincidencia de la columna entre la tabla de origen y la tabla de destino.
En consecuencia, nosotros podremos mapear la columna entre la tabla de origen y la de destino usando la siguiente consulta.
1 2 3 4 5 6 |
INSERT INTO Customers (Emp_ID, Name ) SELECT ID,Name FROM Employees; |
Ejemplo 3: inserte las filas superiores con el uso de la instrucción INSERT INTO SELECT
Supongamos que queremos insertar las filas superiores N de la tabla de origen a la tabla de destino. En este caso nosotros podremos usar la cláusula Top en la instrucción INSERT INTO SELECT. En la siguiente consulta, usted debe insertar la fila superior 1 de la tabla Empleados a la tabla Clientes.
1 2 3 4 5 6 |
INSERT TOP(1) INTO Customers (Emp_ID, Name ) SELECT ID,Name FROM Employees; |
Ejemplo 4: Insertar utilizando ambas columnas y los valores definidos en la instrucción SQL INSERT INTO SELECT
Vale la pena mencionar que, en ejemplos anteriores, nosotros habíamos especificado valores precisos en la instrucción INSERT INTO o habíamos utilizado INSERT INTO SELECT para de esta manera obtener registros de la tabla de origen e poder luego insertarlos en la tabla de destino.
Podemos combinar ambas columnas y además sus valores definidos en la instrucción SQL INSERT INTO SELECT.
Podemos observar que tenemos las siguientes columnas en la tabla Clientes y Empleados. Anteriormente, y de forma previa no insertamos ningún valor para la columna Ciudad. Tampoco hemos tenido los valores requeridos en la tabla Empleado. Por esta razón necesitamos especificar un valor explícito para la columna Ciudad.
En la siguiente consulta, especificamos un valor para la columna Ciudad mientras que el resto de los valores deberemos poder insertar de la tabla Empleados.
1 2 |
INSERT TOP(1) INTO Customers (Emp_ID, Name, City) SELECT ID, Name,'Delhi' FROM Employees; |
En la siguiente consulta, podemos ver que se inserta una fila (debido a la cláusula Top (1) junto con el valor de la columna Ciudad.
Ejemplo 5: instrucción INSERT INTO SELECT con la cláusula Join para obtener datos originados de varias tablas
En este acapice podemos ver que es posible el utilizar una cláusula JOIN para obtener datos de varias tablas. Por esta razón es que Estas tablas se unen con las condiciones especificadas con la cláusula ON. En este caso Supongamos que queremos obtener datos de varias tablas e insertarlas en una tabla.
En este ejemplo, lo que estoy usando es la base de datos AdventureWorks2017. Para este fin Primero, cree una nueva tabla con los tipos de datos apropiados.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
CREATE TABLE [HumanResources].[EmployeeData]( [FirstName] [dbo].[Name] NOT NULL, [MiddleName] [dbo].[Name] NULL, [LastName] [dbo].[Name] NOT NULL, [Suffix] [nvarchar](10) NULL, [JobTitle] [nvarchar](50) NOT NULL, [PhoneNumber] [dbo].[Phone] NULL, [PhoneNumberType] [dbo].[Name] NULL, [EmailAddress] [nvarchar](50) NULL, [City] [nvarchar](30) NOT NULL, [StateProvinceName] [dbo].[Name] NOT NULL, [PostalCode] [nvarchar](15) NOT NULL, [CountryRegionName] [dbo].[Name] NOT NULL ) ON [PRIMARY] GO |
Verifique que en esta tabla debe contener registros de la salida de una consulta de la combinación de varias tablas. Entonces usted debe ejecutar la siguiente consulta para insertar datos en la tabla HumanResources.EmployeeData .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
INSERT INTO HumanResources.EmployeeData SELECT p.[FirstName], p.[MiddleName], p.[LastName], p.[Suffix], e.[JobTitle], pp.[PhoneNumber], pnt.[Name] AS [PhoneNumberType], ea.[EmailAddress], a.[City], sp.[Name] AS [StateProvinceName], a.[PostalCode], cr.[Name] AS [CountryRegionName] FROM [HumanResources].[Employee] e INNER JOIN [Person].[Person] p ON p.[BusinessEntityID] = e.[BusinessEntityID] INNER JOIN [Person].[BusinessEntityAddress] bea ON bea.[BusinessEntityID] = e.[BusinessEntityID] INNER JOIN [Person].[Address] a ON a.[AddressID] = bea.[AddressID] INNER JOIN [Person].[StateProvince] sp ON sp.[StateProvinceID] = a.[StateProvinceID] INNER JOIN [Person].[CountryRegion] cr ON cr.[CountryRegionCode] = sp.[CountryRegionCode] LEFT OUTER JOIN [Person].[PersonPhone] pp ON pp.BusinessEntityID = p.[BusinessEntityID] LEFT OUTER JOIN [Person].[PhoneNumberType] pnt ON pp.[PhoneNumberTypeID] = pnt.[PhoneNumberTypeID] LEFT OUTER JOIN [Person].[EmailAddress] ea ON p.[BusinessEntityID] = ea.[BusinessEntityID]; GO |
Ejemplo 6: instrucción INSERT INTO SELECT con la utilización de la expresión de tabla común
Usted puede verificar que utilizamos una expresión de tabla común (CTE) para simplificar la combinación compleja de varias columnas. Como se puede observar en el ejemplo anterior, nosotros hemos utilizado JOINS en una instrucción Select para poder insertar datos en una tabla SQL. Para tal fin, en esta parte, nosotros reescribiremos la consulta con CTE.
En un CTE, podemos dividir el código en dos partes.
- Definimos CTE por una cláusula WITH antes de la instrucción SELECT, INSERT, UPDATE, DELETE
- Una vez que nosotros hemos definido CTE, podremos hacer referencia al CTE de manera similar a una tabla SQL relacional
Ejecute el siguiente código para insertar datos utilizando un CTE.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
WITH EmployeeData_Temp([FirstName], [MiddleName], [LastName], [Suffix], [JobTitle], [PhoneNumber], [PhoneNumberType], [EmailAddress], [City], [StateProvinceName], [PostalCode], [CountryRegionName]) AS ( SELECT p.[FirstName], p.[MiddleName], p.[LastName], p.[Suffix], e.[JobTitle], pp.[PhoneNumber], pnt.[Name] AS [PhoneNumberType], ea.[EmailAddress], a.[City], sp.[Name] AS [StateProvinceName], a.[PostalCode], cr.[Name] AS [CountryRegionName] FROM [HumanResources].[Employee] e INNER JOIN [Person].[Person] p ON p.[BusinessEntityID] = e.[BusinessEntityID] INNER JOIN [Person].[BusinessEntityAddress] bea ON bea.[BusinessEntityID] = e.[BusinessEntityID] INNER JOIN [Person].[Address] a ON a.[AddressID] = bea.[AddressID] INNER JOIN [Person].[StateProvince] sp ON sp.[StateProvinceID] = a.[StateProvinceID] INNER JOIN [Person].[CountryRegion] cr ON cr.[CountryRegionCode] = sp.[CountryRegionCode] LEFT OUTER JOIN [Person].[PersonPhone] pp ON pp.BusinessEntityID = p.[BusinessEntityID] LEFT OUTER JOIN [Person].[PhoneNumberType] pnt ON pp.[PhoneNumberTypeID] = pnt.[PhoneNumberTypeID] LEFT OUTER JOIN [Person].[EmailAddress] ea ON p.[BusinessEntityID] = ea.[BusinessEntityID]) INSERT INTO HumanResources.EmployeeData SELECT * FROM EmployeeData_Temp; GO |
Ejemplo 7: instrucción INSERT INTO SELECT con una variable de tabla
En este caso nosotros utilizamos variables de tabla de manera similar como si fuera a utilizarse una tabla temporal. Nosotros en este caso, podemos precisar usando el tipo de datos de la tabla. Esta tabla se puede usar para realizar actividades en SQL Server donde no necesitamos una tabla permanente. Para tal fin, se puede dividir la siguiente consulta en tres partes.
- Usted debe crear una variable de tabla SQL con los tipos de datos de columna adecuados. Para ello, nosotros necesitamos usar el tipo de datos TABLE para la variable de tabla
- Usted debe ejecutar una instrucción INSERT INTO SELECT para insertar datos en una variable de tabla
- Finalmente, usted deberá ver el conjunto de resultados de la variable de tabla
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
DECLARE @TableVar table( [JobTitle] [nvarchar](50) NOT NULL, [BirthDate] [date] NOT NULL, [MaritalStatus] [nchar](1) NOT NULL, [Gender] [nchar](1) NOT NULL, [HireDate] [date] NOT NULL, [SalariedFlag] [dbo].[Flag] NOT NULL, [VacationHours] [smallint] NOT NULL, [SickLeaveHours] [smallint] NOT NULL ) -- Insert values into the table variable. INSERT INTO @TableVar SELECT [JobTitle] ,[BirthDate] ,[MaritalStatus] ,[Gender] ,[HireDate] ,[SalariedFlag] ,[VacationHours] ,[SickLeaveHours] FROM [AdventureWorks2017].[HumanResources].[Employee] -- View the table variable result set. SELECT * FROM @TableVar; GO |
Conclusión
En este artículo, nosotros hemos explorado los casos de uso de la instrucción INSERT INTO SELECT. Dicho esto, espero que hayas encontrado útil este artículo. Siéntase libre de proporcionar comentarios en los comentarios a continuación.
- INSERTAR EN SELECCIONAR la instrucción del resumen y ejemplos - November 5, 2019
- Descripción general de la cláusula PARTITION BY de SQL - November 4, 2019
- Funciones y formatos de SQL Convert Date - October 10, 2019