Agrupamientos

Hemos visto en el apartado anterior como podemos obtener datos derivados de operaciones realizadas a todos los registros seleccionados. Aprendimos, por ejemplo, a obtener la suma de los salarios de todos los empleados de la empresa o, al menos, de todos los empleados que cumplían ciertos requisitos.

Con el mecanismo conocido como agrupamiento, podremos definir distintos grupos de registros según los valores que tengan en ciertos campos específicados. Siguiendo el ejemplo anterior, podríamos agrupar los registros según la profesión de los empleados. Eso nos devolvería, dentro de la misma consulta, un registro para los programadores, otro para los vendedores, etc..

Pues bien, si empleamos funciones de agregación junto a agrupamientos, obtendremos un resultado por cada uno de esos registros producto de la agrupación. Es decir, tendríamos la suma de los salarios de los programadores en un registro y en el siguiente los salarios obtenidos por los vendedores. Esta característica resulta muy útil para realizar informes.

La cláusula GROUP BY combina los registros con valores idénticos en la lista de campos especificados en un único registro. Se puede agrupar hasta por 10 campos.

Sintaxis:

SELECT campos
FROM tabla
[WHERE condición]
GROUP BY campos de agrupamiento

La cláusula WHERE impone una condición previa al agrupamiento. Es decir, primero se seleccionan los registros, luego se impone la restricción y, finalmente, se agrupan los registros restantes.

Ejemplo 1:

Averiguar los distintos precios de los productos. Este ejemplo se podría realizar de forma equivalente por medio de DISTINCT.

SELECT precio
FROM productos
GROUP BY precio;

En este ejemplo podremos ver paso a paso como se va construyendo el resultado de una consulta que realiza agrupamientos.

Podemos darnos cuenta de los problemas que tendríamos si, por ejemplo, en la SELECT pidieramos un campo no incluido en la cláusula GROUP BY. Puesto que sólo devolvemos un registro por departamento (por ser éste el único campo incluido en dicha cláusula) no encontraríamos con diferentes valores de los otros campos y no tendríamos manera de saber cual de ellos devolver.

a1.jpg
a2.jpg
a3.jpg
a4.jpg

Agregados

Se puede emplear con funciones de agregación y, de hecho, es lo que se hace normalmente. En ese caso, el agregado no se referirá a todos los registros de la tabla, sino que habrá un valor distinto por cada grupo seleccionado.

Un campo de la lista de campos GROUP BY no puede referirse a un dato Memo u Objeto OLE. Sin embargo puede referirse a un campo que no esté incluido en la instrucción SELECT, siempre y cuando la instrucción SELECT incluya al menos una función SQL agregada.

Consideraciones:

  • Los valores Null se agrupan y no se omiten, pero no se evalúan en las funciones agregadas.
  • Con la cláusula Where excluimos los campos que no queremos agrupar.
  • Pueden agruparse todos los tipos de datos excepto los campos de tipo OBJETO OLE.

Ejemplo 2:

Averiguar cual es el salario más alto de cada departamento.

SELECT departamento, max(salario) AS sueldazo
FROM empleados
GROUP BY departamento;

Ejemplo 3:

Averiguar el sueldo mayor, menor y la media en cada uno de los trabajos de los empleados.

SELECT trabajo, MAX(salario) as Máximo, MIN(salario) as Mínimo, AVG(salario) as Media
FROM empleados
GROUP BY trabajo;

a5.jpg
a6.jpg
a7.jpg
a8.jpg

Heaving

Es similar al WHERE, ya que limita el numero de filas que aparecerán en el resultado, sin embargo, solo se pueden usar con una cláusula GROUP BY. Con la cláusula WHERE excluimos los campos que no queremos agrupar, mientras que con la cláusula HAVING filtramos los datos que ya hemos agrupado.

Sintaxis:

SELECT campo
FROM tabla
[WHERE condición]
GROUP BY campo de agrupamiento
HAVING condición

Se muestran los campos agrupados por la cláusula GROUP BY que cumplan las condiciones de la cláusula HAVING según este procedimiento:

  • Si la sentencia contiene una cláusula WHERE primero se filtran todas las filas que no satisfagan la condición
  • Se toman los conjuntos de filas especificándose en el GROUP BY
  • Por ultimo se muestran los subconjuntos recuperados que satisfagan la cláusula HAVING.

Ejemplo 4:

Calcula la media de los salarios de los empleados en cada departamentos, siempre que dicha media supere los 2000 euros.

SELECT departamento, avg(salario)
FROM empleados
GROUP BY departamento
HAVING AVG(salario) > 2000;

Ejemplo 5:

Muestra el número de personas con salario mayor de 1500 que trabajan en cada departamento, pero solo para aquellos departamentos en los que trabajan mas de 3 personas "adineradas".

SELECT COUNT(apellido)
FROM empleados
WHERE salario>1500
GROUP BY departamento
HAVING COUNT(departamento)>3;

Ejemplo 6:

Averiguar el sueldo mayor, menor y la media en cada uno de los trabajos de los empleados, sólo para aquellos empleos cuya media de salario sea mayor de 1500.

SELECT trabajo, MAX(salario) as Máximo, MIN(salario) as Mínimo, AVG(salario) as Media
FROM empleados
GROUP BY trabajo
HAVING AVG(salario)>1500;

« MySQL 4 | Consulta de datos avanzada

Si no se indica lo contrario, el contenido de esta página se ofrece bajo Creative Commons Attribution-ShareAlike 3.0 License