Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2023

Banco de DadosConsultas e Comandos em SQL
Código
qa537833
Banca
FUNDATEC
Órgão
PROCERGS
Ano
2023
Cargo
ANC ( )

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.

 

id

nomeprecoquantidade
1Produto A10.9950
2Produto B20.4930
3Produto C15.0075
4Produto D25.00

40

5Produto E18.0075


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

Consultas SQL: subconsulta com função de agregação

Gabarito: letra D. A consulta correta é SELECT nome FROM produtos WHERE quantidade = (SELECT MAX(quantidade) FROM produtos), pois usa uma subconsulta para calcular o valor máximo da coluna quantidade e, em seguida, filtra as linhas cuja quantidade seja igual a esse valor máximo. Isso retorna todos os produtos com a maior quantidade, incluindo empates (Produto C e Produto E, ambos com quantidade 75). As demais alternativas apresentam erros de sintaxe ou de lógica que impedem o resultado esperado.

A questão cobra o uso de funções de agregação (MAX) combinadas com subconsultas para resolver um problema comum em SQL: encontrar registros que possuem o valor máximo de uma coluna, especialmente quando há empates. A função MAX(quantidade) retorna o maior valor da coluna, mas não pode ser usada diretamente na cláusula WHERE de uma consulta simples, pois funções de agregação não são permitidas nessa cláusula. A solução é usar uma subconsulta que calcula o valor máximo e, então, comparar cada linha com esse valor.

Vamos entender o funcionamento de cada parte:

  1. Função de agregação MAX: retorna o maior valor de uma coluna. No exemplo, MAX(quantidade) retorna 75.

  2. Subconsulta: é uma consulta aninhada dentro de outra. A subconsulta (SELECT MAX(quantidade) FROM produtos) é executada primeiro e retorna o valor 75.

  3. Cláusula WHERE: filtra as linhas da tabela produtos onde a coluna quantidade é igual ao valor retornado pela subconsulta (75). Isso retorna as linhas dos Produtos C e E.

A alternativa D é a única que implementa corretamente essa lógica. As demais alternativas falham por diferentes motivos:

  • A) ORDER BY quantidade DESC LIMIT 1 retorna apenas o primeiro registro após ordenar pela quantidade em ordem decrescente. Isso retornaria apenas um produto (o primeiro com quantidade 75), não ambos os empates.

  • B) ORDER BY quantidade IS MAX(quantidade) é uma sintaxe inválida. MAX(quantidade) não pode ser usado diretamente na cláusula ORDER BY dessa forma, e a expressão IS não é um operador de comparação válido nesse contexto.

  • C) WHERE quantidade = MAX(quantidade) LIMIT 1 é inválida porque funções de agregação não podem ser usadas diretamente na cláusula WHERE sem um GROUP BY. Além disso, LIMIT 1 limitaria o resultado a um único registro, ignorando empates.

  • E) Não é correta, pois a alternativa D é válida.

A pegadinha da questão está em reconhecer que, para retornar todos os produtos com a maior quantidade (incluindo empates), é necessário usar uma subconsulta. Alternativas que usam LIMIT 1 ou ORDER BY sem subconsulta retornam apenas um registro, o que não atende ao requisito do enunciado.

Alternativa A — ❌ Incorreta

A consulta SELECT nome FROM produtos ORDER BY quantidade DESC LIMIT 1 ordena os produtos pela quantidade em ordem decrescente e retorna apenas o primeiro registro. No exemplo, isso retornaria apenas "Produto C" (ou "Produto E", dependendo da ordem de desempate), mas não ambos. O enunciado exige que a consulta retorne todos os produtos com a maior quantidade, incluindo empates. O uso de LIMIT 1 limita o resultado a uma única linha, o que é insuficiente.

Alternativa B — ❌ Incorreta

A consulta SELECT * FROM produtos ORDER BY quantidade IS MAX(quantidade) é sintaticamente inválida. A cláusula ORDER BY espera uma expressão que possa ser avaliada para cada linha, mas MAX(quantidade) é uma função de agregação que não pode ser usada diretamente nesse contexto sem um GROUP BY. Além disso, o operador IS é usado para comparação com NULL ou TRUE/FALSE, não para comparação de valores. Essa consulta geraria um erro de sintaxe na maioria dos SGBDs.

Alternativa C — ❌ Incorreta

A consulta SELECT nome FROM produtos WHERE quantidade = MAX(quantidade) LIMIT 1 é inválida porque funções de agregação não podem ser usadas diretamente na cláusula WHERE de uma consulta sem GROUP BY. A cláusula WHERE filtra linhas individuais antes da agregação, e MAX(quantidade) não pode ser avaliado nesse contexto. Além disso, mesmo que fosse válida, LIMIT 1 limitaria o resultado a um único registro, ignorando empates.

Alternativa D — ✅ Correta ⟵ GABARITO

A consulta SELECT nome FROM produtos WHERE quantidade = (SELECT MAX(quantidade) FROM produtos) usa uma subconsulta para calcular o valor máximo da coluna quantidade (75) e, em seguida, filtra as linhas cuja quantidade é igual a esse valor. Isso retorna todos os produtos com a maior quantidade, incluindo empates (Produto C e Produto E). A subconsulta é executada primeiro, retornando 75, e a consulta externa compara cada linha com esse valor.

Alternativa E — ❌ Incorreta

A alternativa E afirma que nenhuma das alternativas anteriores é correta. Como a alternativa D é válida e atende ao requisito do enunciado, a alternativa E é incorreta.

Gabarito: letra D

Link permanente: /questoes/qa537833