76 - Insertar registros con valores de otra tabla (insert - select) |
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.