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.