Saltar la navegación

5.1.- Inserción de registros a partir de una consulta.

Diagrama con icono de base de datos, tablas y símbolo de inserción.
Ministerio de Educación. (Uso Educativo nc)

Anteriormente hemos visto la posibilidad de insertar registros en una tabla a través de la sentencia INSERT, por ejemplo:

INSERT INTO USUARIOS (Login, Password, Nombre, Apellidos, direccion,cp,localidad,provincia,pais,Correo) VALUES ('natsan63', 
'VBROMI', 'NATALIA', 'SANCHEZ GARCIA','C/Blanca','28003','Madrid','Madrid','Spain', 'natsan63@hotmail.com');

Esta misma acción se puede realizar usando una consulta SELECT dentro de la sentencia INSERT, así por ejemplo, la equivalente a la anterior sería:

INSERT INTO (SELECT Login, Password, Nombre, Apellidos, direccion,cp,localidad,provincia,pais,Correo FROM USUARIOS) VALUES ('natsan63', 
'VBROMI', 'NATALIA', 'SANCHEZ GARCIA','C/Blanca','28003','Madrid','Madrid','Spain', 'natsan63@hotmail.com');

Puedes observar que simplemente se ha sustituido el nombre de la tabla, junto con sus campos, por una consulta equivalente.

También  es posible insertar en una tabla valores que se obtienen directamente del resultado de una consulta. Supongamos por ejemplo, que disponemos de una tabla USUARIOS_SIN_CREDITO con la misma estructura que la tabla USUARIOS ya creada. Si queremos insertar en esa tabla todos los usuarios que tienen el crédito a cero:

INSERT INTO USUARIOS_SIN_CREDITO SELECT * FROM USUARIOS WHERE Credito = 0;

Observa que en ese caso no se debe especificar la palabra VALUES, ya que no se está especificando una lista de valores.

Se puede crear una tabla e insertar datos a partir de una consulta. Podemos crear la tabla  USUARIOS_CON_CREDITO partiendo de la tabla usuario, si queremos crearla exactamente con el mismo número de campos y con su contenido pondremos:

 CREATE TABLE USUARIOS_CON_CREDITO AS SELECT * FROM USUARIOS WHERE CREDITO >0 ;

Si queremos crear una tabla USUARIAS con la misma estructura, pero sin contenido especificaremos una condición que no se cumpla nunca y así ningún registro se copiará:  

CREATE TABLE USUARIAS AS SELECT * FROM USUARIOS WHERE 1 <0;

A partir de aquí podremos insertar en esta nueva tabla: 

INSERT INTO USUARIAS 
SELECT * FROM USUARIOS WHERE UPPER(SEXO)='M';

Observa que en ese caso no es necesario incorporar en la instrucción la palabra VALUES ya que para cada fila insertada incorporamos los valores correspondientes a todas las columnas de la tabla de destino.

Autoevaluación

Pregunta

¿Cuál de las siguientes sentencias INSERT es la correcta para insertar en la tabla CLIENTES los nombres de los registros de la tabla NUEVOS_CLIENTES, suponiendo que los campos que contienen los nombres se llaman Nombre_CLI en la tabla CLIENTES y Nombre_NCLI en la tabla NUEVOS_CLIENTES?

Respuestas

INSERT INTO CLIENTES (Nombre_CLI) VALUES Nombre_NCLI FROM NUEVOS_CLIENTES;

INSERT INTO CLIENTES (Nombre_CLI) VALUES (SELECT Nombre_NCLI FROM NUEVOS_CLIENTES);

INSERT INTO CLIENTES VALUES (SELECT Nombre_CLI, Nombre_NCLI FROM NUEVOS_CLIENTES);

INSERT INTO NUEVOS_CLIENTES (Nombre_CLI) VALUES (SELECT Nombre_NCLI FROM CLIENTES);

Retroalimentación