Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FUNDATEC 2023

Banco de DadosSQL
Código
qq896706
Banca
FUNDATEC
Órgão
PROCERGS
Ano
2023
Nível
Superior
Cargo
ANC - Analista em Computação - Ênfase em Administração de Dados
Considerando a tabela "produtos", exemplificada abaixo, com as colunas "id" INTEGER, "nome" VARCHAR(512), "preco" DECIMAL, "quantidade" INTEGER, qual a consulta SQL que retorna o(s) nome(s) do(s) produto(s) com a maior quantidade? A consulta retornaria Produto C e Produto E no exemplo abaixo.Imagem associada para resolução da questão
  1. ASELECT nome FROM produtos ORDER BY quantidade DESC LIMIT 1
  2. BSELECT * FROM produtos ORDER BY quantidade IS MAX(quantidade)
  3. CSELECT nome FROM produtos WHERE quantidade = MAX(quantidade) LIMIT 1
  4. DSELECT nome FROM produtos WHERE quantidade = (SELECT MAX(quantidade) FROM produtos)
  5. ENenhuma das alternativas anteriores.
Revelar gabarito e comentário

GabaritoD — SELECT nome FROM produtos WHERE quantidade = (SELECT MAX(quantidade) FROM produtos)

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”.

Funções de agregação e subconsultas em SQL

Gabarito: letra D. A consulta correta usa uma subconsulta para calcular o valor máximo da coluna quantidade e, em seguida, filtra os produtos cuja quantidade é igual a esse valor máximo, retornando assim todos os produtos com a maior quantidade, inclusive quando há empate (Produto C e Produto E).

A questão exige que você retorne o nome de todos os produtos que possuem a maior quantidade na tabela. O ponto central é que pode haver mais de um produto com a mesma quantidade máxima, como no exemplo dado, onde tanto o Produto C quanto o Produto E têm a maior quantidade. Portanto, a consulta precisa ser capaz de retornar múltiplas linhas, e não apenas uma.

Para isso, a abordagem correta é usar uma subconsulta que calcule o valor máximo da coluna quantidade e, em seguida, comparar cada linha da tabela com esse valor. A sintaxe WHERE quantidade = (SELECT MAX(quantidade) FROM produtos) faz exatamente isso: a subconsulta (SELECT MAX(quantidade) FROM produtos) retorna um único valor (o maior), e a consulta externa seleciona todas as linhas onde a coluna quantidade é igual a esse valor. Isso garante que todos os produtos com a quantidade máxima sejam retornados, independentemente de quantos sejam.

Vamos analisar por que as outras alternativas estão incorretas. A alternativa A usa ORDER BY quantidade DESC LIMIT 1, que retorna apenas a primeira linha após ordenar pela quantidade em ordem decrescente. Isso retornaria apenas um produto, mesmo que houvesse empate, o que não atende ao requisito de retornar todos os produtos com a maior quantidade. A alternativa B tem uma sintaxe inválida, pois ORDER BY quantidade IS MAX(quantidade) não é uma expressão válida em SQL. A alternativa C tenta usar MAX(quantidade) diretamente na cláusula WHERE, o que não é permitido, pois funções de agregação não podem ser usadas diretamente no WHERE sem um GROUP BY ou subconsulta. A alternativa E é incorreta porque a alternativa D é válida.

A pegadinha desta questão é que muitos candidatos podem ser tentados a usar LIMIT 1 para obter o maior valor, mas isso não funciona quando há empate. A banca explora exatamente essa confusão entre retornar apenas um registro e retornar todos os registros que atendem à condição.

  1. 1Subconsulta calcula MAX(quantidade)
  2. 2WHERE compara cada linha ao máximo
  3. 3Retorna todos os produtos empatados
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

A consulta SELECT nome FROM produtos ORDER BY quantidade DESC LIMIT 1 retorna apenas o primeiro registro após ordenar pela quantidade em ordem decrescente. Isso retornaria apenas um produto, mesmo que houvesse empate na maior quantidade. No exemplo, retornaria apenas o Produto C ou o Produto E, mas não ambos, o que não atende ao requisito de retornar todos os produtos com a maior quantidade.

Alternativa B — ❌ Incorreta

A consulta SELECT * FROM produtos ORDER BY quantidade IS MAX(quantidade) é sintaticamente inválida. A expressão quantidade IS MAX(quantidade) não é uma expressão válida em SQL. A cláusula ORDER BY espera uma coluna ou expressão que possa ser avaliada para ordenação, e MAX(quantidade) é uma função de agregação que não pode ser usada dessa forma sem um GROUP BY ou subconsulta.

Alternativa C — ❌ Incorreta

A consulta SELECT nome FROM produtos WHERE quantidade = MAX(quantidade) LIMIT 1 é inválida porque funções de agregação como MAX() não podem ser usadas diretamente na cláusula WHERE. A cláusula WHERE filtra linhas individuais antes da agregação, e MAX(quantidade) é uma agregação que opera sobre um conjunto de linhas. Para usar MAX() em uma condição, é necessário usar uma subconsulta ou a cláusula HAVING com GROUP BY. Além disso, o LIMIT 1 limitaria o resultado a um único registro, o que não atenderia ao requisito de retornar todos os produtos com a maior quantidade.

Alternativa D — ✅ Correta ⟵ GABARITO

A consulta SELECT nome FROM produtos WHERE quantidade = (SELECT MAX(quantidade) FROM produtos) é a correta. A subconsulta (SELECT MAX(quantidade) FROM produtos) calcula o valor máximo da coluna quantidade. A consulta externa então seleciona os nomes dos produtos cuja quantidade é igual a esse valor máximo. Isso retorna todos os produtos com a maior quantidade, incluindo empates, como no exemplo, onde retornaria Produto C e Produto E.

Alternativa E — ❌ Incorreta

A alternativa E afirma que nenhuma das alternativas anteriores está correta. Como a alternativa D é uma consulta SQL válida e correta, a alternativa E é incorreta.

Gabarito: letra D

Link permanente: /questoes/qq896706