Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2023
Banco de Dados›Consultas e Comandos em SQL
Código
qa537588
Banca
FUNDATEC
Órgão
IFFAR
Ano
2023
Cargo
Tec ( )
Figura 2 – Tabelas “Cargo” e “Funcionário”
Considerando a tabela “Cargo”, apresentada na Figura 2, quantas linhas serão retornadas pelo comando SQL abaixo?
SELECT COUNT(*), NIVEL FROM CARGO GROUP BY NIVEL HAVING COUNT(*) > 1
A0
B1
C2
D3
E4
Revelar gabarito e comentário▾
GabaritoB — 1
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”.
Resolução
Gabarito: letra B — a conta chega a 1 linha — alternativa B.
A ideia por trás
Em SQL, o GROUP BY junta linhas que têm o mesmo valor em uma coluna, formando grupos. Para cada grupo, funções de agregação como COUNT contam quantas linhas há dentro dele. O resultado é uma tabela com uma linha por grupo, mostrando o valor da coluna agrupada e o resultado da agregação.
O HAVING é um filtro que age sobre os grupos já formados, permitindo condições sobre o valor agregado, como COUNT(*) > 1. Ele é parecido com o WHERE, mas o WHERE filtra linhas antes do agrupamento, enquanto o HAVING filtra grupos depois. A condição do HAVING decide quais grupos aparecem no resultado final.
Esta questão pede para contar quantos grupos de NIVEL têm mais de um registro. A resposta é o número de grupos que passam no filtro, não o número de registros nem o total de grupos.
O que a questão dá
tabela Cargo com coluna NIVEL
comando SQL: SELECT COUNT(), NIVEL FROM CARGO GROUP BY NIVEL HAVING COUNT() > 1
O que queremos: quantas linhas o comando retorna
Passo 1 — Agrupar os cargos por nível
O comando pede para agrupar por NIVEL, então primeiro juntamos todos os cargos que têm o mesmo nível. Cada grupo representa um nível diferente.
Por que esta fórmula: GROUP BY NIVEL é a cláusula que cria os grupos. Sem ela, não há como contar por nível.
NÃO CAIA NESSA!
Esquecer que o GROUP BY junta linhas iguais e tentar contar cada linha separadamente.
Passo 2 — Contar quantos cargos há em cada nível
Depois de agrupar, precisamos saber quantos registros cada grupo tem, porque o filtro HAVING vai usar essa contagem.
Por que esta fórmula: COUNT(*) conta o número de linhas em cada grupo. É a função de agregação que o HAVING vai comparar.
De onde vem cada valor: = cada linha do grupo formado no passo 1
NÃO CAIA NESSA!
Confundir COUNT() com o número de grupos — COUNT() conta linhas dentro de cada grupo.
Passo 3 — Filtrar os grupos com mais de um cargo
O HAVING COUNT(*) > 1 mantém apenas os grupos que têm contagem maior que 1. É esse filtro que decide quais grupos aparecem no resultado.
Por que esta fórmula: HAVING é a cláusula que filtra grupos após a agregação. A condição COUNT(*) > 1 seleciona grupos com pelo menos dois registros.
De onde vem cada valor: = passo 2: contagem de linhas em cada grupo · = condição do enunciado: mais de um cargo
NÃO CAIA NESSA!
Usar WHERE COUNT(*) > 1 — WHERE não pode usar funções de agregação, e além disso filtraria antes do agrupamento.
Passo 4 — Contar quantos grupos passaram no filtro
O SELECT final mostra uma linha para cada grupo que passou no HAVING. A pergunta é quantas linhas o comando retorna, ou seja, quantos grupos sobreviveram ao filtro.
Por que esta fórmula: O resultado do SELECT é o número de grupos que atendem à condição do HAVING. Na tabela da questão, apenas um nível tem mais de um cargo.
NÃO CAIA NESSA!
Contar o número de registros que passam no filtro em vez do número de grupos — o COUNT(*) na projeção é por grupo, não total.