Listado completo de tutoriales

73 - Crear tabla a partir de otra (create - insert)


Tenemos la tabla "libros" de una librería y queremos crear una tabla llamada "editoriales" que contenga los nombres de las editoriales.

La tabla "libros" tiene esta estructura:

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

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

 -nombre: nombre de la editorial.

La tabla libros contiene varios registros.

Para guardar en "editoriales" los nombres de las editoriales, podemos hacerlo en 3 pasos:

1º paso: crear la tabla "editoriales":

	create table editoriales(
	 nombre varchar(20)
        );

2º paso: realizar la consulta en la tabla "libros" para obtener los nombres de las distintas editoriales:

	 select distinct editorial as nombre
	  from libros;

obteniendo una salida como la siguiente:

	editorial
	_________
	Emece
	Paidos
	Planeta

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

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

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

 create table editoriales
  select distinct editorial as nombre
  from libros;

La tabla "editoriales" se ha creado con el campo llamado "nombre" seleccionado del campo "editorial" de "libros".

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

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

 nombre
 ______
 Emece
 Paidos
 Planeta

Si visualizamos la estructura de "editoriales" con "describe editoriales" vemos que el campo "nombre" se creó con el mismo tipo y longitud del campo "editorial" de "libros".

También podemos crear una tabla a partir de una consulta cargando los campos con los valores de otra tabla y una columna calculada. Veamos un ejemplo.

Tenemos la misma tabla "libros" y queremos crear una tabla llamada "librosporeditorial" que contenga la cantidad de libros de cada editorial.

La tabla "cantidadporeditorial", que no está creada, debe tener la siguiente estructura:

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

Podemos lograrlo en 3 pasos:

1º paso: crear la tabla "cantidadporeditorial":

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

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

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

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 cantidadporeditorial values('Emece',3);
	insert into cantidadporeditorial values('Paidos',4);
	insert into cantidadporeditorial values('Planeta',2);

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

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

La tabla "cantidadporeditorial" se ha creado con el campo llamado "nombre" seleccionado del campo "editorial" de "libros" 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 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" con "describe cantidadporeditorial", vemos que el campo "nombre" se creó con el mismo tipo y longitud del campo "editorial" de "libros" 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;

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

 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);

 -- Crearemos la tabla "editoriales" con el campo necesario consultando la tabla "libros"
 -- y en el mismo momento insertaremos la información:
 create table editoriales
  select distinct editorial as nombre
  from libros;

 select * from editoriales;

 describe editoriales;

 -- Queremos crear una tabla llamada "cantidadporeditorial" que contenga la 
 -- cantidad de libros de cada editorial.
 -- Eliminamos la tabla "cantidadporeditorial" si existe:
 drop table if exists cantidadporeditorial;

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

 select * from cantidadporeditorial;

 describe cantidadporeditorial;

Genera una salida similar a esta:

MySQL crear tabla a partir de otra

Retornar