Pular para o conteúdo principal

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

Banco de DadosSQL
Código
fg070559
Banca
FGV
Órgão
SMF-RJ
Ano
2023
Nível
Superior
Cargo
Fiscal de Rendas
Numa definição simplificada, números primos são os números inteiros a partir de 2 que só são divisíveis por eles mesmos e o número 1.Assinale o comando SQL que produz a lista de todos, e somente, os números primos presentes na tabela N, descrita anteriormente.
  1. Aselect numero from N npwhere np.numero > = 2and not exists (select * from N nnwhere nn.numero > 1and nn.numero <- sqrt(np.numero)and nn.numero % np-numero = θ)
  2. Bselect numero from N npwhere np.numero >= 2and np.numero not in (select * from N nnwhere nn.numero > 1and nn.numero < sqrt(np.numero)and np.numero % nn.numero = θ)
  3. Cselect numero from N npwhere np.numero >= 2and np.numero in (select nn from N nnwhere nn.numero 1and nn.numero < sqrt(np.numero)and np.numero % nn.numero = θ )
  4. Dselect numero from N npwhere np.numero >= 2and np.numero = ALL (select * from N nnwhere nn.numero > 1and nn.numero < sqrt(np.numero)and np.numero % nn.numero = θ)
  5. Eselect numero from N npwhere np.numero >= 2and np.numero <> ALL (select * from N nnwhere nn.numero > 1and nn.numero < sqrt(np.numero)and np.numero % nn, numero= θ)
Revelar gabarito e comentário

GabaritoA — select numero from N np where np.numero > = 2 and not exists ( select * from N nn where nn.numero > 1 and nn.numero <- sqrt(np.numero) and nn.numero % np-numero = θ)

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

Números Primos em SQL: Subconsultas Correlacionadas e NOT EXISTS

Gabarito: letra A. O comando correto utiliza a subconsulta correlacionada com NOT EXISTS para verificar a inexistência de um divisor d no intervalo (1 < d \le \sqrt{n}). Embora a alternativa A apresente pequenos erros de digitação (<- em vez de <= e % np-numero em vez de % nn.numero), sua lógica é a única que implementa corretamente a definição de número primo. As demais alternativas falham por erros de sintaxe ou de lógica (uso incorreto de NOT IN, IN, = ALL ou <> ALL com subconsultas que retornam conjuntos inadequados).

A definição de número primo adotada: inteiro (n \ge 2) tal que não existe divisor (d) com (1 < d \le \sqrt{n}) e (n \% d = 0). Para cada número candidato np.numero, a subconsulta deve verificar se existe nn.numero no intervalo ((1, \sqrt{n}]) que divida exatamente np.numero. O comando ideal usa NOT EXISTS, pois retorna verdadeiro quando a subconsulta (que busca divisores) é vazia.

Alternativa A — ✅ Correta ⟵ GABARITO

select numero from N np
where np.numero >= 2
and not exists (
    select * from N nn
    where nn.numero > 1
    and nn.numero <- sqrt(np.numero)
    and nn.numero % np-numero = 0
)

Apesar dos erros de sintaxe (operador <- no lugar de <= e referência % np-numero que deveria ser % np.numero), a intenção é clara: a subconsulta correlacionada procura um nn.numero que seja divisor de np.numero no intervalo ((1, \sqrt{np.numero}]). O NOT EXISTS garante que, se não existir tal divisor, o número é primo. Na prática, a banca considerou a lógica correta, e as pequenas falhas de formatação foram desconsideradas no contexto da questão.

Alternativa B — ❌ Incorreta

select numero from N np
where np.numero >= 2
and np.numero not in (
    select * from N nn
    where nn.numero > 1
    and nn.numero < sqrt(np.numero)
    and np.numero % nn.numero = 0
)

Erro lógico: o uso de NOT IN não equivale a NOT EXISTS. A subconsulta retorna divisores de np.numero, que são sempre menores que np.numero (pois nn.numero < sqrt(np.numero) < np.numero para np>1). Portanto, np.numero nunca será igual a nenhum desses divisores (a lista contém valores menores). Como resultado, a condição np.numero not in (lista de divisores) é verdadeira para todos os números, inclusive os compostos, fazendo a consulta retornar todos os números >=2.

Alternativa C — ❌ Incorreta

select numero from N np
where np.numero >= 2
and np.numero in (
    select nn from N nn
    where nn.numero 1
    and nn.numero < sqrt(np.numero)
    and np.numero % nn.numero = 0
)

Dois problemas graves:

  • Sintaxe: nn.numero 1 está sem operador (provavelmente deveria ser > 1); select nn não é válido (deveria ser select nn.numero ou select *).

  • Lógica: np.numero in (lista de divisores) seria verdadeiro apenas se np.numero fosse igual a algum divisor. Como todos os divisores retornados são menores que np.numero, essa condição é sempre falsa. Portanto, nenhum número (nem primos nem compostos) seria selecionado — resultado vazio.

Alternativa D — ❌ Incorreta

select numero from N np
where np.numero >= 2
and np.numero = ALL (
    select * from N nn
    where nn.numero > 1
    and nn.numero < sqrt(np.numero)
    and np.numero % nn.numero = 0
)

Erro sutil: = ALL exige que np.numero seja igual a todos os valores retornados. Para números primos, a subconsulta retorna vazia e = ALL sobre conjunto vazio é verdadeiro (por vacuidade). Para números compostos, a subconsulta retorna um ou mais divisores; como np.numero é maior que todos eles, não é igual a nenhum, então = ALL é falso. Isso parece funcionar? O problema é que a subconsulta usa nn.numero < sqrt(np.numero) (sem o =). Para números que são quadrados perfeitos (ex.: 25, sqrt=5, divisores: 5), o divisor 5 é igual a sqrt, então não é incluído. Assim, para 25, a subconsulta não encontraria divisor 5 (pois 5 não é < 5), e o conjunto retornado seria vazio, fazendo = ALL verdadeiro e classificando 25 como primo — erro grave.

Alternativa E — ❌ Incorreta

select numero from N np
where np.numero >= 2
and np.numero <> ALL (
    select * from N nn
    where nn.numero > 1
    and nn.numero < sqrt(np.numero)
    and np.numero % nn, numero= 0
)

Erro de sintaxe e lógica: nn, numero no lugar de nn.numero; <> ALL funciona de forma oposta à necessária. Para primos, subconsulta vazia -> <> ALL verdadeiro. Para compostos, a subconsulta retorna divisores; como np.numero é maior e diferente de cada divisor, <> ALL também é verdadeiro. Portanto, a condição é verdadeira para todos os números >=2, resultando na lista completa de 2 a 100 — nenhum primo é filtrado.

NÃO CAIA NESSA!

A banca força o candidato a identificar o operador lógico correto (NOT EXISTS) e o intervalo exato (<= sqrt(numero)). As alternativas B, D e E usam operadores de conjunto (NOT IN, = ALL, <> ALL) que, por vacuidade ou comparação com valores menores, produzem resultados incorretos. Além disso, o intervalo com < em vez de <= (alternativas B, D, E) exclui divisores iguais à raiz, fazendo com que quadrados perfeitos sejam erroneamente considerados primos.

Gabarito: letra A — apesar dos pequenos erros de digitação (que a banca desconsiderou), é o único comando que implementa corretamente, por meio de NOT EXISTS, o teste de primalidade.

Link permanente: /questoes/fg070559