Questão de Banco de Dados — SQL — Quadrix 2024
- Código
- qg354536
- Banca
- Quadrix
- Órgão
- NOVACAP
- Ano
- 2024
- Nível
- Superior
- Cargo
- Analista de Sistemas - Manutenção/Sustentação
- CCerto
- EErrado
GabaritoE — Errado
Esta questão depende de uma tabela-base (SERVICO) que não está disponível neste material. O raciocínio abaixo explica o método de resolução; confira os dados na tabela original da prova.
Gabarito: ERRADO (letra E). A consulta SELECT ESPEC_SERV, COUNT(*) FROM SERVICO GROUP BY ESPEC_SERV HAVING COUNT(*) > 1 agrupa os registros por ESPEC_SERV e retorna apenas os grupos com mais de uma ocorrência, exibindo cada valor de ESPEC_SERV uma única vez, acompanhado da contagem. A lista apresentada no enunciado mostra "CONSTRUÇÃO DE BOCA DE LOBO" duplicada, o que contraria o comportamento do GROUP BY — cada grupo aparece uma única vez no resultado. Portanto, a afirmação está incorreta.
A cláusula GROUP BY é um dos pilares da consulta agregada em SQL. Ela transforma as linhas da tabela em grupos, onde cada grupo reúne todas as linhas que possuem o mesmo valor na(s) coluna(s) especificada(s). A partir daí, funções de agregação como COUNT(*), SUM(), AVG(), MAX() e MIN() operam sobre cada grupo, produzindo um único valor por grupo. O resultado final tem, no máximo, uma linha para cada grupo — nunca linhas repetidas para o mesmo valor de agrupamento.
A cláusula HAVING é o filtro que se aplica depois da agregação, ou seja, ela seleciona quais grupos aparecerão no resultado, com base em uma condição que pode envolver funções de agregação (como COUNT(*) > 1). É diferente da cláusula WHERE, que filtra linhas individuais antes do agrupamento. Essa distinção é crucial: WHERE não pode usar funções de agregação, pois elas ainda não foram calculadas; HAVING só pode ser usado com GROUP BY e avalia condições sobre os grupos já formados.
Vamos aplicar o método à consulta da questão. Suponha que a tabela SERVICO tenha os seguintes dados (valores ilustrativos, pois a tabela original não foi fornecida):
ESPEC_SERV |
|---|
REPOSIÇÃO DE ACESSÓRIOS |
CONSTRUÇÃO DE BOCA DE LOBO |
CONSTRUÇÃO DE BOCA DE LOBO |
VISTORIAS |
O GROUP BY ESPEC_SERV criaria três grupos: um para "REPOSIÇÃO DE ACESSÓRIOS" (1 linha), um para "CONSTRUÇÃO DE BOCA DE LOBO" (2 linhas) e um para "VISTORIAS" (1 linha). O HAVING COUNT(*) > 1 manteria apenas o grupo com mais de uma linha, ou seja, "CONSTRUÇÃO DE BOCA DE LOBO". O resultado seria:
ESPEC_SERV | COUNT(*) |
|---|---|
CONSTRUÇÃO DE BOCA DE LOBO | 2 |
Observe que o valor aparece uma única vez, com a contagem 2 ao lado. A lista do enunciado, por outro lado, mostra "CONSTRUÇÃO DE BOCA DE LOBO" duas vezes, como se fossem duas linhas separadas, e ainda inclui "REPOSIÇÃO DE ACESSÓRIOS" e "VISTORIAS", que não atendem à condição COUNT(*) > 1 (a menos que a tabela original tenha mais de uma ocorrência desses valores — o que não é indicado). A lista apresentada parece ser a listagem das linhas da tabela que possuem esses valores, não o resultado de um GROUP BY com HAVING.
A pegadinha da banca está em confundir o resultado de um GROUP BY (que agrupa e resume) com uma simples listagem de linhas. O candidato que não domina o conceito de agrupamento pode achar que a consulta retorna todas as linhas cujo ESPEC_SERV aparece mais de uma vez, mas o SQL agrupa e mostra cada valor uma única vez, com a contagem.
Guarde a fronteira entre WHERE e HAVING: WHERE filtra linhas antes de agrupar; HAVING filtra grupos depois de agrupar. E lembre-se: GROUP BY nunca repete o valor da coluna de agrupamento no resultado — cada grupo gera uma única linha.
A afirmação diz que a consulta mostrará a lista com "REPOSIÇÃO DE ACESSÓRIOS", "CONSTRUÇÃO DE BOCA DE LOBO" (duplicada) e "VISTORIAS". Isso está errado por dois motivos:
Duplicidade indevida: o GROUP BY ESPEC_SERV garante que cada valor de ESPEC_SERV apareça uma única vez no resultado. A lista mostra "CONSTRUÇÃO DE BOCA DE LOBO" duas vezes, o que é impossível em um agrupamento correto.
Filtro HAVING COUNT(*) > 1: apenas os grupos com mais de uma ocorrência seriam exibidos. Se "REPOSIÇÃO DE ACESSÓRIOS" e "VISTORIAS" aparecem na lista, isso indica que cada um teria mais de uma ocorrência na tabela — o que não é afirmado no enunciado. A lista parece ser uma amostra das linhas da tabela, não o resultado da consulta agregada.
O resultado correto da consulta seria uma tabela com uma coluna ESPEC_SERV e uma coluna COUNT(*), contendo apenas os valores que aparecem mais de uma vez, cada um em uma única linha. A lista do enunciado não corresponde a esse formato.
Gabarito: ERRADO (letra E).
Link permanente: /questoes/qg354536