Funciones de grupo
Las funciones de grupo también se conocen como funciones de columna porque, en
general, reciben como argumento los valores de una columna y devuelven como resultado
un único valor (excepto count (*) que devuelve la cantidad de registros de la tabla). En el
caso de que alguno de los valores sea NULL, puede variar el resultado según el SGBD (SQL
SERVER, ORACLE, MYSQL, etc.), aunque el estándar de SQL ANSI-ISO establece que deben
ignorarse los valores Null.
Las funciones estándar de grupo son:
AVG (COLUMNA):– devuelve el valor promedio de la columna.
SUM (COLUMNA): devuelve la suma de todos los valores que hay en esa columna (ignora
los NULL).
COUNT(*):– devuelve el número de filas de la tabla.
COUNT (COLUMNA): devuelve la cantidad de valores que hay en esa columna.
COUNT (DISTINCT COLUMNA): devuelve la cantidad de valores distintos de la columna.
MAX (COLUMNA): devuelve el valor máximo de la columna.
MIN (COLUMNA): devuelve el valor mínimo de la columna.
EJEMPLO 29
Teniendo en cuenta que la tabla MATERIA actualmente tiene los siguientes registros:
mostrar la cantidad de registros que tiene la tabla y la cantidad de nombres de las
materias.
© Universidad de Palermo. Prohibida la reproducción total o parcial de imágenes y textos. 1
EJEMPLO 30
Mostrar cuántos nombres tiene la tabla alumno y también cuántos nombres distintos.
Veamos primero la tabla alumno, para entenderlo mejor, y luego haremos la consulta:
© Universidad de Palermo. Prohibida la reproducción total o parcial de imágenes y textos. 2
EJEMPLO 31
Mostrar la mejor nota del año 2016 y la peor del mismo año, llamando a la primera
columna mejor y a la segunda peor.
EJEMPLO 32
Mostrar la diferencia entre la mejor y la peor nota del año 2016, llamar a la columna del
resultado diferencia.
EJEMPLO 33
Mostrar la cantidad de exámenes, mejor nota, la peor y la nota promedio del alumno que
tiene legajo nro. 69.
© Universidad de Palermo. Prohibida la reproducción total o parcial de imágenes y textos. 3
GROUP BY
La cláusula group by de la sentencia SELECT permite agrupar las filas de una tabla por una
o varias columnas con el mismo valor y devolver un resultado resumen para cada uno de
los grupos formados.
EJEMPLO 34
Mostrar la mejor nota de cada uno de los alumnos.
Para resolver esta consulta tomaremos la tabla examen y la agruparemos por legajo, para
poder trabajar luego con cada uno de los grupos por separado y así podremos devolver
datos resumen (en este caso: max (nota)) de cada uno de los grupos (que, en este caso,
son los legajos de los alumnos).
Veamos primero la tabla examen donde están agrupados los datos por la columna leg,
para visualizar mejor la forma en que trabaja el SGBD.
© Universidad de Palermo. Prohibida la reproducción total o parcial de imágenes y textos. 4
EJEMPLO 35
Veamos qué ocurre si además del legajo quiero mostrar el nombre y apellido del alumno y
agrupar los datos solo por leg:
Este error se debe a que es indispensable tener en la cláusula GROUP BY todas las
columnas que luego se mostrarán en el SELECT y provienen de las tablas del FROM, es
decir que NO se incluyen las funciones de grupo del SELECT.
En este caso, e.leg, a.nom y a.ape son columnas de las tablas examen y alumno, en
cambio, max (nota) es una función de grupo, por lo tanto, NO debe estar en el GROUP BY.
Veamos también el error que se produce si incluimos la función de grupo en la cláusula
GROUP BY.
© Universidad de Palermo. Prohibida la reproducción total o parcial de imágenes y textos. 5
Ahora sí, entonces, luego de haber aclarado los 2 errores más comunes que se cometen
en el GROUP BY, veremos la sentencia correcta:
EJEMPLO 36
Mostrar el promedio obtenido en el año 2016 por cada uno de los alumnos junto con sus
datos personales.
En este caso, existe una condición de registro, es decir que antes de agrupar los datos y
obtener resultados de cada grupo se deberán seleccionar los registros de los exámenes
correspondientes al año 2016.
© Universidad de Palermo. Prohibida la reproducción total o parcial de imágenes y textos. 6
Hasta aquí la sintaxis de la sentencia SELECT es:
SELECT …….. obligatorio
FROM ……….. obligatorio
WHERE ………… optativo
GROUP BY………… optativo
ORDER BY……… optativo
AGRUPACIÓN POR MÚLTIPLES COLUMNAS
EJEMPLO 37
Mostrar la cantidad de exámenes que se rindieron en cada fecha y por cada una de las
materias. Ordenar el listado por fecha ascendente.
© Universidad de Palermo. Prohibida la reproducción total o parcial de imágenes y textos. 7
HAVING
Esta cláusula se emplea para seleccionar los grupos obtenidos que cumplan una
determinada condición. La condición del HAVING siempre es una condición de grupo, de la
misma manera que la condición del WHERE siempre es una condición de registro.
EJEMPLO 38
Listar las notas promedio de cada alumno que ya rindió más de 2 exámenes.
Nota: las notas promedio de cada alumno significan que se deben agrupar por legajo, es
decir, por alumno, para obtener resultados de cada alumno. Pero, a su vez, no todos los
alumnos, solo aquellos que cumplan una condición, es decir que solo quedarán los grupos
que cumplan la condición de tener más de 2 exámenes. Por lo tanto, la condición count
(nroexamen) >2 es condición de grupo y va en el having.
La sentencia, entonces, que permite mostrar esta información será:
© Universidad de Palermo. Prohibida la reproducción total o parcial de imágenes y textos. 8
EJEMPLO 39
Listar la cantidad de exámenes aprobados por cada alumno que tenga promedio > 5.
Consideraciones a tener en cuenta:
Solo necesito tener en el FROM la tabla EXAMEN.
Examen aprobado significa nota >= 4. Para saber si cumple esa condición,
debo ver qué valor tiene la columna NOTA en el registro de la tabla
EXAMEN que estoy examinando, entonces, como es condición de registro,
corresponde al WHERE.
El promedio de la nota corresponde a cada alumno, es decir que corresponde al grupo, es
el promedio de cada alumno. Entonces debo analizar si el grupo cumple la condición, por
lo tanto es condición de grupo y corresponde al HAVING.
© Universidad de Palermo. Prohibida la reproducción total o parcial de imágenes y textos. 9
Resumen
La sintaxis completa de una sentencia SELECT es:
SELECT…………….
FROM…………….
WHERE………….
GROUP BY…………
HAVING……….
ORDER BY………
Y la secuencia de ejecución que realizará el SGBD será:
1. Ejecución del FROM.
2. Seleccionar los registros que cumplan la condición del WHERE (puede ser
compuesta).
3. Armar los grupos especificados en el GROUP BY.
4. Seleccionar los grupos que cumplan la condición del HAVING (puede ser
compuesta).
5. Ordenar el resultado de manera ascendente o descendente según las
columnas especificadas en el ORDER BY de izquierda a derecha.
6. Mostrar los datos solicitados en el SELECT.
© Universidad de Palermo. Prohibida la reproducción total o parcial de imágenes y textos. 10