Questão nº 63
Questão de Tecnologia da Informação · FGV SMF-RJ 2023 - Manhã (P1) (nº 63)
Considere a existência de uma tabela relacional N, com apenas uma coluna, intitulada numero, contendo os números inteiros de 1 até 100, um em cada linha, como ilustrada a seguir.
\
Como pode haver discrepâncias entre implementações da linguagem SQL, é dado que a função sqrt(x) retorna a raiz quadrada de x e que a expressão a % b retorna o resto da divisão inteira de a por b.
Este é o resultado produzido por um determinado script SQL que utiliza a tabela N, anteriormente descrita.

Abaixo, são apresentadas três versões para o referido script, não necessariamente corretas.

Sobre essas afirmativas, é correto afirmar que:
- Anenhuma delas produz o resultado correto;
- Bsomente I e II produzem o resultado correto;
- Csomente II e III produzem o resultado correto;
- Dsomente III produz o resultado correto;
- Etodas produzem o resultado correto. (alternativa correta)
Resposta comentada
Gabarito Alternativa E
O agrupamento (GROUP BY) em SQL permite combinar linhas com valores idênticos em uma ou mais colunas, aplicando funções de agregação (como COUNT para contar) a cada grupo. Filtros podem ser aplicados antes do agrupamento com WHERE ou depois do agrupamento com HAVING. Funções como CAST(... AS INT), FLOOR(), e TRUNCATE(..., 0) são usadas para obter a parte inteira de um número. Para números positivos, como as raízes quadradas aqui, essas três funções geralmente produzem o mesmo resultado, que é a parte inteira do número.
- (A) Incorreta: Esta alternativa está incorreta porque, como será demonstrado, todas as três versões do script produzem o resultado correto.
- (B) Incorreta: Esta alternativa está incorreta porque não apenas I e II, mas também a versão III, produzem o resultado correto.
- (C) Incorreta: Esta alternativa está incorreta porque não apenas II e III, mas também a versão I, produzem o resultado correto.
- (D) Incorreta: Esta alternativa está incorreta porque não apenas a versão III, mas também as versões I e II, produzem o resultado correto.
- (E) Correta: Todas as três versões do script produzem o resultado correto.
- A Versão I usa
CAST(sqrt(numero) AS INT)para obter a parte inteira da raiz quadrada e filtra as linhas comWHERE CAST(sqrt(numero) AS INT) < 10antes do agrupamento, excluindo o número 100 (cuja raiz quadrada inteira é 10). - A Versão II usa
FLOOR(sqrt(numero))para a parte inteira e filtra os grupos comHAVING FLOOR(sqrt(numero)) < 10após o agrupamento. Embora o filtro ocorra em uma etapa diferente, o resultado final é o mesmo: o grupo para a raiz quadrada inteira 10 é excluído. - A Versão III usa
TRUNCATE(sqrt(numero), 0)para a parte inteira e filtra as linhas comWHERE TRUNCATE(sqrt(numero), 0) < 10antes do agrupamento. Para números positivos,TRUNCATE(x, 0)é equivalente aFLOOR(x)eCAST(x AS INT).
Em resumo, as três funções (CAST(... AS INT),FLOOR(),TRUNCATE(..., 0)) agem de forma idêntica para obter a parte inteira de números positivos, e tanto oWHEREquanto oHAVINGconseguem filtrar o valor 10 (correspondente ao número 100) de forma a produzir o resultado desejado. A "pegadinha" seria pensar que as pequenas diferenças entre as funções ou entreWHERE/HAVINGlevariam a resultados distintos neste cenário específico.
- A Versão I usa
Fonte: FGV SMF-RJ 2023 - Manhã (P1) Fiscal de Rendas (Caderno Tipo 1). Reproduzida para fins de estudo.
