Uno de los aspectos más poderosos de SQL es la capacidad de realizar la agregación de datos. Dos de las herramientas de agregación de datos SQL más poderosas son agrupación y totalizando . En esta guía, aprenderá la agregación de datos SQL mediante la agrupación y el total.
Funciones agregadas de SQL
En SQL, la agregación es el proceso de operar o calcular un conjunto de valores. La intención es devolver un único valor de resumen. SQL incluye varias funciones agregadas muy potentes, como AVG()
, COUNT()
, SUM()
, MAX()
y MIN()
. Estas funciones, a su vez, se encuentran con mayor frecuencia en sentencias SQL que implementan un GROUP BY
cláusula. Sin embargo, estas funciones no necesitan estar asociadas con esa cláusula.
Nota A menos que se indique lo contrario, todos los comandos de base de datos que se muestran en esta guía funcionan bien tanto en MySQL y PostgreSQL .
Esta guía utiliza un CourseTaken
tabla para demostrar funciones agregadas. Desde la línea de comando, cree el CourseTaken
mesa.
CREATE TABLE CourseTaken (
SSNumber CHAR(9) NOT NULL,
CourseId CHAR(6) NOT NULL,
NumericGrade INT NOT NULL,
YearTaken INT NOT NULL
);
El CourseTaken
la tabla contiene los siguientes datos de columna:
SSNumber | ID del curso | NumericGrade | Año tomado |
---|---|---|---|
111111111 | CSC101 | 98 | 2021 |
111111111 | ENG101 | 95 | 2022 |
222222222 | CSC101 | 100 | 2022 |
222222222 | EEE101 | 75 | 2022 |
333333333 | POL101 | 92 | 2021 |
333333333 | CSC101 | 84 | 2022 |
Usar una función agregada de SQL para calcular un valor de resumen único
Las secciones a continuación proporcionan diferentes ejemplos que usan funciones agregadas para devolver un único valor de resumen. Todos los ejemplos usan el CourseTaken
tabla que se creó en la sección Funciones agregadas de la guía.
Ejemplo 1:
En este ejemplo, la función agregada devuelve una calificación promedio numérica para todos los estudiantes que toman el curso CSC101
en el año 2022.
SELECT AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101
AND YearTaken = 2022;
SQL devuelve la siguiente calificación promedio:
Avg Grade
---------
92
Ejemplo 2:
La siguiente función agregada devuelve un recuento de la cantidad de estudiantes que tomaron el curso CSC101
antes del año 2022.
SELECT COUNT(SSNumber) AS 'Student Count'
FROM CourseTaken
WHERE CourseId = 'CSC101'
AND YearTaken < 2022;
Se devuelve el siguiente recuento:
Student Count
---------
1
Ejemplo 3:
En este ejemplo, se usa una función agregada para obtener la calificación numérica máxima registrada en cualquier año por un estudiante que toma CSC101
.
SELECT MAX(NumericGrade) AS 'Max Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101'
La calificación máxima devuelta es la siguiente:
Max Grade
---------
100
Agregar datos usando funciones de grupo
Los siguientes ejemplos demuestran el uso de GROUP BY
cláusula usando los datos del CourseTaken
mesa.
Ejemplo 1:
El siguiente ejemplo determina la calificación promedio de cada estudiante para todos los cursos que ha tomado hasta la fecha. Para ejecutar esto, use SQL Group By
cláusula para agrupar por Estudiante (en este caso, el SSNumber
columna).
SELECT SSNumber, AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY SSNumber
La salida devuelve la calificación promedio de cada estudiante.
+-----------+----------+
| SSNumber | Avg Grade|
+-----------+----------+
| 111111111 | 96.5 |
| 222222222 | 87.5 |
| 333333333 | 88 |
+-----------+----------+
Ejemplo 2:
La siguiente función agregada encuentra la calificación promedio recibida en cada CourseId
en el CourseTaken
mesa. Para hacer esto, agrupe por CourseId
dentro de YearTaken
con el siguiente código SQL:
SELECT CourseId AS 'Course', YearTaken AS 'Year',
AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken
Debería ver el siguiente resultado:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| POL101 | 2021 | 92 |
| CSC101 | 2022 | 92 |
| EEE101 | 2022 | 75 |
| ENG101 | 2022 | 95 |
+--------+------+-----------+
Nota El ejemplo anterior es un poco más complejo. Agrupa por dos columnas en lugar de una (CourseId
dentro delYear
). Por lo tanto, calcula la calificación promedio y agrupa porCSC101
para el año2021
por separado de la calificación promedio paraCSC101
para el año2022
. El cursoCSC101
para el año2022
es una agregación de dos filas, mientras que todas las demás filas Agrupar por son una agregación de una fila. Además, desde el concepto de Pedido (Order By
cláusula) puede mostrar resultados ordenados (ordenados) porCourse
dentro de un año dado.
Ejemplo 3:
A partir de la consulta SQL del ejemplo anterior, puede restringir la cantidad de filas que opera agregando un WHERE
cláusula a la consulta. Por ejemplo, para generar la calificación promedio recibida por los estudiantes solo para CourseId
CSC101
, agrupar por CourseId
dentro de YearTaken
. El siguiente código SQL puede lograr esto:
SELECT CourseId AS 'Course', YearTaken AS 'Year',
AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101'
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken
En el código SQL anterior, está agregando una condición (a través de WHERE
cláusula) antes de que se realice la agregación del grupo real (a través de GROUP BY
cláusula).
Se devuelve el siguiente resultado:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| CSC101 | 2022 | 92 |
+--------+------+-----------+
Ejemplo 4:
A partir de la consulta SQL del Ejemplo 2, puede aplicar una condición antes de que se devuelva el resultado final. Para lograr esto, use SQL Having
cláusula. Puede determinar la calificación promedio en cada CourseId
, donde la calificación promedio agregada es superior a 90
. Puede volver a agrupar por CourseId
dentro de YearTaken
. El siguiente código SQL puede lograr esto:
SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
AVG(NumericGrade) AS ‘Avg Grade’
FROM CourseTaken
GROUP BY CourseId, YearTaken
HAVING AVG(NumericGrade) > 90
ORDER BY CourseId, YearTaken
La salida es la siguiente:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| POL101 | 2021 | 92 |
| CSC101 | 2022 | 92 |
| ENG101 | 2022 | 95 |
+--------+------+-----------+
La fila para CourseId
EEE101
no fue devuelto. Esto se debe a que Having
la cláusula lo filtró después de GROUP BY
se ejecutó la cláusula (CourseId
EEE101
la calificación promedio de está por debajo de 90).
Ejemplo 5:
Basándose en el código SQL del Ejemplo 3 y Ejemplo 4 , puede crear consultas de agregación que utilicen tanto el Where
y Having
cláusula. Por ejemplo, puede determinar los cursos que se tomaron en 2021
, donde la calificación promedio de los cursos tomados fue superior a 93
. Aquí, el Where
La cláusula filtra los resultados antes de Group By
se realiza la agregación de datos, y el Having
La cláusula filtra los resultados devueltos después de Group By
se realiza la agregación de datos. El siguiente código SQL puede lograr esto:
SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
AVG(NumericGrade) AS ‘Avg Grade’
FROM CourseTaken
WHERE YearTaken = 2021
GROUP BY CourseId, YearTaken
HAVING AVG(NumericGrade) > 93
ORDER BY CourseId
El resultado devuelto es el siguiente:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
+--------+------+-----------+
Ejemplo 6:
Puede contar el número de filas asociadas con cada Group By
agregación en una consulta. Sobre la base del código SQL de ejemplo anterior, puede generar la calificación promedio recibida por Students
solo para CourseId
CSC101
, agrupados por CourseId
dentro de YearTaken
. El código debe proporcionar el número de estudiantes (recuento) asociados con cada grupo. El siguiente código SQL puede lograr esto:
SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
AVG(NumericGrade) AS ‘Avg Grade’,
Count(SSNumber) AS ‘Count’
FROM CourseTaken
WHERE CourseId = ‘CSC101’
GROUP BY CourseId, YearTaken
ORDER BY CourseId, YearTaken
El Count(SSNumber)
en el SELECT
la cláusula podría haberse especificado como Count(*)
. La diferencia entre las dos sintaxis es que Count(*)
incluye filas que tienen NULL
valores en ellos también. Según el CourseTaken
definición de la tabla anterior, todas las columnas en el CourseTaken
la tabla debe contener valores no nulos (el NOT NULL
atributo lo asegura). El Count(SSNumber)
y Count(*)
sería funcionalmente equivalente en este ejemplo.
Se devuelve el siguiente resultado:
+--------+------+-----------+-------+
| Course | Year | Avg Grade | Count |
+--------+------+-----------+-------+
| CSC101 | 2021 | 98 | 1 |
| CSC101 | 2022 | 92 | 2 |
+--------+------+-----------+-------+
Conclusión
Esta guía proporciona los componentes básicos para las potentes operaciones de agregación de datos de SQL para agrupar y totalizar. Como se indicó, puede restringir los valores que pasan a formar parte de estos grupos utilizando un Where
cláusula en las consultas antes de que se realice la agregación. Puede filtrar filas de resultados agrupados (después de realizar la agregación) usando el Having
cláusula en las consultas SQL.