74 - Crear tabla a partir de otras (create - insert - join)


Tenemos las tablas "libros" y "editoriales" y queremos crear una tabla llamada "cantidadporeditorial" que contenga la cantidad de libros de cada editorial.

La tabla "libros" tiene la siguiente estructura:

 -codigo: int unsigned auto_increment,
 -titulo: varchar(40) not null,
 -autor: varchar(30),
 -codigoeditorial: tinyint unsigned,
 -precio: decimal(5,2) unsigned,
 -clave primaria: codigo.

La tabla "editoriales" tiene esta estructura:

 -codigo: tinyint unsigned auto_increment,
 -nombre: varchar(20),
 clave primaria: codigo.

Las tablas "libros" y "editoriales" contienen varios registros.

La tabla "cantidadporeditorial", que no existe, debe tener la siguiente estructura:

 -nombre: nombre de la editorial,
 -cantidad: cantidad de libros.

Podemos guardar en la tabla "cantidadporeditorial" la cantidad de libros de cada editorial en 3 pasos:

1º paso: crear la tabla "cantidadporeditorial":

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

2º paso: realizar la consulta en la tabla "libros" y "editoriales", con un "join" para obtener la cantidad de libros de cada editorial agrupando por el nombre de la editorial y calculando la cantidad con "count()":

	 select e.nombre,count(*)
	  from libros as l
	  join editoriales as e
	  on l.codigoeditorial=e.codigo    	
	  group by e.nombre;

obteniendo una salida como la siguiente:

        nombre	cantidad
	________________
	Emece	3
	Paidos	4
	Planeta	2

3º paso: insertar los registros necesarios en la tabla "editoriales":

	insert into editoriales values('Emece',3);
	insert into editoriales values('Paidos',4);
	insert into editoriales values('Planeta',2);

Pero existe otra manera simplificando los pasos. Podemos crear la tabla "cantidadporeditorial" con los campos necesarios consultando la tabla "libros" y "editoriales" y en el mismo momento insertar la información:

 create table cantidadporeditorial
  select e.nombre,count(*) as cantidad
  from libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigo    	
  group by e.nombre;

La tabla "cantidadporeditorial" se ha creado con el campo llamado "nombre" seleccionado del campo "nombre" de "editoriales" y con el campo "cantidad" con el valor calculado con count() de la tabla "libros".

Entonces, se realiza una consulta de la tabla "libros" y "editoriales" (con un "join") anteponiendo "create table ..." se ingresa el resultado de dicha consulta en la tabla "cantidadporeditorial" al momento de crearla.

Si seleccionamos todos los registros de la tabla "cantidadporeditorial" aparece lo siguiente:

 nombre		cantidad
 _______________________
 Emece		3
 Paidos		4
 Planeta	2

Si visualizamos la estructura de "cantidadporeditorial", vemos que el campo "nombre" se creó con el mismo tipo y longitud del campo "nombre" de "editoriales" y el campo "cantidad" se creó como "bigint".

Retornar