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:
Função de agregação MAX: retorna o maior valor de uma coluna. No exemplo, MAX(quantidade) retorna 75.
Subconsulta: é uma consulta aninhada dentro de outra. A subconsulta (SELECT MAX(quantidade) FROM produtos) é executada primeiro e retorna o valor 75.
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