Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2023
Banco de Dados›Consultas e Comandos em SQL
Código
qa537501
Banca
FUNDATEC
Órgão
CIGA SC
Ano
2023
Cargo
Ana Sis ( )
Considere a figura a seguir.
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?
ASELECT M.NOME, SUM(P.DESCRICAO) FROM MARCA M, PRODUTO P WHERE M.ID = P.ID_MARCA HAVING P.DESCRICAO;
BSELECT M.NOME, COUNT(P.ID) FROM MARCA M, PRODUTO P WHERE M.ID = P.ID_MARCA GROUP BY M.NOME;
CSELECT M.NOME, SUM(P.ID) FROM MARCA M, PRODUTO P WHERE M.ID = P.ID_MARCA GROUP BY P.DESCRICAO;
DSELECT M.NOME, P.ID_MARCA FROM MARCA M, PRODUTO P WHERE M.ID = P.ID_MARCA;
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 é: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER 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.