Listado completo de tutoriales
50 - Combinaciones y funciones de agrupamiento |
Podemos usar "group by" y las funciones de agrupamiento con combinaciones de tablas.
Para ver la cantidad de libros de cada editorial consultando la tabla "libros" y "editoriales", tipeamos:
select nombre as editorial, count(*) as cantidad from editoriales as e join libros as l on codigoeditorial=e.codigo group by e.nombre;
Note que las editoriales que no tienen libros no aparecen en la salida porque empleamos un "join".
Empleamos otra función de agrupamiento con "left join". Para conocer el mayor precio de los libros de cada editorial usamos la función "max()", hacemos un "left join" y agrupamos por nombre de la editorial:
select nombre as editorial, max(precio) as mayorprecio from editoriales as e left join libros as l on codigoeditorial=e.codigo group by nombre;
En la sentencia anterior, mostrará, para la editorial de la cual no haya libros, el valor "null" en la columna calculada.
drop table if exists libros; drop table if exists editoriales; create table libros( codigo serial, titulo varchar(40), autor varchar(30), codigoeditorial smallint not null, precio decimal(5,2), primary key(codigo) ); create table editoriales( codigo serial, nombre varchar(20), primary key (codigo) ); insert into editoriales(nombre) values('Planeta'); insert into editoriales(nombre) values('Emece'); insert into editoriales(nombre) values('Siglo XXI'); insert into libros(titulo,autor,codigoeditorial,precio) values('El aleph','Borges',1,20); insert into libros(titulo,autor,codigoeditorial,precio) values('Martin Fierro','Jose Hernandez',1,30); insert into libros(titulo,autor,codigoeditorial,precio) values('Aprenda PHP','Mario Molina',3,50); insert into libros(titulo,autor,codigoeditorial,precio) values('Uno','Richard Bach',3,15); insert into libros(titulo,autor,codigoeditorial,precio) values('Java en 10 minutos',default,4,45); -- Contamos la cantidad de libros de cada editorial consultando ambas tablas: select nombre as editorial, count(*) as cantidad from editoriales as e join libros as l on codigoeditorial=e.codigo group by e.nombre; -- Buscamos el libro más costoso de cada editorial con un "left join": select nombre as editorial, max(precio) as mayorprecio from editoriales as e left join libros as l on codigoeditorial=e.codigo group by nombre;
La ejecución de este lote de comandos SQL genera una salida similar a: