Voltar para a lista de artigos Artigos
7 minutos de leitura

Como usar WHERE com GROUP BY em SQL

Neste artigo, discutiremos como combinar as cláusulas WHERE e GROUP BY em SQL Se você estiver escrevendo SQL diariamente, você perceberá rapidamente a freqüência com que tanto as cláusulas WHERE como GROUP BY são usadas. WHERE é uma parte essencial da maioria das consultas. Ele permite que você filtre grandes conjuntos de dados apenas para as peças em que está interessado. GROUP BY é uma das ferramentas mais poderosas que um analista tem ao agregar dados. Ao final deste artigo, você entenderá como usar efetivamente estas duas cláusulas e ao mesmo tempo evitar as armadilhas comuns.

Quando se trata de escrever SQL, considere cada cláusula (SELECT, WHERE, GROUP BY, etc.) como uma ferramenta separada. Conforme você aprende mais sintaxe SQL, você adiciona essa ferramenta ao seu kit de ferramentas. Como você pode imaginar, um mecânico com apenas algumas poucas ferramentas não será muito eficaz. Eu não recomendaria que você levasse seu carro a alguém com apenas um punhado de ferramentas. É o mesmo com a análise de dados. Quanto mais ferramentas você tiver à sua disposição, mais rápida e eficientemente você poderá analisar diferentes conjuntos de dados.

Uma das formas mais abrangentes de adquirir ferramentas SQL é através de nosso curso interativo SQL para Iniciantes. Ele tem 129 exercícios e abrange tanto as habilidades SQL básicas como intermediárias, equipando-o com tudo o que você precisa aprender para se tornar um analista de dados eficaz.

Vamos começar dando uma olhada em profundidade em WHERE e GROUP BY separadamente. Após termos estabelecido este conhecimento fundamental, combinaremos os dois e liberaremos todo o seu poder.

A cláusula WHERE

Como dito anteriormente, a cláusula WHERE é usada para filtrar um conjunto de dados e retornar somente os registros que correspondem a alguns critérios especificados. Considere o seguinte conjunto de dados, que inclui as populações dos países para 2022.

Para fins ilustrativos, diremos que estes dados estão alojados em uma tabela chamada world_populations e inclui apenas os 10 principais países mais populosos. Vamos dar uma olhada nestes dados correndo:

SELECT *
FROM world_populations

Aqui está o resultado:

countrypopulationyearly_changenet_changemed_ageurban_pop_pctworld_share
China1,439,323,7760.00395,540,09038.61.1847
India1,380,004,3850.009913,586,63128.35.1770
United States331,002,6510.00591,937,73438.83.0425
Indonesia273,523,615.01072,898,04730.56.0351
Pakistan220,892,340.024,327,02223.35.0283
Brazil212,559,41700721,509,89033.88.0273
Nigeria206,139,589.02585,175,99018.52.0264
Bangladesh164,689,383.01011,643,22228.39.0211
Russia145,934,462.000462,20640.74.0187
Mexico128,932,753.01061,357,22429.84.0165

OK, já temos nossos dados. Agora vamos adicionar alguns filtros.

Exemplo #1

Em nosso primeiro exemplo, queremos ver apenas países onde a população é maior que 200 milhões. Conseguiremos isso através da seguinte consulta:

SELECT *
FROM world_populations
WHERE population > 200000000

E o resultado:

countrypopulationyearly_changenet_changemed_ageurban_pop_pctworld_share
China14393237760.0039554009038.61.1847
India13800043850.00991358663128.35.1770
United States3310026510.0059193773438.83.0425
Indonesia273523615.0107289804730.56.0351
Pakistan220892340.02432702223.35.0283
Brazil2125594170.72%15098903388%2.73%
Nigeria2061395892.58%51759901852%2.64%

Podemos ver que a cláusula WHERE filtrou Bangladesh, Rússia e México porque suas populações ficam abaixo do limiar estabelecido em nossa consulta.

Exemplo nº 2

A cláusula WHERE também pode suportar múltiplos filtros. Vamos listar apenas os países que viram uma mudança anual positiva no número de migrantes e onde pelo menos 80% da população vivia em áreas urbanas. Note que usamos AND na cláusula WHERE para conectar estas duas condições:

SELECT *
FROM world_populations
WHERE migrants > 0
  AND urban_pop_pct > .80

Esta consulta retorna:

countrypopulationyearly_changenet_changemed_ageurban_pop_pctworld_share
United States3310026510.0059193773438.83.0425
Brazil2125594170.0072150989033.88.0273

Não há limite para a quantidade de filtragem que você pode fazer em uma cláusula WHERE. Para mais detalhes, consulte nosso Guia Completo da Cláusula SQL WHERE

O GRUPO POR Cláusula

Para entender GROUP BY, vamos utilizar um conjunto de dados diferente chamado transactions. Ele contém dados transacionais para um varejista on-line:

DescriptionProductCategoryQuantityUnitPriceCustomerID
KNITTED UNION FLAG HOT WATER BOTTLEKitchen63.3917850
POPPY'S PLAYHOUSE BEDROOMToys62.117850
IVORY KNITTED MUG COSYKitchen61.6513047
BOX OF VINTAGE JIGSAW BLOCKSToys34.9513047
RED COAT RACK PARIS FASHIONClothing34.9513047
YELLOW COAT RACK PARIS FASHIONClothing34.9513047
BLUE COAT RACK PARIS FASHIONClothing34.9513047

Exemplo #1

O operador GROUP BY é usado para agregar dados agrupando registros que compartilham o mesmo valor em um campo especificado. Para responder à pergunta: "Quantos itens foram vendidos em cada categoria de produto?", faríamos a seguinte consulta:

SELECT 
  productCategory,
  SUM(quantity) as quantity
FROM transactions 
GROUP BY productCategory

Aqui estão os resultados:

ProductCategoryQuantity
Kitchen12
Toys9
Clothing9

Há dois produtos na categoria de produtos de cozinha: UNIDADES KNITTED BOTTLE DE ÁGUA QUENTE E CUSTO DE MUGEM IVORY KNITTED. Cada um destes produtos tem uma quantidade de 6; portanto, a soma total para a categoria de produtos de cozinha é de 12.

Há dois produtos na categoria de produtos de brinquedo. POPPY'S PLAYHOUSE BEDROOM tem uma quantidade de 6 e BOX OF VINTAGE JIGSAW BLOCKS tem uma quantidade de 3, para uma soma total de 9.

Finalmente, há três produtos na categoria de vestuário, cada um com uma quantidade de 3, o que eleva a soma total da categoria de vestuário para 9.

Não passaremos por todos eles, mas há muitos tipos de agregações disponíveis para o analista de dados. Estes incluem SUM(), AVG(), COUNT(), MEDIAN(), MIN(), e MAX(). Mais informações podem ser encontradas no artigo Como usar as funções agregadas na cláusula WHERE.

Exemplo nº 2

E se quisermos agregar quantidades para cada categoria de produto e cliente? Podemos GROUP BY múltiplas colunas:

SELECT 
  customerId,
  productCategory,
  SUM(quantity) as quantity
FROM transactions 
GROUP BY customerId, productCategory

E este é o resultado:

CustomerIDProductCategoryQuantity
17850Kitchen6
17850Toys6
13047Kitchen6
13047Toys3
13047Clothing9

Podemos ver que há uma fila para cada combinação de cliente e categoria de produto; agora sabemos quantos itens de cada categoria cada cliente comprou.

Para mais informações sobre GROUP BY, veja Utilizando GROUP BY em SQL e GROUP BY em SQL Explained

.

Usando WHERE e GROUP BY juntos

Agora que lançamos as bases, vamos combinar WHERE e GROUP BY juntos. É importante lembrar que a cláusula WHERE vai filtrar o conjunto de dados antes que a cláusula GROUP BY seja avaliada. Além disso, a cláusula WHERE virá sempre antes do GROUP BY. Se você colocá-la depois, a consulta retornará um erro.

Exemplo #1

Considere o mesmo conjunto de dados e pense em como responderíamos à pergunta "Qual é o preço unitário médio dos produtos de cozinha e brinquedos"?

Primeiro precisaremos filtrar para produtos de cozinha e brinquedos. Em seguida, vamos calcular o preço unitário médio. Aqui está a pergunta:

SELECT
  productCategory,
  AVG(UnitPrice) as AvgUnitPrice
FROM transactions 
WHERE productCategory in(‘Kitchen’, ‘Toys’)
GROUP BY productCategory

E o resultado é:

ProductCategoryAvgUnitPrice
Kitchen2.52
Toys3.05

O preço unitário médio é computado apenas para produtos de cozinha e brinquedos. Todas as outras categorias são filtradas para fora da consulta.

Exemplo nº 2

Agora vamos considerar como obter a quantidade total de produtos por categoria onde o preço unitário médio é maior do que 3. Para isso, nós correríamos:

SELECT
  productCategory,
  SUM(quantity) as quantity
FROM transactions 
WHERE unitPrice > 3
GROUP BY productCategory

Neste exemplo, os agregados são computados nas filas filtradas. Obtemos o seguinte resultado:

ProductCategoryQuantity
Kitchen6
Toys3
Clothing9

Como somente os produtos KNITTED UNION FLAG HOT WATER BOTTLE, BOX OF VINTAGE JIGSAW BLOCKS, RED COAT RACK PARIS FASHION, YELLOW COAT RACK PARIS FASHION e BLUE COAT RACK PARIS FASHION têm preços unitários superiores a 3, esses são os únicos produtos incluídos na agregação.

Se excluíssemos a cláusula WHERE, obteríamos os seguintes resultados:

ProductCategoryQuantity
Kitchen12
Toys9
Clothing9

Aqui vemos que as quantidades de todos os produtos, independentemente do preço unitário, são totalizadas. A quantidade total é diferente para todos os produtos em relação aos produtos com um preço unitário superior a 3.

Exemplo #3

E se quisermos filtrar por uma coluna agregada? Este é o trabalho da cláusula HAVING. Não se pode colocar uma agregação na cláusula WHERE. A cláusula HAVING é utilizada em vez de WHERE quando se filtra com base em funções agregadas. Podemos ilustrar isto com outro exemplo. Vamos continuar com o exemplo acima e filtrar os resultados por categorias de produtos onde o preço unitário médio é maior que 3. Para conseguir isto, escreveríamos:

SELECT
  productCategory 
  AVG(UnitPrice) as AvgUnitPrice
FROM transactions 
WHERE productCategory in (‘Kitchen’, ‘Toys’)
GROUP BY productCategory
HAVING AVG(UnitPrice) > 3

Resultado:

ProductCategoryAvgUnitPrice
Toys3.05

A primeira coisa que está acontecendo é que a cláusula WHERE limita os dados apenas às categorias de cozinha e produto. O GROUP BY então agrega o preço unitário médio para cada categoria. Finalmente, a cláusula HAVING filtra ainda mais os resultados para incluir apenas as categorias de produtos com um preço unitário médio maior que 3

.

Se removêssemos a cláusula HAVING, veríamos que tanto as categorias de cozinha quanto as de brinquedos seriam vistas no resultado. Entretanto, como o preço unitário médio dos itens de cozinha é inferior a 3, ele é filtrado quando adicionamos a cláusula HAVING

.

Para mais exemplos, leia nosso artigo sobre HAVING vs. WHERE em SQL.

ONDE E GRUPO POR - Para onde ir a partir daqui

Ótimo trabalho! Você adquiriu os conhecimentos fundamentais necessários para combinar as cláusulas WHERE e GROUP BY em SQL. Você foi apresentado à diferença entre WHERE e HAVING. Mais importante ainda, você pode combinar todas estas três cláusulas para filtrar e agregar dados para atender às suas necessidades.

Você adicionou mais duas ferramentas ao seu kit de ferramentas e está pronto para utilizá-las. Uma ótima maneira de reforçar estes aprendizados é fazer nosso curso interativo SQL para Iniciantes. A prática torna perfeito!

Além disso, não deixe de conferir todos os nossos outros grandes artigos.