Q:

Group By resultados diferentes

Olá, tenho uma duvida se alguém puder me ajudar sobre SQL.
Eu conheço a clausula Group By, até aonde sei ela agrupar dados semelhantes.
Mas eu entendo que ele deveria agrupar mas no script abaixo ele quanto tem o group by mostra linhas e sem o group by ele mostra apenas uma linhas.
Ele não era so para agrupar, achei que ele serviria para algo mais estético!!!
Com Group By
select p.descricao
from projeto p
join depto d on p.cod_depto = d.cod_depto 
join empregado e on e.cod_depto = d.cod_depto
group by p.descricao 
having count(e.mat)>1;

Sem Group By
select p.descricao
from projeto p
join depto d on p.cod_depto = d.cod_depto 
join empregado e on e.cod_depto = d.cod_depto
having count(e.mat)>1;

A:

Na segunda query você está utilizando o HAVING para filtrar. Mas o HAVING é para realizar filtros após o GROUP BY. Portanto nesse caso ele está assumindo que é para fazer o agrupamento sem nenhuma condição, reduzindo tudo para um único registro.
O recomendado na segunda query é a utilização do WHERE, que filtra os resultados antes do GROUP BY.

A:

O problema na sua query não é o GROUP BY e sim o HAVING.
O GROUP BY serve para agrupar, o HAVING faz uma restrição baseada em alguma função agregada.
No caso da sua segunda query você está filtrando todos os resultados que tem COUNT maior que 2, porém como não houve agrupamento, portanto um agrupamento implícito é considerado.
Traduzindo a sua primeira query: Busque a descrição de todos os projetos que tem ao menos 2 empregados cadastrados nos departamentos relacionados a ele.
Traduzindo a sua segunda query: Busque a descrição de todos os projetos que tem ao menos 1 registro na mesma linha, porém considere a junção de todas elas.
Percebe como a segunda query não faz sentido por conta da restrição? Pois bem, ela está incorreta.

