Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2023
Banco de Dados›Consultas 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, é:
A9.000
B9.110
C9.900
D9.991
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.
De onde vem cada valor: = enunciado: a tabela N contém os números de 1 a 100, um por linha
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.
De onde vem cada valor: = enunciado: a tabela N contém os números de 1 a 100
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.
De onde vem cada valor: = passo 1: total de combinações · = passo 2: pares iguais
NÃO CAIA NESSA!
Esquecer de subtrair e marcar 10.000 (alternativa E), ou subtrair 1000 por engano