76 - Insertar registros con valores de otra tabla (insert - select)


Problema:

Tenemos las tabla "libros" y "editoriales" de una librería.

La tabla "libros" contiene registros; "editoriales", no.

Eliminamos las tablas, si existen:

 drop table if exists libros, editoriales;

Creamos las tablas:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40),
  autor varchar(30),
  editorial varchar(20),
  precio decimal(5,2) unsigned,
  primary key(codigo)
 );

 create table editoriales(
  nombre varchar(20)
 );

Ingresamos algunos registros en la tabla "libros":

 insert into libros values (1,'El aleph','Borges','Emece',23.5);
 insert into libros values (2,'Alicia en el pais de las maravillas',
                            'Lewis Carroll','Planeta',15);
 insert into libros values (3,'Matematica estas ahi','Paenza','Emece',34.6);
 insert into libros values (4,'Martin Fierro','Jose Hernandez','Paidos',43.5);
 insert into libros values (5,'Martin Fierro','Jose Hernandez','Planeta',12);
 insert into libros values (6,'Aprenda PHP','Mario Molina','Paidos',21.8);
 insert into libros values (7,'Aprenda Java','Mario Molina','Paidos',55.4);
 insert into libros values (8,'Alicia a traves del espejo','Lewis Carroll','Emece',18);
 insert into libros values (9,'Antologia poetica','Borges','Paidos',47.9);

Queremos insertar registros en la tabla "editoriales", los nombres de las distintas editoriales de las cuales tenemos libros.

Podemos lograrlo en 2 pasos, con 4 sentencias: 1º) realizar la consulta de los nombres de las distintas editoriales de "libros" y 2º) insertar los registros uno a uno en la tabla "editoriales" (3 "insert").

O podemos lograrlo en un solo paso, realizando el "insert" y el "select" en una misma sentencia:

 insert into editoriales (nombre)
  select distinct editorial from libros;

Veamos los registros de "editoriales":

 select * from editoriales;

Queremos conocer la cantidad de libros por editorial, realizamos una consulta:

  select editorial,count(*)
  from libros
  group by editorial;

Queremos guardar esa información en una tabla llamada "cantidadporeditorial".

Eliminamos la tabla "cantidadporeditorial" si existe:

 drop table if exists cantidadporeditorial;

Creamos la tabla "cantidadporeditorial" con la siguiente estructura:

 create table cantidadporeditorial(
  nombre varchar(20),
  cantidad smallint unsigned
 );

Recuerde que los campos presentados entre paréntesis deben ser del mismo tipo y cantidad que las columnas devueltas por la consulta.

Veamos lo que sucede si presentamos 1 solo campo y la consulta retorna 2 columnas:

 insert into cantidadporeditorial (nombre)
  select editorial,count(*) as cantidad
  from libros
  group by editorial;

aparece un mensaje de error y la sentencia no se ejecuta.

Ingresamos correctamente la información:

 insert into cantidadporeditorial (nombre,cantidad)
  select editorial,count(*) as cantidad
  from libros
  group by editorial;

Veamos los registros de la tabla "cantidadporeditorial":

 select * from cantidadporeditorial;

los datos fueron cargados correctamente.




Retornar