Um dos aspectos mais poderosos do SQL é a capacidade de realizar agregação de dados. Duas das ferramentas de agregação de dados SQL mais poderosas são agrupamento e totalizando . Neste guia, você aprende a agregação de dados SQL usando agrupamento e totalização.
Funções de agregação SQL
No SQL, a agregação é o processo de operação ou cálculo de um conjunto de valores. A intenção é retornar um único valor de resumo. SQL inclui várias funções agregadas muito poderosas, como
AVG()
, COUNT()
, SUM()
, MAX()
e MIN()
. Essas funções, por sua vez, são mais frequentemente encontradas em instruções SQL que implementam um GROUP BY
cláusula. No entanto, essas funções não precisam ser associadas a essa cláusula. Observação A menos que mencionado de outra forma, todos os comandos de banco de dados demonstrados neste guia funcionam bem tanto em MySQL e PostgreSQL .
Este guia usa um
CourseTaken
tabela para demonstrar funções agregadas. Na linha de comando, crie o CourseTaken
tabela. CREATE TABLE CourseTaken (
SSNumber CHAR(9) NOT NULL,
CourseId CHAR(6) NOT NULL,
NumericGrade INT NOT NULL,
YearTaken INT NOT NULL
);
O
CourseTaken
tabela contém os seguintes dados de coluna:SSNumber | CourseId | NumericGrade | Ano do ano |
---|---|---|---|
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 uma função de agregação SQL para calcular um valor de resumo único
As seções abaixo fornecem diferentes exemplos que usam funções agregadas para retornar um único valor de resumo. Todos os exemplos usam o
CourseTaken
tabela que foi criada na seção Funções Agregadas do guia. Exemplo 1:
Neste exemplo, a função agregada retorna uma nota média numérica para todos os alunos do curso
CSC101
no ano de 2022. SELECT AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101
AND YearTaken = 2022;
O SQL retorna a seguinte nota média:
Avg Grade
---------
92
Exemplo 2:
A função agregada abaixo retorna uma contagem do número de alunos que fizeram o curso
CSC101
antes do ano de 2022. SELECT COUNT(SSNumber) AS 'Student Count'
FROM CourseTaken
WHERE CourseId = 'CSC101'
AND YearTaken < 2022;
A seguinte contagem é retornada:
Student Count
---------
1
Exemplo 3:
Neste exemplo, uma função agregada é usada para obter a nota numérica máxima registrada em qualquer ano por um Aluno que está cursando
CSC101
. SELECT MAX(NumericGrade) AS 'Max Grade'
FROM CourseTaken
WHERE CourseId = 'CSC101'
A nota máxima retornada é a seguinte:
Max Grade
---------
100
Agregar dados usando funções de grupo
Os exemplos a seguir demonstram o uso do
GROUP BY
cláusula usando os dados do CourseTaken
tabela. Exemplo 1:
O exemplo abaixo determina a nota média de cada aluno para todos os cursos que eles fizeram até o momento. Para executar isso, use o SQL
Group By
cláusula para agrupar por Aluno (neste caso, o SSNumber
coluna). SELECT SSNumber, AVG(NumericGrade) AS 'Avg Grade'
FROM CourseTaken
GROUP BY SSNumber
A saída retorna a nota média de cada aluno.
+-----------+----------+
| SSNumber | Avg Grade|
+-----------+----------+
| 111111111 | 96.5 |
| 222222222 | 87.5 |
| 333333333 | 88 |
+-----------+----------+
Exemplo 2:
A função agregada abaixo encontra a nota média recebida em cada
CourseId
no CourseTaken
tabela. Para fazer isso, agrupe por CourseId
dentro de YearTaken
com o seguinte 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
Você deve ver a seguinte saída:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| POL101 | 2021 | 92 |
| CSC101 | 2022 | 92 |
| EEE101 | 2022 | 75 |
| ENG101 | 2022 | 95 |
+--------+------+-----------+
Observação O exemplo acima é um pouco mais complexo. Você agrupa por duas colunas em vez de uma (CourseId
dentro deYear
). Assim, você calcula a nota média e agrupa porCSC101
para o ano2021
separadamente da nota média paraCSC101
para o ano2022
. O cursoCSC101
para o ano2022
é uma agregação de duas linhas, enquanto todas as outras linhas Agrupar por são uma agregação de uma linha. Além disso, a partir do conceito de Pedido (Order By
cláusula) você pode exibir resultados ordenados (classificados) porCourse
dentro de um determinado ano.
Exemplo 3:
Na consulta SQL no exemplo anterior, você pode restringir o número de linhas que você opera adicionando um
WHERE
cláusula para a consulta. Por exemplo, para gerar a nota média recebida pelos alunos apenas para CourseId
CSC101
, agrupar por CourseId
dentro de YearTaken
. O seguinte código SQL pode fazer isso: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
No código SQL acima, você está adicionando uma condição (via
WHERE
cláusula) antes que a agregação do grupo real seja executada (através do GROUP BY
cláusula). A seguinte saída é retornada:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| CSC101 | 2022 | 92 |
+--------+------+-----------+
Exemplo 4:
Na consulta SQL no Exemplo 2, você pode aplicar uma condição antes que o resultado final seja retornado. Para fazer isso, use o SQL
Having
cláusula. Você pode determinar a nota média em cada CourseId
, em que a nota média agregada é maior que 90
. Você pode agrupar novamente por CourseId
dentro de YearTaken
. O seguinte código SQL pode fazer isso: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
A saída é a seguinte:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
| POL101 | 2021 | 92 |
| CSC101 | 2022 | 92 |
| ENG101 | 2022 | 95 |
+--------+------+-----------+
A linha para
CourseId
EEE101
não foi devolvido. Isso ocorre porque o Having
cláusula o filtrou após o GROUP BY
cláusula foi executada (CourseId
EEE101
a nota média de 90 é inferior a 90). Exemplo 5:
Com base no código SQL do Exemplo 3 e Exemplo 4 , você pode criar consultas de agregação que utilizam o
Where
e Having
cláusula. Por exemplo, você pode determinar os cursos que foram feitos em 2021
, em que a nota média dos cursos realizados foi maior que 93
. Aqui, o Where
cláusula filtra os resultados antes do Group By
agregação de dados é executada, e o Having
cláusula filtra os resultados retornados após o Group By
agregação de dados é executada. O seguinte código SQL pode fazer isso: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
A saída retornada é a seguinte:
+--------+------+-----------+
| Course | Year | Avg Grade |
+--------+------+-----------+
| CSC101 | 2021 | 98 |
+--------+------+-----------+
Exemplo 6:
Você pode contar o número de linhas associadas a cada
Group By
agregação em uma consulta. Com base no código SQL de exemplo anterior, você pode gerar a nota média recebida por Students
apenas para CourseId
CSC101
, agrupado por CourseId
dentro de YearTaken
. O código deve fornecer o número de alunos (contagem) associados a cada grupo. O seguinte código SQL pode fazer isso: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
O
Count(SSNumber)
no SELECT
cláusula poderia ter sido especificada como Count(*)
. A diferença entre as duas sintaxes é que Count(*)
inclui linhas que têm NULL
valores neles também. De acordo com o CourseTaken
definição da tabela acima, todas as colunas no CourseTaken
A tabela deve conter valores não nulos (o NOT NULL
atributo garante isso). O Count(SSNumber)
e Count(*)
seria funcionalmente equivalente neste exemplo. A seguinte saída é retornada:
+--------+------+-----------+-------+
| Course | Year | Avg Grade | Count |
+--------+------+-----------+-------+
| CSC101 | 2021 | 98 | 1 |
| CSC101 | 2022 | 92 | 2 |
+--------+------+-----------+-------+
Conclusão
Este guia fornece os blocos de construção para as poderosas operações de agregação de dados do SQL para agrupamento e totalização. Conforme observado, você pode restringir valores que se tornam parte desses grupos usando um
Where
cláusula em consultas antes que a agregação seja executada. Você pode filtrar linhas de resultados agrupados (após a agregação) usando o Having
cláusula nas consultas SQL.