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