Expressões de tabela GROUP BY e HAVING

Depois de passar o filtro WHERE, a tabela de entrada derivada pode estar sujeito a agrupamento, utilizando a cláusula GROUP BY, e a eliminação das linhas agrupadas usando a cláusula HAVING.

A cláusula GROUP BY divide as linhas retornadas da instrução SELECT em grupos. Para cada grupo, você pode aplicar uma função agregada, por exemplo, para calcular a soma de itens ou contar o número de itens nos grupos.

A declaração a seguir ilustra a sintaxe da cláusula GROUP BY:

SELECT lista_de_seleção
    FROM ...
    [WHERE ...]
    GROUP BY referência_a_coluna_de_agrupamento [, referência_a_coluna_de_agrupamento]...

A cláusula GROUP BY é utilizada para agrupar as linhas em uma tabela que compartilham os mesmos valores em todas as colunas listadas. A ordem em que as colunas são listadas não importa. O efeito é combinar cada conjunto de linhas que compartilham valores comuns em uma linha de grupo que seja representativo de todas as linhas no grupo. Isto é feito para eliminar a redundância na saída, e / ou agregados de computação que se aplicam a estes grupos.

Exemplo:

Consulta simples em uma tabela.

SELECT * FROM tabela;

Resultado:

 x | y
---+---
 a | 3
 c | 2
 b | 5
 a | 1

(4 registros)

Agora uma consulta usando GROUP BY.

SELECT x
FROM tabela
GROUP BY x;

Resultado:

 x
---
 a
 b
 c

(3 registros)

Na segunda consulta não poderia ser escrito SELECT * FROM teste1 GROUP BY x, porque não existe um valor único da coluna y que poderia ser associado com cada grupo. As colunas agrupadas podem ser referenciadas na lista de seleção, desde que possuam um valor único em cada grupo.

De modo geral, se uma tabela for agrupada as colunas que não são usadas nos agrupamentos não podem ser referenciadas, exceto nas expressões de agregação. Um exemplo de expressão de agregação é:

SELECT x, sum(y)
FROM tabela
GROUP BY x;

Resultado:

 x | sum
---+-----
 a | 4
 b | 5
 c | 2

(3 registros)

No SQL estrito, a cláusula GROUP BY somente pode agrupar pelas colunas da tabela de origem, mas o PostgreSQL estende esta funcionalidade para permitir o GROUP BY agrupar pelas colunas da lista de seleção. O agrupamento por expressões de valor, em vez de nomes simples de colunas, também é permitido.

Se uma tabela for agrupada utilizando a cláusula GROUP BY, mas houver interesse em alguns grupos apenas, pode ser utilizada a cláusula HAVING, de forma parecida com a cláusula WHERE, para eliminar grupos da tabela agrupada. A sintaxe é:

SELECT lista_de_seleção
    FROM ...
    [WHERE ...]
    GROUP BY  ...
    HAVING expressão_booleana

As expressões na cláusula HAVING podem fazer referência tanto a expressões agrupadas quanto a não agrupadas (as quais necessariamente envolvem uma função de agregação).

Exemplo:

SELECT x, sum(y)
FROM tabela
GROUP BY x
HAVING sum(y) > 3;

Resultado:

 x | sum
---+-----
 a | 4
 b | 5

(2 registros)

Neste tutorial, mostramos-lhe como usar no PostgreSQL, a cláusula GROUP BY para dividir um conjunto de resultados em grupos, e a cláusula HAVING para aplicar um filtro a esses grupos.

Comentários