Listado completo de tutoriales

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".

Servidor de MySQL instalado en forma local.

Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones SQL:

 drop table if exists libros, editoriales,cantidadporeditorial;

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30) not null default 'Desconocido',
  codigoeditorial tinyint unsigned,
  precio decimal(5,2) unsigned,
  primary key (codigo)
 );

 create table editoriales(
  codigo tinyint unsigned auto_increment,
  nombre varchar(20),
  primary key(codigo)
 );

 insert into editoriales (nombre) values('Emece');
 insert into editoriales (nombre) values('Planeta');
 insert into editoriales (nombre) values('Paidos');

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


 -- Crearemos la tabla "cantidadporeditorial" con los campos necesarios 
 -- consultando la tabla "libros" y "editoriales" y
 -- en el mismo momento insertaremos los registros:
 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;

 select * from cantidadporeditorial;

 describe cantidadporeditorial;

Genera una salida similar a esta:

MySQL crear tabla a partir de otras

Retornar