Listado completo de tutoriales

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


Tenemos las tabla "libros" y "editoriales", que contienen registros, y la tabla "cantidadporeditorial", que no contiene registros.

La tabla "libros" tiene la siguiente estructura:

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

La tabla "editoriales":

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

La tabla "cantidadporeditorial":

 -nombre: varchar(20),
 -cantidad: smallint unsigned.

Queremos insertar registros en la tabla "cantidadporeditorial", los nombres de las distintas editoriales de las cuales tenemos libros y la cantidad de libros de cada una de ellas.

Podemos lograrlo en 2 pasos:

1º paso: consultar con un "join" los nombres de las distintas editoriales de "libros" y la cantidad:

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

obteniendo una salida como la siguiente:

  editorial	cantidad
  ______________________
  Emece		3
  Paidos	1	
  Planeta	1
  Plaza & Janes	0

2º paso: insertar los registros uno a uno en la tabla "cantidadporeditorial":

	insert into cantidadporeditorial values('Emece',3);
	insert into cantidadporeditorial values('Paidos',1);
	insert into cantidadporeditorial values('Planeta',1);
	insert into cantidadporeditorial values('Plaza & Janes',0);

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

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

Entonces, se puede insertar registros en una tabla con la salida devuelta por una consulta que incluya un "join" o un "left join"; para ello escribimos la consulta y le anteponemos "insert into", el 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).

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

Servidor de MySQL instalado en forma local.

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

 drop table libros, editoriales, cantidadporeditorial;

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40),
  autor varchar(30),
  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)
 );
 
 create table cantidadporeditorial(
  nombre varchar(20),
  cantidad smallint unsigned
 );

 insert into libros values (1,'El aleph','Borges',2,23.5);
 insert into libros values (2,'Alicia en el pais de las maravillas',
                            'Lewis Carroll',1,15);
 insert into libros values (3,'Matematica estas ahi','Paenza',2,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 editoriales values(1,'Planeta');
 insert into editoriales values(2,'Emece');
 insert into editoriales values(3,'Paidos');
 insert into editoriales values(4,'Plaza & Janes');

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

 select * from cantidadporeditorial;

Genera una salida similar a esta:

MySQL insert con select y join

Retornar