Pildoritas de Bases de Datos: SQL. Clausulas II

Un mes ha pasado ya desde la última entrada de las Pildoritas de Bases de Datos. ¡Mil disculpas por el retraso!

Por si os habéis olvidado en este tiempo de la anterior pildorita , os hago un resumen breve: En primer lugar enumeré las clausulas y las expliqué cada una por encima. Tras esto, vimos los operadores condicionales y de comparación, que se utilizan dentro de la clausula WHERE.

En este post vamos a continuar con las clausulas GROUP BY y HAVING, y sus operadores, las funciones de agregación, pero si no os importa cambiaré el orden del anterior post: Primero veremos las funciones de agregación, y luego repasaremos con este nuevo conocimiento las dos clausulas. Ya veréis por qué 😉

Funciones de agregación.

Las funciones de agregación se usan en la clausula SELECT (y en la HAVING, como veremos más tarde), y realizan operaciones que devuelven un único valor de un grupo de registros determinados.

 

Función Descripción
COUNT Devuelve el número de registros de la selección
SUM Devuelve la suma de todos los valores de un campo determinado.
AVG Obtiene la media de los valores de un campo determinado.
MIN Devuelve el valor más bajo del campo especificado.
MAX Devuelve el valor más alto del campo especificado.

 

Vamos a ver algunos ejemplos de consulta utilizando las funciones de agregación. Utilizaré para los ejemplos la tabla Empleado de nuestro eterno modelo de datos.

empleado* A lo mejor os habéis percatado de que hay un campo de más, salario. ¡No os spoileéis el post!

 

Si quisiéramos saber el número total de empleados que tenemos subcontratados por la empresa, usaríamos el operador COUNT.

SELECT COUNT(*)  FROM EMPLEADO

Si por ejemplo, necesitáramos conocer la media que pagamos a nuestros empleados, usaríamos la función AVG.

SELECT AVG(SALARIO) FROM EMPLEADO

Por último, y ya terminamos con los ejemplos en este capítulo, veamos como obtendríamos el salario del empleado que más cobra en la empresa:

SELECT MAX(SALARIO) FROM EMPLEADO

 

Pasemos ahora a las clausulas GROUP BY y HAVING, y veamos que relación tienen éstas con las funciones de agregación.

Clausulas GROUP BY y HAVING

El GROUP BY, como ya vimos, sirve para agrupar registros por los valores de una determinada columna.

Vamos a seguir con el ejemplo de los empleados, pero (ahora sí) vamos a meterle un nuevo campo, salario, para poder ver ejemplos de agrupaciones con algo de chicha.

 

Si quisiéramos saber cuanto le pagamos por los salarios de los empleados a cada compañía que tenemos contratada, agruparíamos por el campo compañía y haríamos un sumatorio del campo salarios.

SELECT SUM(SALARIO) FROM EMPLEADO GROUP BY COMPAÑIA

 

La cláusula HAVING, va en conjunción siempre con la clausula GROUP BY, y sirve para indicar condiciones de filtrado en las agrupaciones.

Es una clausula que muchas veces es prescindible, ya que podemos filtrar los resultados a través de la clausula WHERE, pero si queremos filtrar utilizando funciones de agregación, su uso será obligatorio.

HAVING suele ser lioso de entender en un principio, pero es sencillo visto de forma práctica.

 

En esta ocasión queremos saber a que compañías pagamos más de un millón de euros en el concepto de salario de empleados.

SELECT COMPAÑIA FROM EMPLEADO GROUP BY COMPAÑIA 
HAVING SUM(SALARIO) > 1.000.000

 

Y ahora, hagamos unas cuantas consideraciones con las cuales espero que consigáis afianzar toda esta parte.

 

Las funciones de agregación se utilizan siempre en la clausula SELECT y no necesitan por sí mismas la clausula GROUP BY, y por extensión, la HAVING, como ya habéis visto. Son las clausulas GROUP BY, y HAVING, las que “requieren” siempre de la existencia de una función de agregación. De hecho, en el momento que quisiéramos en una consulta mostrar otro campo a parte de la función de agregación, el motor de bases de datos con el que estuviéramos trabajando nos mostraría un error diciéndonos que este campo debe estar dentro de una clausula GROUP BY. Es decir, las columnas mostradas en el SELECT que no sean una función de agregación deben estar contenidas dentro del GROUP BY.

Lo mejor es ver estos usando un poco de Álgebra de Conjuntos.

Podemos tener el conjunto de empleados, que son todos los registros de la tabla empleado, y aplicar funciones de agregación con él. En este caso como es obvio no necesitamos especificar el comando GROUP BY.

Por otra parte, podríamos querer realizar funciones de agregación con un subconjunto del conjunto empleados. Por ejemplo, podríamos querer operar con el conjunto de empleados que tienen el puesto de ‘Programador Junior’, y obtener su salario medio.

 

En el primer ejemplo del apartado de la parte del GROUP BY, calculamos cuanto pagamos en concepto de sueldos de empleados a cada compañía. Imaginad que quisiéramos obtener el salario total que pagamos a cada compañía, por cada puesto.

SELECT COMPAÑIA, PUESTO, SUM(SALARIO) FROM EMPLEADO GROUP BY COMPAÑIA, PUESTO

De hecho, si quisiéramos rizar más el rizo, podríamos querer saber los salarios medios que pagamos por los puestos de “Programador Senior” y “Analista Funcional” a cada compañía (por eso de abaratar costes xD).

SELECT COMPAÑIA, PUESTO, AVG(SALARIO) FROM EMPLEADO GROUP BY COMPAÑIA, PUESTO 
HAVING PUESTO IN ('Programador Senior', 'Analista Funcional')

Y ya, por el simple hecho de utilizar clausulas como si no hubiera mañana, vamos a obtener estos registros ordenados de mayor a menor media.

SELECT COMPAÑIA, PUESTO, AVG(SALARIO) FROM EMPLEADO GROUP BY COMPAÑIA, PUESTO 
HAVING PUESTO IN ('Programador Senior', 'Analista Funcional') 
ORDER BY AVG(SALARIO)

¡¡Qué estoy mu locaaa!!

 

Espero que la pildorita de hoy no se os haya atragantado. He intentado daros un buen vaso de agua, sólo espero que este fuera de mini, y no de café xDD

En la próxima pildorita veremos los JOIN…Entonces agradeceréis que os haya introducido con mucha delicadeza el tema del álgebra de conjuntos xD

 

¿Os habéis percatado de que en el último y penúltimo ejemplo podríamos filtrar en el where en vez de en el HAVING?

SELECT COMPAÑIA, PUESTO, AVG(SALARIO) FROM EMPLEADO 
WHERE PUESTO IN ('Programador Senior', 'Analista Funcional') 
GROUP BY COMPAÑIA, PUESTO

¡Mindfuck! 😛

Índice de Pildoritas

Share