69 - join, group by y funciones de agrupamiento.


Podemos usar "group by" y las funciones de agrupamiento con "join".

Para ver todas las editoriales, agrupadas por nombre, con una columna llamada "Cantidad de libros" en la que aparece la cantidad calculada con "count()" de todos los libros de cada editorial tipeamos:

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

Si usamos "left join" la consulta mostrará todas las editoriales, y para cualquier editorial que no encontrara coincidencia en la tabla "libros" colocará "0" en "Cantidad de libros". Si usamos "join" en lugar de "left join":

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

solamente mostrará las editoriales para las cuales encuentra valores coincidentes para el código de la editorial en la tabla "libros".

Para conocer el mayor precio de los libros de cada editorial usamos la función "max()", hacemos una unión y agrupamos por nombre de la editorial:

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

En la sentencia anterior, mostrará, para la editorial de la cual no haya libros, el valor "null" en la columna calculada; si realizamos un simple "join":

 select e.nombre,
  max(l.precio) as 'Mayor precio'
  from editoriales as e
  join libros as l
  on l.codigoeditorial=e.codigo
  group by e.nombre;

sólo mostrará las editoriales para las cuales encuentra correspondencia en la tabla de la derecha.

Retornar