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