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
fg161109
Banca
FGV
Órgão
DPE RS
Ano
2023
Cargo
Ana ( )

Tabela R1

Na questão a seguir, considere a tabela R1, cuja instância é exibida a seguir.

ABC
1020

31

10NULL

32

1120

NULL

129

31

148

NULL

Com referência à tabela R1 descrita anteriormente, analise o comando SQL a seguir.

 

select * from R1 x, R1 y

where x.A > y.A and x.B = y.B

 

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

  1. A0;
  2. B1;
  3. C2;
  4. D3;
  5. E4.
Revelar gabarito e comentário

GabaritoB — 1;

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

SQL: produto cartesiano com condição de junção (self-join)

Gabarito: letra B — a execução do comando produz 1 linha. O comando select * from R1 x, R1 y where x.A > y.A and x.B = y.B é um produto cartesiano da tabela R1 consigo mesma (self-join), filtrado pela condição de que o valor de A da linha x seja maior que o de y e que os valores de B sejam iguais. Como a coluna B contém valores NULL, e comparações com NULL resultam em UNKNOWN (não verdadeiro), as linhas com B nulo são automaticamente excluídas do resultado.

O comando SQL apresentado é um produto cartesiano (junção implícita, sem cláusula JOIN explícita) entre a tabela R1 e ela mesma, usando os apelidos x e y. Isso significa que cada linha da tabela x é combinada com cada linha da tabela y, gerando inicialmente 5 × 5 = 25 combinações possíveis. Em seguida, a cláusula WHERE filtra essas combinações, exigindo duas condições simultâneas: x.A > y.A e x.B = y.B.

O ponto central da questão está no tratamento de valores NULL. Em SQL, NULL representa um valor desconhecido, e qualquer comparação envolvendo NULL (como x.B = y.B quando um dos lados é NULL) resulta em UNKNOWN, que é tratado como falso na cláusula WHERE. Portanto, todas as linhas em que x.B ou y.B seja NULL são descartadas, independentemente dos valores de A. Isso reduz drasticamente as combinações possíveis.

Vamos analisar a tabela R1 linha por linha:

Linha

A

B

C

1

10

20

31

2

10

NULL

32

3

11

20

NULL

4

12

9

31

5

14

8

NULL

Para que uma combinação (x, y) seja incluída no resultado, precisamos que x.B = y.B e que ambos sejam diferentes de NULL. As linhas com B não nulo são: linha 1 (B=20), linha 3 (B=20), linha 4 (B=9) e linha 5 (B=8). A linha 2 tem B nulo e é excluída de qualquer par.

Agora, para cada par de linhas com B não nulo, verificamos a condição x.A > y.A:

  • x=1 (A=10, B=20) com y=1 (A=10, B=20): 10 > 10? Não.

  • x=1 (A=10, B=20) com y=3 (A=11, B=20): 10 > 11? Não.

  • x=3 (A=11, B=20) com y=1 (A=10, B=20): 11 > 10? Sim. E B=20 = B=20. Conta!

  • x=3 (A=11, B=20) com y=3 (A=11, B=20): 11 > 11? Não.

  • x=4 (A=12, B=9) com y=4 (A=12, B=9): 12 > 12? Não.

  • x=5 (A=14, B=8) com y=5 (A=14, B=8): 14 > 14? Não.

Nenhum outro par tem B igual (pois B=20 só aparece nas linhas 1 e 3; B=9 só na linha 4; B=8 só na linha 5). Portanto, apenas 1 combinação satisfaz ambas as condições: x=3 e y=1.

NÃO CAIA NESSA!

A banca tenta fazer o candidato contar todas as combinações possíveis (25) e esquecer que NULL não participa de comparações. Em SQL, NULL = NULL não é verdadeiro — é UNKNOWN. Por isso, linhas com B nulo são invisíveis para a condição x.B = y.B. Além disso, a condição x.A > y.A exige que os valores de A sejam estritamente maiores, eliminando pares com A igual. O candidato que não lembrar do comportamento do NULL pode marcar 4 ou 5, mas a resposta correta é 1.

Alternativa A — ❌ Incorreta

Afirma que o comando produz 0 linhas. Isso estaria correto se nenhum par satisfizesse as condições, mas existe exatamente um par: x=3 (A=11, B=20) e y=1 (A=10, B=20). A condição x.A > y.A (11 > 10) é verdadeira e x.B = y.B (20 = 20) também. Portanto, há pelo menos uma linha no resultado.

Alternativa B — ✅ Correta ⟵ GABARITO

O comando produz exatamente 1 linha. O par que satisfaz as condições é x=3 e y=1. Nenhum outro par de linhas com B não nulo atende x.A > y.A e x.B = y.B simultaneamente. As linhas com B nulo (linha 2) são excluídas porque comparações com NULL resultam em UNKNOWN, que é tratado como falso no WHERE.

Alternativa C — ❌ Incorreta

Afirma que o comando produz 2 linhas. Isso ocorreria se houvesse dois pares distintos satisfazendo as condições. No entanto, apenas o par (x=3, y=1) atende. O candidato pode ter contado também o par (x=1, y=3), mas a condição x.A > y.A falha (10 > 11 é falso). Portanto, não há segunda linha.

Alternativa D — ❌ Incorreta

Afirma que o comando produz 3 linhas. Isso seria possível se houvesse três pares com B igual e A estritamente maior. Mas, na tabela, os valores de B não nulos são 20 (linhas 1 e 3), 9 (linha 4) e 8 (linha 5). Apenas o par (x=3, y=1) tem B igual e A maior. Os outros pares com B igual (x=1, y=3) falham na condição de A. Portanto, não há 3 linhas.

Alternativa E — ❌ Incorreta

Afirma que o comando produz 4 linhas. Isso seria o número de linhas com B não nulo (4), mas não é o número de pares que satisfazem a condição. A condição x.A > y.A elimina a maioria dos pares. Apenas 1 par atende. O candidato pode ter contado as linhas com B não nulo, mas esqueceu de aplicar a condição de A.

Gabarito: letra B

Link permanente: /questoes/fg161109