Pular para o conteúdo principal

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

Banco de DadosSQL
Código
fg059292
Banca
FGV
Órgão
AL-MA
Ano
2023
Nível
Superior
Cargo
Técnico de Gestão Administrativa - Analista de Suporte de Rede
O banco de dados relacional de uma escola contém as tabelas denominadas TB_STUDENT_A e TB_STUDENT_B e ambas possuem apenas as colunas ID e NAME.O conteúdo dessas tabelas está detalhado a seguir:Imagem associada para resolução da questãoAnalise a seguinte consulta em linguagem SQL:SELECT * FROM TB_STUDENT_A LEFT JOIN TB_STUDENT_B ON TB_STUDENT_A.NAME=TB_STUDENT_B.NAME. O número de linhas do resultado produzido pela execução deste comando SQL sobre o banco de dados desta escola, excetuada a linha de títulos, é:
  1. A2.
  2. B3.
  3. C4.
  4. D5.
  5. E6.
Revelar gabarito e comentário

GabaritoD — 5.

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 D — a conta chega a 7 linhas — alternativa E.

A ideia por trás

O LEFT JOIN é uma operação que combina duas tabelas, preservando todas as linhas da tabela da esquerda. Para cada linha da esquerda, ele procura linhas da direita que satisfaçam a condição do ON; se encontrar, junta os dados; se não encontrar, preenche as colunas da direita com NULL. O resultado é uma tabela com todas as colunas das duas originais.

O número de linhas do resultado é a soma, para cada linha da esquerda, do número de correspondências na direita (mínimo 1, pois a linha da esquerda é preservada). Se houver duplicidade na direita, uma linha da esquerda pode gerar várias linhas no resultado. Isso é diferente do INNER JOIN, que descarta linhas sem correspondência.

Esta questão cobra exatamente a contagem de linhas resultante de um LEFT JOIN, incluindo o efeito de duplicidades na tabela da direita e a preservação de linhas sem correspondência.

O que a questão dá

  • TB_STUDENT_A: (1,'A'), (2,'A'), (3,'B'), (4,'C'), (5,'C')

  • TB_STUDENT_B: (1,'A'), (2,'A'), (3,'B'), (4,'D')

  • condição de junção: TB_STUDENT_A.NAME = TB_STUDENT_B.NAME

O que queremos: o número de linhas do resultado do LEFT JOIN

Passo 1 — Listar as linhas da tabela da esquerda

O LEFT JOIN preserva todas as linhas da tabela da esquerda, então precisamos saber quantas são e quais são seus valores de NAME para depois contar as correspondências.

5 linhas: (1,'A'), (2,'A'), (3,'B'), (4,'C'), (5,'C')

NÃO CAIA NESSA!

Esquecer que a tabela da esquerda tem 5 linhas e contar apenas as da direita (4).

Passo 2 — Contar correspondências na direita para cada NAME

Para cada linha da esquerda, o LEFT JOIN procura linhas da direita com o mesmo NAME. Precisamos saber quantas correspondências existem para cada NAME, pois isso determina quantas linhas o resultado terá para cada linha da esquerda.

Por que esta fórmula: A contagem é feita por inspeção dos dados: para cada NAME presente na esquerda, contamos quantas linhas da direita têm esse NAME.

NAME 'A': 2 correspondências; NAME 'B': 1 correspondência; NAME 'C': 0 correspondências

NÃO CAIA NESSA!

Contar apenas as linhas da direita que têm correspondência, esquecendo que 'C' não tem par.

Passo 3 — Calcular o total de linhas do resultado

O resultado do LEFT JOIN terá uma linha para cada combinação entre uma linha da esquerda e uma linha da direita que satisfaz a condição, mais uma linha com NULLs para cada linha da esquerda sem correspondência. Somamos as contribuições de cada linha da esquerda.

Por que esta fórmula: A fórmula é a soma das correspondências de cada linha da esquerda, com mínimo de 1 por linha (quando não há correspondência, conta-se 1 linha com NULLs).

total=linhaesquerdamax(1,correspondeˆncias)total = \sum_{linha \in esquerda} \max(1, \text{correspondências})

De onde vem cada valor: linhalinha = passo 1 · corresponde^nciascorrespondências = passo 2

total=2+2+1+1+1=7 linhastotal = 2 + 2 + 1 + 1 + 1 = \boxed{7\ \text{linhas}}
NÃO CAIA NESSA!

Esquecer de incluir as linhas sem correspondência (as duas com NAME 'C') e contar apenas 2+2+1 = 5, mas por caminho errado; ou contar apenas as linhas da direita (4).

Resposta: 7 linhas — alternativa E

Link permanente: /questoes/fg059292