Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FGV 2023

Banco de DadosSQL
Código
fg070748
Banca
FGV
Órgão
SMPOG de Belo Horizonte - MG
Ano
2023
Nível
Superior
Cargo
Analista de Planejamento e Gestão Governamental: Ciência da Computação

ATENÇÃO: Na questão a seguir, considere a tabela T, com colunas A, B e C, descrita a seguir juntamente com a sua instância. 


Imagem da questão


Considere, ainda, o comando SQL a seguir, que referencia a tabela T.


Imagem da questão

Assinale o número de linhas, além dos títulos, produzidas pela execução do comando SQL apresentado anteriormente.
  1. A3 linhas.
  2. B4 linhas.
  3. C5 linhas.
  4. D6 linhas.
Revelar gabarito e comentário

GabaritoB — 4 linhas.

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 B — a conta chega a 4 linhas — alternativa B.

A ideia por trás

O LEFT JOIN é uma operação que combina duas tabelas, mantendo todas as linhas da tabela da esquerda (t1) e acrescentando as colunas da tabela da direita (t2) quando há correspondência. Quando não há correspondência, as colunas de t2 ficam com NULL. A condição de junção define quais linhas são consideradas correspondentes.

A condição de junção aqui é t1.A = t2.A AND t1.B = t2.B AND t1.C = t2.C. Para que duas linhas sejam consideradas iguais, os valores das três colunas devem ser iguais. Um detalhe crucial: NULL nunca é igual a NULL em SQL, então qualquer comparação envolvendo NULL resulta em desconhecido, e a linha não é considerada correspondente.

Esta questão testa se você entende que, mesmo juntando a tabela com ela mesma, a presença de NULL impede a correspondência, e que o LEFT JOIN sempre retorna todas as linhas de t1, mesmo sem par.

O que a questão dá

  • tabela T com 4 linhas: (3,6,10), (1,NULL,10), (3,6,NULL), (3,6,5)

  • comando: SELECT * FROM T t1 LEFT JOIN T t2 ON t1.A = t2.A AND t1.B = t2.B AND t1.C = t2.C

O que queremos: o número de linhas do resultado, além do título

Passo 1 — Verificar a primeira linha (3,6,10)

A primeira linha de t1 é (3,6,10). Procuramos em t2 uma linha com A=3, B=6 e C=10. A própria linha satisfaz a condição, então há correspondência.

Por que esta fórmula: A condição de junção exige igualdade nas três colunas. Como a linha (3,6,10) existe em t2, ela é correspondente.

1 linhanoresultado\boxed{1\ \text{linha} \text{no} \text{resultado}}
NÃO CAIA NESSA!

Pensar que a linha não encontra a si mesma, mas em um LEFT JOIN com a mesma tabela, a linha encontra a si mesma se a condição for verdadeira.

Passo 2 — Verificar a segunda linha (1,NULL,10)

A segunda linha de t1 é (1,NULL,10). Procuramos em t2 uma linha com A=1, B=NULL e C=10. Não existe nenhuma linha com A=1, então não há correspondência.

Por que esta fórmula: A condição exige A=1, mas nenhuma linha de t2 tem A=1. Portanto, a linha de t1 fica sem par.

1 linhanoresultado(comNULLsemt2)\boxed{1\ \text{linha} \text{no} \text{resultado} (\text{com} \text{NULLs} \text{em} \text{t}2)}
NÃO CAIA NESSA!

Tentar comparar NULL com NULL, mas isso nunca é verdadeiro em SQL.

Passo 3 — Verificar a terceira linha (3,6,NULL)

A terceira linha de t1 é (3,6,NULL). Procuramos em t2 uma linha com A=3, B=6 e C=NULL. A condição t1.C = t2.C com NULL não é verdadeira, pois NULL não é igual a NULL. Portanto, não há correspondência.

Por que esta fórmula: A condição de igualdade com NULL resulta em desconhecido, então a linha não é considerada correspondente.

1 linhanoresultado(comNULLsemt2)\boxed{1\ \text{linha} \text{no} \text{resultado} (\text{com} \text{NULLs} \text{em} \text{t}2)}
NÃO CAIA NESSA!

Achar que a linha (3,6,NULL) encontra a si mesma, mas a comparação com NULL falha.

Passo 4 — Verificar a quarta linha (3,6,5)

A quarta linha de t1 é (3,6,5). Procuramos em t2 uma linha com A=3, B=6 e C=5. Não existe nenhuma linha com C=5, então não há correspondência.

Por que esta fórmula: A condição exige C=5, mas nenhuma linha de t2 tem C=5. Portanto, a linha de t1 fica sem par.

1 linhanoresultado(comNULLsemt2)\boxed{1\ \text{linha} \text{no} \text{resultado} (\text{com} \text{NULLs} \text{em} \text{t}2)}
NÃO CAIA NESSA!

Confundir com a linha (3,6,10) e achar que há correspondência.

Passo 5 — Somar as linhas do resultado

Cada linha de t1 gera exatamente uma linha no resultado do LEFT JOIN, pois não há múltiplas correspondências. Somamos as 4 linhas de t1.

Por que esta fórmula: O LEFT JOIN garante que cada linha de t1 apareça pelo menos uma vez. Como nenhuma linha de t1 tem mais de uma correspondência, o total é o número de linhas de t1.

total=1+1+1+1total = 1 + 1 + 1 + 1

De onde vem cada valor: 11 = constante: cada linha de t1 gera uma linha no resultado

total=4=4 linhastotal = 4 = \boxed{4\ \text{linhas}}
NÃO CAIA NESSA!

Contar apenas as linhas com correspondência e esquecer as que ficam com NULL.

Resposta: 4 linhas — alternativa B

Link permanente: /questoes/fg070748