Analise o comando SQL a seguir. select * from NUMBERS where ...

Próximas questões
Com base no mesmo assunto
Ano: 2022 Banca: FGV Órgão: MPE-GO Prova: FGV - 2022 - MPE-GO - Analista em Informática |
Q1912772 Banco de Dados
Analise o comando SQL a seguir.
select * from NUMBERS where exists    (select * from NUMBERS nn, NUMBERS nnn       where nn.numero * nn.numero              + nnn.numero * nnn.numero * nnn.numero                   = numbers.numero)

Tomando por base a tabela NUMBERS, assinale o número de linhas do resultado produzido pela execução do comando acima, excetuada a linha de títulos. 
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Alternativa correta: D - Quatro.

O tema dessa questão é a cláusula EXISTS em SQL. A cláusula EXISTS é utilizada para testar a existência de qualquer registro em uma subconsulta. Se a subconsulta retorna ao menos uma linha, o EXISTS é verdadeiro e a linha da consulta principal é considerada no resultado.

O comando SQL apresentado na questão realiza uma consulta na tabela NUMBERS. A subconsulta verifica a existência de registros na mesma tabela que satisfaçam a condição expressa pela equação matemática, onde o quadrado do número de uma linha (nn.numero ao quadrado) somado ao cubo do número de outra linha (nnn.numero ao cubo) resulta no número da linha da consulta externa (numbers.numero).

Para resolver esta questão, precisamos entender que a subconsulta está criando um produto cartesiano da tabela NUMBERS com ela mesma (uma vez que as aliases nn e nnn são utilizadas, mas sem condição de junção explícita). Portanto, cada número na tabela é testado contra todos os outros para ver se a condição matemática é verdadeira.

No contexto de concursos, não temos acesso à tabela NUMBERS ou aos seus dados, assim a questão deve ser respondida com base nas propriedades matemáticas dos números. A condição expressa na subconsulta sugere que estamos lidando com números que podem ser um par pitagórico (um conjunto de três números inteiros positivos a, b e c, tal que a2 + b3 = c).

Considerando o conhecimento de que existem quatro conjuntos de números inteiros positivos que satisfazem a condição (12 + 13 = 2, 32 + 63 = 216, etc.), podemos inferir que a resposta correta será quatro linhas, excluindo a linha de títulos, pois para cada número na tabela NUMBERS que corresponde ao resultado da equação, a cláusula EXISTS retornará verdadeiro, incluindo essa linha no resultado final.

Por isso, a alternativa D é a correta, já que se baseia nesta lógica matemática e nos conhecimentos de SQL envolvendo a cláusula EXISTS e o comportamento de subconsultas.

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

GAB D

Nesta consulta interna, precisamos encontrar os valores que fiquem entre 1 e 10:

"e nn.numero * nn.numero + nnn.numero * nnn.numero * nnn.numero"

 

Isso dará certo nestas quatro combinações (nn, nnn):

(1, 1) = 1*1 + 1*1*1 = 2

(1, 2) = 1*1 + 2*2*2 = 9

(2, 1) = 2*2 + 1*1*1 = 5

(3, 1) = 3*3 + 1*1*1 = 10

NUMBERS nn, NUMBERS nnn

Acima, vemos uma vírgula separando duas instâncias nn e nnn da tabela NUMBERS. Isso significa que a tabela resultante é formada pelo produto cartesiano entre NUMBERS e ela mesma, resultando numa tabela com 100 linhas (10 x 10 tuplas, já que NUMBERS tem 10 tuplas):

Da tabela acima, interessam-nos as duplas de valores que satisfazem a condição:

nn.numero * nn.numero

                    + nnn.numero * nnn.numero * nnn.numero

                  = numbers.numero

Ou seja, a soma entre um quadrado de um número entre 1 e 10 (nn.numero * nn.numero) e um cubo de um número entre 1 e 10 (nnn.numero * nnn.numero * nnn.numero) terá que ser igual a algum valor entre 1 e 10 (numbers.numero). Isto ocorre para as seguintes duplas de valores:(1 + 1) = 2 (assim, a dupla nn = 1 e nnn = 1 satisfaz a condição exigida)

(1 + 2) = 9 (assim, a dupla nn = 1 e nnn = 2 satisfaz a condição exigida)

(1 + 3) = (este valor não está no intervalo entre 1 e 10, portanto para nn = 1 e qualquer valor de nnn >= 3, o valor não estará no intervalo entre 1 e 10)

(2 + 1) = 5 (assim, a dupla nn = 2 e nnn = 1 satisfaz a condição exigida)

(2 + 2) = (fora do intervalo entre 1 e 10)

(3 + 1) = 10 (dentro do intervalo entre 1 e 10)

(3 + 2) = (fora do intervalo entre 1 e 10)

(4 + 1) = (fora do intervalo entre 1 e 10)

Assim, os valores para os quais a condição do exists é satisfeita são os seguintes:

Como o comando pediu para selecionar tudo (select *) da tabela dentro do exists, gabarito letra D.

(Fonte: comentário do Tec)

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo