Cláusula SQL GROUP BY e HAVING com exemplos

Índice:

Anonim

O que é SQL Group por cláusula?

A cláusula GROUP BY é um comando SQL usado para agrupar linhas que possuem os mesmos valores . A cláusula GROUP BY é usada na instrução SELECT. Opcionalmente, é usado em conjunto com funções agregadas para produzir relatórios resumidos do banco de dados.

É isso que ele faz, resumindo os dados do banco de dados.

As consultas que contêm a cláusula GROUP BY são chamadas de consultas agrupadas e retornam apenas uma única linha para cada item agrupado.

Sintaxe SQL GROUP BY

Agora que sabemos o que é a cláusula SQL GROUP BY, vamos examinar a sintaxe de um grupo básico por consulta.

SELECT statements… GROUP BY column_name1[,column_name2,… ] [HAVING condition];

AQUI

  • "Instruções SELECT…" é a consulta de comando SQL SELECT padrão.
  • " GROUP BY column_name1" é a cláusula que realiza o agrupamento com base em column_name1.
  • "[, nome_coluna2,…]" é opcional; representa outros nomes de coluna quando o agrupamento é feito em mais de uma coluna.
  • "[TENDO condição]" é opcional; é usado para restringir as linhas afetadas pela cláusula GROUP BY. É semelhante à cláusula WHERE.

Agrupamento usando uma única coluna

Para ajudar a entender o efeito da cláusula SQL Group By, vamos executar uma consulta simples que retorna todas as entradas de gênero da tabela de membros.

SELECT `gender` FROM `members` ;
 
gender
Female
Female
Male
Female
Male
Male
Male
Male
Male

Suponha que desejamos obter os valores únicos para gêneros. Podemos usar a seguinte consulta -

SELECT `gender` FROM `members` GROUP BY `gender`;

Executar o script acima no ambiente de trabalho MySQL no Myflixdb nos dá os seguintes resultados.

 
gender
Female
Male

Observe que apenas dois resultados foram retornados. Isso ocorre porque temos apenas dois tipos de gênero: Masculino e Feminino. A cláusula GROUP BY no SQL agrupou todos os membros "Masculino" e retornou apenas uma única linha para ele. Fez o mesmo com os membros "Femininos".

Agrupamento usando várias colunas

Suponha que desejamos obter uma lista de category_id de filmes e os anos correspondentes em que foram lançados.

Vamos observar a saída desta consulta simples

SELECT `category_id`,`year_released` FROM `movies` ;
 
category_id year_released
1 2011
2 2008
NULL 2008
NULL 2010
8 2007
6 2007
6 2007
8 2005
NULL 2012
7 1920
8 NULL
8 1920

O resultado acima tem muitas duplicatas.

Vamos executar a mesma consulta usando group by em SQL -

SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;

Executar o script acima no ambiente de trabalho MySQL no myflixdb nos dá os seguintes resultados mostrados abaixo.

 
category_id year_released
NULL 2008
NULL 2010
NULL 2012
1 2011
2 2008
6 2007
7 1920
8 1920
8 2005
8 2007

A cláusula GROUP BY opera no id da categoria e no ano liberado para identificar linhas exclusivas em nosso exemplo acima.

Se o id da categoria for o mesmo, mas o ano de lançamento for diferente, uma linha será tratada como única. Se o id da categoria e o ano de lançamento forem iguais para mais de uma linha, ele será considerado uma duplicata e apenas uma linha é mostrado.

Funções de agrupamento e agregação

Suponha que queremos o número total de homens e mulheres em nosso banco de dados. Podemos usar o seguinte script mostrado abaixo para fazer isso.

SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;

Executar o script acima no ambiente de trabalho MySQL no myflixdb nos dá os seguintes resultados.

 
gender COUNT('membership_number')
Female 3
Male 5

Os resultados mostrados abaixo são agrupados por cada valor de gênero exclusivo postado e o número de linhas agrupadas é contado usando a função de agregação COUNT.

Restringindo os resultados da consulta usando a cláusula HAVING

Nem sempre queremos realizar agrupamentos em todos os dados de uma determinada tabela. Haverá momentos em que desejaremos restringir nossos resultados a um determinado critério. Nesses casos, podemos usar a cláusula HAVING

Suponha que desejamos saber todos os anos de lançamento da categoria de filme id 8. Usaríamos o seguinte script para obter nossos resultados.

SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;

A execução do script acima no ambiente de trabalho MySQL no Myflixdb nos dá os seguintes resultados mostrados abaixo.

 
movie_id title director year_released category_id
9 Honey mooners John Schultz 2005 8
5 Daddy's Little Girls NULL 2007 8

Observe que apenas filmes com id de categoria 8 foram afetados por nossa cláusula GROUP BY.

Resumo

  • A cláusula GROUP BY SQL é usada para agrupar linhas com os mesmos valores.
  • A cláusula GROUP BY é usada junto com a instrução SQL SELECT.
  • A instrução SELECT usada na cláusula GROUP BY só pode ser usada para conter nomes de colunas, funções agregadas, constantes e expressões.
  • A cláusula SQL Having é usada para restringir os resultados retornados pela cláusula GROUP BY.
  • A cláusula MYSQL GROUP BY é usada para coletar dados de vários registros e conjunto de registros retornados por uma ou mais colunas.