Considerando as tabelas apresentadas na Figura 2, 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 PWHERE M.ID = P.ID_MARCAHAVING P.DESCRICAO;
BSELECT M.NOME, COUNT(P.ID)FROM MARCA M, PRODUTO PWHERE M.ID = P.ID_MARCAGROUP BY M.NOME;
CSELECT M.NOME, SUM(P.ID)FROM MARCA M, PRODUTO PWHERE M.ID = P.ID_MARCAGROUP BY P.DESCRICAO;
DSELECT M.NOME, P.ID_MARCAFROM MARCA M, PRODUTO PWHERE M.ID = P.ID_MARCA;
ESELECT M.NOME, COUNT(P.ID)FROM MARCA M, PRODUTO PWHERE 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”.
SQL: Agrupamento e Contagem com GROUP BY e COUNT
Gabarito: letra B. Para retornar os nomes das marcas e a quantidade de produtos relacionados a cada marca, é necessário usar a função de agregação COUNT para contar os produtos e a cláusula GROUP BY para agrupar os resultados por marca. A alternativa B é a única que combina corretamente COUNT(P.ID) com GROUP BY M.NOME, fazendo a junção das tabelas MARCA e PRODUTO pela condição M.ID = P.ID_MARCA.
A questão exige o conhecimento de dois conceitos fundamentais do SQL: funções de agregação e agrupamento de resultados. As funções de agregação, como COUNT, SUM, AVG, MAX e MIN, são usadas para resumir informações de várias linhas em um único valor. A função COUNT retorna o número de linhas que atendem a um critério, sendo ideal para contar a quantidade de produtos. Já a cláusula GROUP BY é utilizada para agrupar linhas que têm os mesmos valores em colunas específicas, permitindo que a função de agregação seja aplicada a cada grupo separadamente.
Na prática, para obter a quantidade de produtos por marca, precisamos: (1) juntar as tabelas MARCA e PRODUTO pela chave estrangeira ID_MARCA; (2) agrupar os resultados pelo nome da marca; e (3) contar quantos produtos existem em cada grupo. A sintaxe correta seria SELECT M.NOME, COUNT(P.ID) FROM MARCA M, PRODUTO P WHERE M.ID = P.ID_MARCA GROUP BY M.NOME;. A alternativa B segue exatamente essa estrutura.
A pegadinha da questão está em distinguir quando usar COUNT (contagem de linhas) de SUM (soma de valores). Como o enunciado pede a quantidade de produtos, a função correta é COUNT, não SUM. Além disso, é essencial que o GROUP BY esteja presente para que a contagem seja feita por marca, e não sobre o total geral de produtos. A alternativa E, por exemplo, usa COUNT mas não agrupa, o que resultaria em uma contagem geral, não por marca.
Guarde a fronteira entre COUNT (contar linhas) e SUM (somar valores), e a necessidade do GROUP BY para agrupar: é exatamente nesses dois pontos que as alternativas se dividem.
Critério
Alternativa B (correta)
Alternativa A
Alternativa C
Alternativa D
Alternativa E
Função de agregação
COUNT(P.ID) — conta produtos
SUM(P.DESCRICAO) — inválido (texto)
SUM(P.ID) — soma IDs, não conta
Nenhuma
COUNT(P.ID) — conta produtos
Agrupamento
GROUP BY M.NOME — por marca
Sem GROUP BY
GROUP BY P.DESCRICAO — por descrição
Sem GROUP BY
Sem GROUP BY
Junção correta
M.ID = P.ID_MARCA
M.ID = P.ID_MARCA
M.ID = P.ID_MARCA
M.ID = P.ID_MARCA
M.ID = P.ID — incorreta
Atende ao enunciado
✅ Sim
❌ Não
❌ Não
❌ Não
❌ Não
Alternativa A — ❌ Incorreta
O erro está no uso de SUM(P.DESCRICAO). A função SUM é usada para somar valores numéricos, mas DESCRICAO é um campo de texto (varchar), o que torna a operação inválida. Além disso, a cláusula HAVING P.DESCRICAO está incorreta, pois HAVING é usado para filtrar grupos após o GROUP BY, e aqui não há agrupamento definido. Para contar produtos, o correto seria COUNT(P.ID).
Alternativa B — ✅ Correta ⟵ GABARITO
Esta alternativa está correta porque usa COUNT(P.ID) para contar a quantidade de produtos de cada marca, e GROUP BY M.NOME para agrupar os resultados por nome da marca. A junção das tabelas é feita corretamente com WHERE M.ID = P.ID_MARCA, relacionando a chave primária de MARCA com a chave estrangeira de PRODUTO. O resultado será uma lista com o nome de cada marca e o número de produtos associados a ela.
Alternativa C — ❌ Incorreta
O erro está no uso de SUM(P.ID) em vez de COUNT(P.ID). A função SUM soma os valores da coluna ID, o que não representa a quantidade de produtos, mas a soma dos identificadores. Além disso, o GROUP BY P.DESCRICAO agrupa pela descrição do produto, não pela marca, o que não atende ao que o enunciado pede. O agrupamento correto deveria ser por M.NOME.
Alternativa D — ❌ Incorreta
Esta alternativa não utiliza nenhuma função de agregação, apenas seleciona M.NOME e P.ID_MARCA. Isso retornaria uma linha para cada produto, com o nome da marca repetido, sem qualquer contagem ou agrupamento. Para obter a quantidade de produtos por marca, é necessário usar COUNT e GROUP BY.
Alternativa E — ❌ Incorreta
O erro está na condição de junção WHERE M.ID = P.ID. A coluna ID em PRODUTO não é a chave estrangeira que referencia MARCA; a chave estrangeira é ID_MARCA. Portanto, essa condição não relaciona corretamente as tabelas. Além disso, falta a cláusula GROUP BY M.NOME, sem a qual o COUNT(P.ID) contaria todos os produtos de uma vez, não por marca.