Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2023

Banco de DadosConsultas e Comandos em SQL
Código
fg161113
Banca
FGV
Órgão
Pref RJ
Ano
2023
Cargo
FR ( )

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.

 

N

numero

1
2
...
99
100
 

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.

 

Analise o comando SQL a seguir, que faz referência à tabela N descrita anteriormente.

 

select n1.numero * n2.numero

from N n1, N n2

where n1.numero <> n2.numero

 

O número de linhas do resultado produzido pela execução desse comando, sem contar a linha de títulos, é:

  1. A9.000
  2. B9.110
  3. C9.900
  4. D9.991
  5. E10.000
Revelar gabarito e comentário

GabaritoC — 9.900

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

Resolução

Gabarito: letra C — a conta chega a 9.900 linhas — alternativa C.

A ideia por trás

Em SQL, quando escrevemos duas tabelas na cláusula FROM separadas por vírgula, estamos pedindo um produto cartesiano: cada linha da primeira tabela é combinada com cada linha da segunda. Se a mesma tabela aparece duas vezes com apelidos diferentes (n1 e n2), é como se fossem duas cópias independentes dela. O resultado é uma tabela gigante com todas as combinações possíveis de uma linha de cada cópia.

O número de linhas do produto cartesiano é o produto do número de linhas de cada tabela: se cada cópia tem 100 linhas, o total é 100 × 100 = 10.000 combinações. A cláusula WHERE funciona como um filtro: ela elimina as linhas que não satisfazem a condição. Aqui a condição é n1.numero <> n2.numero, ou seja, queremos apenas os pares em que os dois números são diferentes. Como cada número de 1 a 100 aparece uma vez em cada cópia, existem exatamente 100 pares em que eles são iguais: (1,1), (2,2), ..., (100,100).

Esta questão testa se você entende que o produto cartesiano conta pares ordenados e que o filtro de desigualdade remove apenas os pares com números iguais. O passo crucial é calcular o total de combinações e subtrair os pares eliminados.

O que a questão dá

  • tabela N com 100 linhas (números de 1 a 100)

  • comando: SELECT n1.numero * n2.numero FROM N n1, N n2 WHERE n1.numero <> n2.numero

O que queremos: o número de linhas do resultado do comando SQL

Passo 1 — Calcular o total de combinações do produto cartesiano

O comando usa duas referências à mesma tabela (N n1 e N n2) sem condição de junção, então o SQL gera o produto cartesiano: cada linha de n1 é combinada com cada linha de n2. Para saber quantas linhas o resultado terá antes do filtro, multiplicamos o número de linhas de cada lado.

Por que esta fórmula: O produto cartesiano entre duas tabelas com m e n linhas tem m × n linhas. Aqui ambas as cópias têm 100 linhas.

total=100×100total = 100 \times 100

De onde vem cada valor: 100100 = enunciado: a tabela N contém os números de 1 a 100, um por linha

total=100×100=10.000 combinac\co~estotal = 100 \times 100 = \boxed{10.000\ \text{combina}çõ\text{es}}
NÃO CAIA NESSA!

Esquecer que são duas cópias da mesma tabela e contar apenas 100 linhas no total

Passo 2 — Contar os pares eliminados pela condição de desigualdade

O filtro WHERE n1.numero <> n2.numero remove as linhas em que os dois números são iguais. Precisamos saber quantas dessas linhas existem para subtrair do total.

Por que esta fórmula: Cada número de 1 a 100 aparece exatamente uma vez em cada cópia da tabela. Portanto, para cada número k, existe exatamente um par (k, k) no produto cartesiano. Como há 100 números distintos, há 100 pares iguais.

paresiguais=100pares_iguais = 100

De onde vem cada valor: 100100 = enunciado: a tabela N contém os números de 1 a 100

paresiguais=100=100 parespares_iguais = 100 = \boxed{100\ \text{pares}}
NÃO CAIA NESSA!

Pensar que são 99 pares ou que a ordem importa para os pares iguais — mas (1,1) é o mesmo par independentemente da ordem

Passo 3 — Subtrair os pares iguais do total

O resultado final é o total de combinações menos as que foram filtradas. Como o filtro elimina exatamente os pares com números iguais, subtraímos 100 de 10.000.

Por que esta fórmula: A contagem final é o total de pares ordenados distintos que satisfazem a condição. Como o produto cartesiano tem 10.000 pares e 100 são excluídos, restam 10.000 − 100.

resultado=10000100resultado = 10000 - 100

De onde vem cada valor: 1000010000 = passo 1: total de combinações · 100100 = passo 2: pares iguais

resultado=10000100=9.900 linhasresultado = 10000 - 100 = \boxed{9.900\ \text{linhas}}
NÃO CAIA NESSA!

Esquecer de subtrair e marcar 10.000 (alternativa E), ou subtrair 1000 por engano

Resposta: 9.900 linhas — alternativa C

Link permanente: /questoes/fg161113