16th Jan 2023 7 minutos de leitura Como usar WHERE com GROUP BY em SQL Nicole Darnley sql group by where Índice A cláusula WHERE O GRUPO POR Cláusula Usando WHERE e GROUP BY juntos ONDE E GRUPO POR - Para onde ir a partir daqui 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. Tags: sql group by where