Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FUNDATEC 2024

Banco de DadosSQL
Código
qg174754
Banca
FUNDATEC
Órgão
Prefeitura de Passo Fundo - RS
Ano
2024
Nível
Superior
Cargo
Analista de Tecnologia da Informação

Para responder à questão, considere um banco de dados PostgreSQL no qual um analista de sistemas executou, com sucesso, os comandos SQL abaixo: 


Imagem da questão

O analista executou o seguinte comando SQL:Imagem associada para resolução da questãoQuantos registros a execução desse comando SQL retornou?
  1. A1.
  2. B2.
  3. C3.
  4. D4.
  5. E5.
Revelar gabarito e comentário

GabaritoB — 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”.

Resolução

Gabarito: letra B — a conta chega a 2 registros — alternativa B.

A ideia por trás

Em SQL, uma consulta de agregação agrupa linhas que têm o mesmo valor em uma coluna e calcula um resumo para cada grupo. A cláusula GROUP BY define o critério de agrupamento, e funções como COUNT, SUM ou AVG resumem cada grupo em uma única linha de resultado.

A cláusula HAVING filtra os grupos DEPOIS de agrupados, usando condições sobre as funções de agregação. Já o WHERE filtra linhas individuais ANTES do agrupamento. Por isso, HAVING é o único lugar onde se pode escrever COUNT(*) > 1. O resultado da consulta é uma linha por grupo que passa no filtro.

Esta questão testa exatamente essa diferença: é preciso contar quantos grupos têm mais de uma ocorrência, ignorando os grupos com apenas uma linha.

O que a questão dá

  • tabela familia com coluna relação

  • comando: SELECT relação, sum(1) FROM familia GROUP BY relação HAVING count(*) > 1

O que queremos: quantos registros a consulta retorna

Passo 1 — Listar os valores da coluna relação

Para saber quantos grupos existem e quantas linhas cada um tem, precisamos primeiro ver os dados da tabela. O GROUP BY vai juntar as linhas com o mesmo valor.

ma~e,ma~e,ma~e,ma~e,pai,pai,avo^\boxed{\text{m}ã\text{e}, \text{m}ã\text{e}, \text{m}ã\text{e}, \text{m}ã\text{e}, \text{pai}, \text{pai}, \text{av}ô}
NÃO CAIA NESSA!

Esquecer de contar todas as ocorrências de cada valor.

Passo 2 — Agrupar e contar as ocorrências

O GROUP BY relação cria um grupo para cada valor distinto. A função sum(1) conta quantas linhas há em cada grupo, equivalente a count(*).

Por que esta fórmula: sum(1) soma o número 1 para cada linha do grupo, resultando na contagem de linhas. É uma forma alternativa de count(*).

contagem=sum(1)\text{contagem} = \text{sum}(1)

De onde vem cada valor: contagem\text{contagem} = definição: contagem de linhas do grupo · sum(1)\text{sum}(1) = enunciado: função sum(1) do comando

ma~e:4,pai:2,avo^:1=ma~e:4,pai:2,avo^:1mãe: 4, pai: 2, avô: 1 = \boxed{\text{m}ã\text{e}: 4, \text{pai}: 2, \text{av}ô: 1}
NÃO CAIA NESSA!

Confundir sum(1) com soma de valores de uma coluna; aqui é contagem.

Passo 3 — Filtrar grupos com mais de uma ocorrência

O HAVING count(*) > 1 descarta os grupos que têm apenas 1 linha. Isso é feito após o agrupamento, então só os grupos com contagem maior que 1 permanecem.

Por que esta fórmula: HAVING é a cláusula que filtra grupos, e a condição usa a função de agregação count(*).

contagem>1\text{contagem} > 1

De onde vem cada valor: contagem\text{contagem} = passo 2: contagem de cada grupo

ma~e:4>1(manteˊm),pai:2>1(manteˊm),avo^:1>1(falso,descarta)=ma~eepaimãe: 4 > 1 (mantém), pai: 2 > 1 (mantém), avô: 1 > 1 (falso, descarta) = \boxed{\text{m}ã\text{e} \text{e} \text{pai}}
NÃO CAIA NESSA!

Usar WHERE count(*) > 1, que é inválido porque WHERE não aceita funções de agregação.

Resposta: 2 registros — alternativa B

Link permanente: /questoes/qg174754