Questão de Banco de Dados — Consultas e Comandos em SQL — VUNESP 2023
Banco de Dados›Consultas e Comandos em SQL
Código
vu195612
Banca
VUNESP
Órgão
TJ RS
Ano
2023
Cargo
TTI ( )
Considere um banco de dados relacional MySQL versão 5.7 contendo uma tabela "Processo", que apresenta as colunas "ID" do tipo INT, "ID_Cartorio", também do tipo INT e que faz referência ao cartório no qual tramitou o processo, e "Data_Julgamento" do tipo DATE. Não há valores nulos nessa tabela. Foi solicitado a um técnico do TJ-RS fazer uma busca dos cartórios que possuem mais do que dois processos. Assinale a alternativa que apresenta o comando SQL usado para a obtenção da resposta a essa solicitação.
ASELECT ID_Cartorio FROM Processo WHERE COUNT(*) > 2;
BSELECT ID_Cartorio FROM Processo HAVING Processo.ID_Cartorio > 2;
CSELECT ID_Cartorio FROM Processo GROUP BY Processo.ID_Cartorio HAVING Processo.ID_ Cartorio > 2;
DSELECT ID_Cartorio FROM Processo GROUP BY Processo.ID_Cartorio HAVING COUNT(*) > 2;
ESELECT ID_Cartorio FROM Processo WHERE COUNT(Processo.ID_Cartorio) > 2;
Revelar gabarito e comentário▾
GabaritoD — SELECT ID_Cartorio FROM Processo GROUP BY
Processo.ID_Cartorio HAVING COUNT(*) > 2;
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Consultas SQL: agrupamento e filtro com GROUP BY e HAVING
Gabarito: letra D. Para listar os cartórios com mais de dois processos, é preciso agrupar os registros por ID_Cartorio e, em seguida, filtrar os grupos cuja contagem de linhas seja maior que 2 — exatamente o que a alternativa D faz com GROUP BY + HAVING COUNT(*) > 2. A cláusula WHERE não pode usar funções de agregação como COUNT, e o HAVING é o filtro aplicado após o agrupamento.
A consulta pedida envolve uma função de agregação (COUNT) aplicada a grupos de linhas. Quando precisamos resumir informações por categoria — aqui, contar processos por cartório —, o SQL exige a cláusula GROUP BY, que divide as linhas da tabela em grupos com base nos valores de uma ou mais colunas. No nosso caso, GROUP BY Processo.ID_Cartorio cria um grupo para cada cartório distinto.
A grande pegadinha está na diferença entre WHERE e HAVING. O WHERE filtra linhas individuais antes do agrupamento; ele não pode conter funções de agregação como COUNT(*). Já o HAVING filtra grupos inteiros depois que o GROUP BY os formou, e é nele que as funções de agregação podem aparecer. A ordem lógica de execução de uma consulta com agrupamento é: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. Isso significa que o WHERE já descartou linhas antes de o GROUP BY agrupar, e o HAVING decide quais grupos aparecem no resultado final.
Vamos aplicar isso ao caso concreto: imagine que a tabela Processo tenha 10 processos, sendo 3 do cartório 1, 2 do cartório 2 e 5 do cartório 3. O GROUP BY ID_Cartorio formaria três grupos. O HAVING COUNT(*) > 2 manteria apenas os grupos com contagem maior que 2 — ou seja, os cartórios 1 (3 processos) e 3 (5 processos). O resultado seria uma lista com os IDs 1 e 3.
A alternativa correta precisa, portanto, combinar GROUP BY com HAVING COUNT(*) > 2. As demais alternativas erram ao usar WHERE com agregação (impossível), ao comparar o ID do cartório com 2 (em vez de contar processos), ou ao aplicar HAVING sem GROUP BY (o que não faz sentido). Guarde essa estrutura: agrupamento + filtro de grupo = GROUP BY + HAVING com função de agregação.
1FROM
2WHERE (linhas)
3GROUP BY
4HAVING (grupos)
5SELECT
6ORDER BY
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Usa WHERE COUNT(*) > 2. O WHERE filtra linhas individuais antes do agrupamento e não aceita funções de agregação como COUNT(*). Essa sintaxe gera erro de execução no MySQL. O filtro sobre contagens só pode ser feito com HAVING, após o GROUP BY.
Alternativa B — ❌ Incorreta
Usa HAVING Processo.ID_Cartorio > 2semGROUP BY. O HAVING só faz sentido quando há agrupamento; sem GROUP BY, a consulta trata a tabela inteira como um único grupo, e a condição ID_Cartorio > 2 não é uma agregação — ela não filtra grupos, e a sintaxe é inválida. Além disso, a intenção é contar processos, não comparar o ID do cartório com 2.
Alternativa C — ❌ Incorreta
Tem GROUP BY Processo.ID_Cartorio, mas o HAVING compara Processo.ID_Cartorio > 2 em vez de contar processos. O HAVING deve filtrar com base em uma função de agregação (como COUNT(*)), não em um valor de coluna comum. Essa consulta retornaria os cartórios cujo ID é maior que 2, não os que têm mais de dois processos.
Alternativa D — ✅ Correta ⟵ GABARITO
A sintaxe está perfeita: GROUP BY Processo.ID_Cartorio agrupa os processos por cartório, e HAVING COUNT(*) > 2 mantém apenas os grupos com mais de duas linhas (processos). O SELECT ID_Cartorio exibe o ID de cada cartório que atende à condição. É exatamente a consulta solicitada.
Alternativa E — ❌ Incorreta
Usa WHERE COUNT(Processo.ID_Cartorio) > 2. Assim como na alternativa A, o WHERE não pode conter funções de agregação — isso gera erro. Além disso, falta o GROUP BY, que é indispensável para contar processos por cartório.