Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2025
Banco de Dados›Consultas e Comandos em SQL
Código
fg169063
Banca
FGV
Órgão
TCE PI
Ano
2025
Cargo
ACE (TCE-PI)
Em um banco de dados SQL, suponha que existe uma tabela chamada Vendas com as colunas VendaID, VendedorID e ValorVenda. Para listar, sem duplicatas, os VendedorID de todos os vendedores que tenham realizado vendas superiores ao valor de 10.000, poderíamos usar a seguinte consulta:
ASELECT VendedorID FROM Vendas WHERE ValorVenda > 10000;
BSELECT DISTINCT VendedorID FROM Vendas GROUP BY VendedorID HAVING ValorVenda > 10000;
CSELECT VendedorID FROM Vendas WHERE SUM(ValorVenda) > 10000;
DSELECT DISTINCT VendedorID FROM Vendas WHERE ValorVenda > 10000;
ESELECT VendedorID FROM Vendas WHERE MAX(ValorVenda) > 10000 GROUP BY VendedorID;
Revelar gabarito e comentário▾
GabaritoD — SELECT DISTINCT VendedorID FROM Vendas
WHERE ValorVenda > 10000;
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: DISTINCT, WHERE e funções de agregação
Gabarito: letra D. A consulta correta para listar, sem duplicatas, os VendedorID que realizaram vendas superiores a 10.000 é SELECT DISTINCT VendedorID FROM Vendas WHERE ValorVenda > 10000;. A cláusula WHERE filtra as linhas individualmente (cada venda com valor > 10.000) e o DISTINCT elimina as repetições de VendedorID no resultado. As demais alternativas erram ao usar funções de agregação (SUM, MAX) no lugar errado ou ao combinar DISTINCT com GROUP BY de forma redundante ou incorreta.
O comando SELECT é a base de qualquer consulta em SQL, e sua sintaxe fundamental é SELECT colunas FROM tabela WHERE condição. A cláusula WHERE é o filtro que atua linha a linha: para cada registro da tabela, ela avalia a condição e retorna apenas aqueles em que a condição é verdadeira. No caso da questão, WHERE ValorVenda > 10000 seleciona todas as vendas cujo valor individual ultrapassa 10.000. É importante notar que o WHEREnão pode usar funções de agregação como SUM ou MAX, pois essas funções operam sobre um conjunto de linhas, não sobre linhas individuais — essa é a distinção central que separa o WHERE do HAVING.
O DISTINCT é um modificador do SELECT que elimina linhas duplicadas do resultado. Quando aplicado a uma coluna, como SELECT DISTINCT VendedorID, ele garante que cada valor de VendedorID apareça apenas uma vez na saída. Isso é exatamente o que o enunciado pede: "listar, sem duplicatas, os VendedorID". Sem o DISTINCT, um vendedor que fez várias vendas acima de 10.000 apareceria várias vezes no resultado.
A combinação WHERE + DISTINCT resolve o problema de forma direta e eficiente: primeiro filtra as vendas individuais acima do valor, depois remove os vendedores repetidos. Não há necessidade de GROUP BY nem de funções de agregação, pois a condição é sobre o valor de cada venda individual, não sobre um resumo (soma, média, máximo) das vendas de cada vendedor.
A pegadinha da banca está em confundir o filtro por linha (WHERE) com o filtro por grupo (HAVING). O candidato que pensa "preciso somar as vendas de cada vendedor" é tentado a usar SUM ou GROUP BY, mas o enunciado fala de "vendas superiores ao valor de 10.000" — ou seja, cada venda individual deve ser maior que 10.000, não a soma das vendas. Guarde essa fronteira: WHERE filtra linhas, HAVING filtra grupos; funções de agregação só podem aparecer no SELECT, no HAVING ou no ORDER BY, nunca no WHERE.
Consulta SQL: Filtro por linha (WHERE, Não aceita agregação (SUM, MAX)); Filtro por grupo (GROUP BY + HAVING, Aceita agregação); Eliminar duplicatas (DISTINCT, Redundante com GROUP BY)
Alternativa A — ❌ Incorreta
SELECT VendedorID FROM Vendas WHERE ValorVenda > 10000; — Esta consulta retorna os VendedorID corretos, mas com duplicatas. Se um vendedor realizou duas vendas acima de 10.000, seu ID aparecerá duas vezes no resultado. O enunciado exige "sem duplicatas", e a alternativa não usa DISTINCT. O erro é a omissão do modificador que elimina repetições.
Alternativa B — ❌ Incorreta
SELECT DISTINCT VendedorID FROM Vendas GROUP BY VendedorID HAVING ValorVenda > 10000; — Esta consulta tem dois problemas graves. Primeiro, a cláusula HAVING exige uma condição sobre o grupo, mas ValorVenda é uma coluna individual, não uma agregação — a condição deveria ser algo como HAVING SUM(ValorVenda) > 10000 ou HAVING MAX(ValorVenda) > 10000. Segundo, mesmo que a condição fosse corrigida, o DISTINCT combinado com GROUP BY é redundante: o GROUP BY já agrupa os vendedores, produzindo um resultado sem duplicatas. A alternativa mistura conceitos de filtro por linha e por grupo de forma incorreta.
Alternativa C — ❌ Incorreta
SELECT VendedorID FROM Vendas WHERE SUM(ValorVenda) > 10000; — Esta consulta é inválida em SQL padrão. A cláusula WHERE não pode conter funções de agregação como SUM. O WHERE avalia cada linha individualmente, e SUM(ValorVenda) é uma operação sobre um conjunto de linhas. Para usar SUM, seria necessário GROUP BY VendedorID e HAVING SUM(ValorVenda) > 10000. Além disso, a consulta não usa DISTINCT, então mesmo que fosse válida, retornaria duplicatas.
Alternativa D — ✅ Correta ⟵ GABARITO
SELECT DISTINCT VendedorID FROM Vendas WHERE ValorVenda > 10000; — Esta é a consulta correta. O WHERE ValorVenda > 10000 filtra as linhas, selecionando apenas as vendas individuais com valor superior a 10.000. O DISTINCT elimina as duplicatas de VendedorID, garantindo que cada vendedor apareça apenas uma vez no resultado. A combinação atende exatamente ao que o enunciado pede: listar, sem duplicatas, os vendedores que realizaram vendas acima de 10.000.
Alternativa E — ❌ Incorreta
SELECT VendedorID FROM Vendas WHERE MAX(ValorVenda) > 10000 GROUP BY VendedorID; — Esta consulta é inválida por dois motivos. Primeiro, MAX(ValorVenda) é uma função de agregação e não pode ser usada na cláusula WHERE. Segundo, a ordem das cláusulas está errada: o GROUP BY deve vir antes do HAVING, e o WHERE não pode usar agregação. A consulta correta com MAX seria SELECT VendedorID FROM Vendas GROUP BY VendedorID HAVING MAX(ValorVenda) > 10000; — mas isso retornaria vendedores cuja maior venda individual ultrapassa 10.000, o que é diferente do que o enunciado pede (qualquer venda acima de 10.000).
NÃO CAIA NESSA!
A banca explora a confusão entre WHERE e HAVING. O candidato que pensa "preciso somar as vendas de cada vendedor" é tentado a usar SUM ou GROUP BY, mas o enunciado fala de "vendas superiores ao valor de 10.000" — ou seja, cada venda individual deve ser maior que 10.000, não a soma das vendas. Lembre-se: WHERE filtra linhas, HAVING filtra grupos; funções de agregação só podem aparecer no SELECT, no HAVING ou no ORDER BY, nunca no WHERE.
PEGA ESSA DICA!
Para resolver questões de SQL, identifique primeiro se a condição é sobre uma linha individual ou sobre um grupo. Se for sobre linha, use WHERE; se for sobre grupo, use GROUP BY + HAVING. E sempre verifique se o enunciado pede valores únicos — se pedir, use DISTINCT.