54 - Subconsulta (insert)

Aprendimos que una subconsulta puede estar dentro de un "select", "update" y "delete"; también puede estar dentro de un "insert".

Podemos ingresar registros en una tabla empleando un "select".

La sintaxis básica es la siguiente:

 insert into TABLAENQUESEINGRESA (CAMPOSTABLA1)
  select (CAMPOSTABLACONSULTADA)
  from TABLACONSULTADA;

Un profesor almacena las notas de sus alumnos en una tabla llamada "alumnos". Tiene otra tabla llamada "aprobados", con algunos campos iguales a la tabla "alumnos" pero en ella solamente almacenará los alumnos que han aprobado el ciclo.

Ingresamos registros en la tabla "aprobados" seleccionando registros de la tabla "alumnos":

 insert into aprobados (documento,nota)
  select (documento,nota)
   from alumnos;

Entonces, se puede insertar registros en una tabla con la salida devuelta por una consulta a otra tabla; para ello escribimos la consulta y le anteponemos "insert into" junto al nombre de la tabla en la cual ingresaremos los registros y los campos que se cargarán (si se ingresan todos los campos no es necesario listarlos).

La cantidad de columnas devueltas en la consulta debe ser la misma que la cantidad de campos a cargar en el "insert".

Se pueden insertar valores en una tabla con el resultado de una consulta que incluya cualquier tipo de "join".

Problema resuelto

Un profesor almacena las notas de sus alumnos en una tabla llamada "alumnos" (documento, nombre, nota). Tiene otra tabla llamada "aprobados" (documento,nota) en la que guarda los alumnos que han aprobado el ciclo.

Borramos las tablas si existen:

 drop table if exists alumnos;
 drop table if exists aprobados;

Creamos las dos tablas con las siguientes estructuras:

 create table alumnos(
  documento text primary key,
  nombre text,
  nota real
 );

 create table aprobados(
  documento text primary key,
  nota real
 );

Almacenamos un conjunto de filas en la tabla "alumnos":

 insert into alumnos values('30000000','Ana Acosta',8);
 insert into alumnos values('30111111','Betina Bustos',9);
 insert into alumnos values('30222222','Carlos Caseros',2.5); 
 insert into alumnos values('30333333','Daniel Duarte',7.7);
 insert into alumnos values('30444444','Estela Esper',3.4); 

Ingresamos registros en la tabla "aprobados" seleccionando registros de la tabla "alumnos":

 insert into aprobados 
  select documento,nota
   from alumnos
   where nota>=4;

Note que no se listan los campos en los cuales se cargan los datos porque tienen el mismo nombre que los de la tabla de la cual extraemos la información.

Veamos si los registros se han cargado:

 select * from aprobados;

Problema propuesto

Un comercio que vende artículos de librería y papelería almacena la información de sus ventas en una tabla llamada "facturas" y otra "clientes".

  1. Borrar las tablas "facturas" y "clientes" si existen.

  2. Crear las dos tablas con las siguientes estructuras:

    create table clientes(
      codigo integer primary key,
      nombre text,
      domicilio text
     );
    
     create table facturas(
      numero integer primary key,
      codigocliente integer,
      total real
     );
    
  3. Almacenamos algunas filas de prueba en las dos tablas:

     insert into clientes(nombre,domicilio) values('Juan Lopez','Colon 123');
     insert into clientes(nombre,domicilio) values('Luis Torres','Sucre 987');
     insert into clientes(nombre,domicilio) values('Ana Garcia','Sarmiento 576');
     insert into clientes(nombre,domicilio) values('Susana Molina','San Martin 555');
    
     insert into facturas values(1200,1,300);
     insert into facturas values(1201,2,550);
     insert into facturas values(1202,3,150);
     insert into facturas values(1300,1,350);
     insert into facturas values(1310,3,100); 
    
  4. El comercio necesita una tabla llamada "clientespref" en la cual quiere almacenar el nombre y domicilio de aquellos clientes que han comprado hasta el momento más de 500 pesos en mercaderías.

    Borramos si existe la tabla "clientespref":

     drop table if exists clientespref; 
    

    Y la creamos con la siguiente estructura:

     create table clientespref(
      nombre text,
      domicilio text
     ); 
    
  5. Ingrese los registros en la tabla "clientespref" seleccionando registros de la tabla "clientes" y "facturas".

  6. Vea los registros de "clientespref"

Solución
drop table if exists facturas;
drop table if exists clientes;

 create table clientes(
  codigo integer primary key,
  nombre text,
  domicilio text
 );

 create table facturas(
  numero integer primary key,
  codigocliente integer,
  total real
 );
 
 insert into clientes(nombre,domicilio) values('Juan Lopez','Colon 123');
 insert into clientes(nombre,domicilio) values('Luis Torres','Sucre 987');
 insert into clientes(nombre,domicilio) values('Ana Garcia','Sarmiento 576');
 insert into clientes(nombre,domicilio) values('Susana Molina','San Martin 555');

 insert into facturas values(1200,1,300);
 insert into facturas values(1201,2,550);
 insert into facturas values(1202,3,150);
 insert into facturas values(1300,1,350);
 insert into facturas values(1310,3,100); 

 
 drop table if exists clientespref; 
 
 
 create table clientespref(
  nombre text,
  domicilio text
 ); 
 
 
 insert into clientespref
  select nombre,domicilio
   from clientes 
   where codigo in 
    (select codigocliente
     from clientes as c
     join facturas as f
     on codigocliente=codigo
     group by codigocliente
     having sum(total)>500);

 
 select * from clientespref;	 

Ejecución de ejercicios online

Puede ejecutar comandos de SQLite directamente en el sitio sin tener que instalar nada en su computadora.

Resultado.....