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
qa537501
Banca
FUNDATEC
Órgão
CIGA SC
Ano
2023
Cargo
Ana Sis ( )

Considere a figura a seguir.

 

Imagem associada para resolução da questão

Figura – Tabelas MARCA e PRODUTO

 

Considerando as tabelas apresentadas na figura, qual o comando SQL poderá ser executado para que sejam retornados os nomes das marcas e a quantidade de produtos relacionados a cada marca?

  1. ASELECT M.NOME, SUM(P.DESCRICAO) FROM MARCA M, PRODUTO P WHERE M.ID = P.ID_MARCA HAVING P.DESCRICAO;
  2. BSELECT M.NOME, COUNT(P.ID) FROM MARCA M, PRODUTO P WHERE M.ID = P.ID_MARCA GROUP BY M.NOME;
  3. CSELECT M.NOME, SUM(P.ID) FROM MARCA M, PRODUTO P WHERE M.ID = P.ID_MARCA GROUP BY P.DESCRICAO;
  4. DSELECT M.NOME, P.ID_MARCA FROM MARCA M, PRODUTO P WHERE M.ID = P.ID_MARCA;
  5. ESELECT M.NOME, COUNT(P.ID) FROM MARCA M, PRODUTO P WHERE M.ID = P.ID;
Revelar gabarito e comentário

GabaritoB — SELECT M.NOME, COUNT(P.ID) FROM MARCA M, PRODUTO P WHERE M.ID = P.ID_MARCA GROUP BY M.NOME;

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: agregação com GROUP BY

Gabarito: letra B. Para retornar os nomes das marcas e a quantidade de produtos de cada marca, é necessário usar a função de agregação COUNT sobre a coluna de identificação do produto (P.ID) e agrupar o resultado por M.NOME com a cláusula GROUP BY. A alternativa B é a única que combina corretamente a contagem com o agrupamento, após a junção das tabelas MARCA e PRODUTO pela chave estrangeira P.ID_MARCA = M.ID.

Funções de agregação são usadas para resumir informações de várias tuplas em uma síntese de tupla única. As principais são COUNT, SUM, MAX, MIN e AVG. A função COUNT retorna o número de linhas que atendem a um critério — ou seja, conta registros. Já SUM soma valores numéricos de uma coluna. Para saber a quantidade de produtos por marca, precisamos contar os produtos de cada grupo, não somar seus IDs (que não faz sentido).

A cláusula GROUP BY agrupa linhas que têm os mesmos valores em colunas especificadas, permitindo que a função de agregação seja aplicada a cada grupo separadamente. Sem o GROUP BY, a função de agregação é aplicada a todas as linhas do resultado, retornando um único valor global — o que não atende ao pedido de "quantidade de produtos relacionados a cada marca".

A ordem lógica de execução de uma consulta SQL é: FROMWHEREGROUP BYHAVINGSELECTORDER BY. Isso significa que o GROUP BY é processado antes da projeção (SELECT) e antes do HAVING, que filtra grupos já formados. No nosso caso, não há condição de filtro (WHERE) nem de grupo (HAVING), apenas junção, agrupamento e contagem.

Na prática, imagine que a tabela MARCA tenha as marcas "Nike" e "Adidas", e a tabela PRODUTO tenha 3 produtos Nike e 2 Adidas. A consulta correta retornaria:

M.NOME

COUNT(P.ID)

Nike

3

Adidas

2

A pegadinha da banca está em trocar a função de agregação (SUM no lugar de COUNT) e a coluna de agrupamento (P.DESCRICAO no lugar de M.NOME), além de omitir o GROUP BY em uma alternativa. Guarde a fronteira: quantidade pede COUNT; soma pede SUM; e o agrupamento deve ser feito pela coluna que aparece no SELECT sem função de agregação — no caso, M.NOME.

Alternativa A — ❌ Incorreta

Usa SUM(P.DESCRICAO), mas DESCRICAO é um campo de texto (ou descrição), não numérico — SUM só faz sentido em colunas numéricas. Além disso, a cláusula HAVING P.DESCRICAO está incorreta: HAVING é usado para filtrar grupos após o GROUP BY, e aqui não há GROUP BY nem condição válida. O correto seria COUNT(P.ID) com GROUP BY M.NOME.

Alternativa B — ✅ Correta ⟵ GABARITO

Esta é a única que combina corretamente: COUNT(P.ID) conta os produtos de cada marca, e GROUP BY M.NOME agrupa os resultados por nome da marca. A junção WHERE M.ID = P.ID_MARCA relaciona as tabelas pela chave estrangeira. O resultado é exatamente o pedido: nomes das marcas e quantidade de produtos por marca.

Alternativa C — ❌ Incorreta

Usa SUM(P.ID), que soma os valores dos IDs dos produtos — não é a quantidade de produtos, e sim a soma dos códigos, o que não faz sentido para o relatório. Além disso, o GROUP BY P.DESCRICAO agrupa por descrição do produto, não por marca — o que misturaria produtos de marcas diferentes no mesmo grupo. O correto é COUNT(P.ID) e GROUP BY M.NOME.

Alternativa D — ❌ Incorreta

Não usa nenhuma função de agregação — apenas seleciona M.NOME e P.ID_MARCA, retornando uma linha para cada produto, sem contar nada. Para obter a quantidade por marca, é obrigatório usar COUNT com GROUP BY.

Alternativa E — ❌ Incorreta

Usa COUNT(P.ID), mas não tem GROUP BY. Sem o agrupamento, o COUNT é aplicado a todas as linhas do resultado, retornando um único valor global (total de produtos), não a quantidade por marca. Além disso, a condição de junção está errada: WHERE M.ID = P.ID compara a chave primária de MARCA com a chave primária de PRODUTO, o que não é a relação correta — deveria ser P.ID_MARCA = M.ID.

NÃO CAIA NESSA!

A banca adora trocar a função de agregação (SUM por COUNT) e a coluna de agrupamento (P.DESCRICAO por M.NOME), além de omitir o GROUP BY para ver se você percebe que sem ele a contagem é global. Fique atento: quantidade = COUNT, soma = SUM, e o GROUP BY deve usar a coluna que aparece no SELECT sem agregação.

PEGA ESSA DICA!

Na hora da prova, identifique o que a consulta deve retornar: se pede "quantidade" ou "número de", use COUNT; se pede "soma" ou "total", use SUM. E lembre: toda coluna no SELECT que não estiver dentro de uma função de agregação deve aparecer no GROUP BY.

Gabarito: letra B

Link permanente: /questoes/qa537501