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.
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 = θ)
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 = θ)
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 = θ )
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 = θ)
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.