Pular para o conteúdo principal

Questão de Banco de Dados — Banco de Dados Relacionais — FUNDATEC 2025

Banco de DadosBanco de Dados Relacionais
Código
qg484488
Banca
FUNDATEC
Órgão
UFRGS
Ano
2025
Nível
Médio
Cargo
Técnico em Tecnologia da Informação/Área: Sistemas de Informação
Em um banco de dados que possui as tabelas CLIENTES (id_cliente, nome, cidade) e PEDIDOS (id_pedido, id_cliente, valor_pedido, data_pedido), qual comando SQL retorna corretamente o nome dos clientes que fizeram pedidos com valor superior a R$ 1.000,00, mostrando também o valor total de seus pedidos?
  1. ASELECT c.nome, SUM(p.valor_pedido) AS total_pedidosFROM CLIENTES cINNER JOIN PEDIDOS p ON c.id_cliente = p.id_clienteWHERE p.valor_pedido > 1000GROUP BY c.nome;
  2. BSELECT nome, valor_pedidoFROM CLIENTES c, PEDIDOS pWHERE c.id_cliente = p.id_clienteAND valor_pedido > 1000ORDER BY nome;
  3. CSELECT c.nome, COUNT(p.valor_pedido) AS total_pedidosFROM CLIENTES cLEFT JOIN PEDIDOS p ON c.id_cliente = p.id_clienteWHERE p.valor_pedido > 1000GROUP BY c.nome;
  4. DSELECT nome, MAX(valor_pedido) AS maior_pedidoFROM CLIENTES cINNER JOIN PEDIDOS p ON c.id_cliente = p.id_clienteGROUP BY nomeHAVING MAX(valor_pedido) > 1000;
  5. ESELECT DISTINCT c.nome, p.valor_pedidoFROM CLIENTES cINNER JOIN PEDIDOS p ON c.id_cliente = p.id_clienteWHERE p.valor_pedido > 1000;
Revelar gabarito e comentário

GabaritoA — SELECT c.nome, SUM(p.valor_pedido) AS total_pedidos FROM CLIENTES c INNER JOIN PEDIDOS p ON c.id_cliente = p.id_cliente WHERE p.valor_pedido > 1000 GROUP BY c.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: Consulta com SUM e GROUP BY

Gabarito: letra A. O comando SELECT com INNER JOIN, filtro WHERE e GROUP BY com SUM é a forma correta de listar o nome dos clientes que fizeram pedidos com valor superior a R$ 1.000,00 e mostrar o valor total desses pedidos. A cláusula WHERE filtra as tuplas antes da agregação, garantindo que apenas pedidos acima de R$ 1.000,00 sejam considerados no somatório.

A banca testa o conhecimento sobre funções de agregação (SUM, COUNT, MAX) e a diferença entre filtrar com WHERE (antes da agregação) e com HAVING (após a agregação).

Alternativa A — ✅ Correta ⟵ GABARITO

SELECT c.nome, SUM(p.valor_pedido) AS total_pedidos
FROM CLIENTES c
INNER JOIN PEDIDOS p ON c.id_cliente = p.id_cliente
WHERE p.valor_pedido > 1000
GROUP BY c.nome;

A consulta usa INNER JOIN para combinar as tabelas, filtra pedidos acima de R$ 1.000,00, agrupa por nome do cliente e calcula a soma dos valores. O resultado mostra exatamente o que foi solicitado: cada cliente que fez ao menos um pedido > R$ 1.000,00 e o total desses pedidos.

Alternativa B — ❌ Incorreta

SELECT nome, valor_pedido
FROM CLIENTES c, PEDIDOS p
WHERE c.id_cliente = p.id_cliente
AND valor_pedido > 1000
ORDER BY nome;

Usa junção implícita (produto cartesiano com filtro) e não agrupa nem soma. Retorna cada pedido individualmente, não o valor total por cliente. Além disso, nome sem prefixo pode gerar ambiguidade se houver colunas com mesmo nome.

Alternativa C — ❌ Incorreta

SELECT c.nome, COUNT(p.valor_pedido) AS total_pedidos
FROM CLIENTES c
LEFT JOIN PEDIDOS p ON c.id_cliente = p.id_cliente
WHERE p.valor_pedido > 1000
GROUP BY c.nome;

O LEFT JOIN é desnecessário e, com o WHERE filtrando p.valor_pedido > 1000, ele se comporta como INNER JOIN (clientes sem pedidos seriam excluídos). O erro principal está no uso de COUNT em vez de SUM: COUNT conta quantos pedidos, não a soma dos valores.

Alternativa D — ❌ Incorreta

SELECT nome, MAX(valor_pedido) AS maior_pedido
FROM CLIENTES c
INNER JOIN PEDIDOS p ON c.id_cliente = p.id_cliente
GROUP BY nome
HAVING MAX(valor_pedido) > 1000;

Retorna o maior pedido de cada cliente (MAX), não a soma total. A cláusula HAVING filtra clientes cujo maior pedido supera R$ 1.000,00, mas o requisito é mostrar o total de pedidos, não o máximo.

Alternativa E — ❌ Incorreta

SELECT DISTINCT c.nome, p.valor_pedido
FROM CLIENTES c
INNER JOIN PEDIDOS p ON c.id_cliente = p.id_cliente
WHERE p.valor_pedido > 1000;

O DISTINCT elimina duplicatas, mas ainda retorna cada pedido linha a linha, sem agregação. Não há soma nem agrupamento, portanto não atende ao pedido.

NÃO CAIA NESSA!

A banca troca funções de agregação: em vez de SUM, usa COUNT (que conta) ou MAX (que pega o maior valor). Fique atento: "total" indica soma, não contagem ou máximo. Outra armadilha é usar LEFT JOIN com WHERE, que na prática vira INNER JOIN, mas ainda erra a função.

Gabarito: letra A.

Link permanente: /questoes/qg484488