Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2023

Banco de DadosConsultas e Comandos em SQL
Código
qa537588
Banca
FUNDATEC
Órgão
IFFAR
Ano
2023
Cargo
Tec ( )

Imagem associada para resolução da questão

 

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


  1. A0
  2. B1
  3. C2
  4. D3
  5. 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.

COUNT()COUNT(*)

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.

HAVINGCOUNT()>1HAVING COUNT(*) > 1

De onde vem cada valor: COUNT()COUNT(*) = passo 2: contagem de linhas em cada grupo · 11 = 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.

1 linha\boxed{1\ \text{linha}}
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.

Resposta: 1 linha — alternativa B

Link permanente: /questoes/qa537588