Pular para o conteúdo principal

Questão de Banco de Dados — Banco de Dados Relacionais — FUNDATEC 2023

Banco de DadosBanco de Dados Relacionais
Código
qq892785
Banca
FUNDATEC
Órgão
GHC-RS
Ano
2023
Nível
Médio
Cargo
Programador

Para responder à questão, considere um banco de dados relacional que possui duas tabelas, chamadas de tabela_a e tabela_b, contendo o formato e os valores abaixo: 


Imagem da questão

Foi executado o seguinte comando:select * from tabela_a a join tabela_b b on a.id=b.id_a;Logo após, foi executado outro comando:select * from tabela_a a left join tabela_b b on a.id=b.id_a;O que o último comando retorna de diferente em relação ao primeiro comando?
  1. ANada, os retornos são exatamente iguais.
  2. BRetorna o mesmo, mas sem as primeiras duas linhas do primeiro comando.
  3. CRetorna o mesmo, mas sem as últimas duas linhas do primeiro comando.
  4. DRetorna duas linhas a mais com os valores 6 e 5, cada uma, nos campos destinados à tabela_a.id.
  5. ERetorna três linhas a mais com os valores 3, 4 e 5, cada uma, e valores nulos nos campos tabela_a.id e tabela_a.id_b.
Revelar gabarito e comentário

GabaritoD — Retorna duas linhas a mais com os valores 6 e 5, cada uma, nos campos destinados à tabela_a.id.

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

Junções SQL: INNER JOIN × LEFT JOIN

Gabarito: letra D. O LEFT JOIN retorna todas as linhas da tabela da esquerda (tabela_a), mesmo aquelas sem correspondência na tabela da direita (tabela_b), preenchendo com NULL os campos da tabela sem par. Como o JOIN (INNER JOIN) retorna apenas as linhas com correspondência em ambas as tabelas, a diferença são exatamente as linhas da tabela_a que não têm par na tabela_b — que, neste caso, são duas linhas com os valores 6 e 5 na coluna tabela_a.id.

A questão exige compreender a diferença entre a junção interna (JOIN/INNER JOIN) e a junção externa à esquerda (LEFT JOIN). O JOIN é a operação mais comum: ele combina linhas de duas tabelas somente quando a condição de junção é satisfeita — ou seja, retorna apenas os pares que têm correspondência. Já o LEFT JOIN é uma junção externa: ele retorna todas as linhas da tabela à esquerda do comando, e, para cada linha sem correspondência na tabela da direita, preenche os campos desta com NULL. É essa preservação das linhas sem par que diferencia os dois comandos.

Vamos aplicar isso aos dados do enunciado. A tabela_a possui os valores de id iguais a 1, 2, 3, 4, 5 e 6. A tabela_b possui os valores de id_a iguais a 1, 2, 3 e 4. A condição de junção é a.id = b.id_a. No JOIN (primeiro comando), apenas os id que existem em ambas as tabelas serão retornados: 1, 2, 3 e 4. As linhas com id 5 e 6 da tabela_a não têm correspondência na tabela_b, portanto são descartadas. No LEFT JOIN (segundo comando), essas duas linhas (5 e 6) são preservadas, e os campos da tabela_b (incluindo id_a) são preenchidos com NULL. Assim, o segundo comando retorna duas linhas a mais que o primeiro, exatamente com os valores 6 e 5 na coluna tabela_a.id.

A pegadinha da banca está em confundir o LEFT JOIN com o RIGHT JOIN ou com o FULL OUTER JOIN. O RIGHT JOIN preservaria as linhas da tabela da direita (tabela_b) sem correspondência na esquerda — o que não é o caso, pois todos os id_a da tabela_b têm par na tabela_a. O FULL OUTER JOIN preservaria linhas de ambas as tabelas. Além disso, a alternativa E tenta confundir ao mencionar valores 3, 4 e 5, mas o valor 3 tem correspondência (existe id_a = 3 na tabela_b), então não gera linha extra. A alternativa D é a única que descreve corretamente o comportamento do LEFT JOIN neste cenário.

Guarde a distinção central: JOIN = interseção (só pares); LEFT JOIN = todos da esquerda + pares da direita (com NULL onde não há par). É exatamente essa fronteira que as alternativas exploram.

Alternativa A — ❌ Incorreta

Afirma que os retornos são exatamente iguais. Isso é falso: o LEFT JOIN preserva as linhas da tabela da esquerda sem correspondência, enquanto o JOIN as descarta. A diferença é justamente o que a questão pede.

Alternativa B — ❌ Incorreta

Afirma que o LEFT JOIN retorna o mesmo, mas sem as primeiras duas linhas do primeiro comando. Isso inverte o comportamento: o LEFT JOIN adiciona linhas (as sem par), não remove. As primeiras linhas (com id 1 e 2) têm correspondência e aparecem em ambos os comandos.

Alternativa C — ❌ Incorreta

Afirma que o LEFT JOIN retorna o mesmo, mas sem as últimas duas linhas do primeiro comando. Novamente, o LEFT JOIN não remove linhas; ele adiciona as linhas sem correspondência. As últimas linhas do JOIN (com id 3 e 4) também aparecem no LEFT JOIN.

Alternativa D — ✅ Correta ⟵ GABARITO

Descreve exatamente o comportamento do LEFT JOIN: retorna duas linhas a mais (as linhas com id 6 e 5 da tabela_a, que não têm par na tabela_b), com os valores 6 e 5 na coluna tabela_a.id. Os campos da tabela_b (incluindo id_a) são preenchidos com NULL nessas linhas.

Alternativa E — ❌ Incorreta

Afirma que retorna três linhas a mais com os valores 3, 4 e 5. Isso está errado por dois motivos: (1) o valor 3 tem correspondência na tabela_b (id_a = 3), então não gera linha extra; (2) o LEFT JOIN preserva apenas as linhas da esquerda sem par, que são apenas as de id 5 e 6 — duas linhas, não três. Além disso, a alternativa menciona "valores nulos nos campos tabela_a.id e tabela_a.id_b", o que é um erro conceitual: os campos nulos são os da tabela_b, não os da tabela_a.

Gabarito: letra D — o LEFT JOIN retorna duas linhas a mais que o JOIN, correspondentes aos registros da tabela_a sem correspondência na tabela_b (ids 6 e 5).

Link permanente: /questoes/qq892785