Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2025

Banco de DadosConsultas e Comandos em SQL
Código
qa699064
Banca
FUNDATEC
Órgão
PROCERGS
Ano
2025
Cargo
ANC ( )

No SGBD Microsoft SQL Server 2019, existem as seguintes tabelas:

 
Tabela ATabela B
AB
13
24
35
46
 

Foi executada uma query SQL que retornou o seguinte resultado, onde null representa uma célula vazia:

 

Resultado 

A B 

3 3

4 4

null 5

null 6

 

Qual a query correta que retornaria o resultado acima?

  1. Aselect * from a LEFT OUTER JOIN b on a.a = b.b;
  2. Bselect * from a RIGHT OUTER JOIN b on a.a = b.b;
  3. Cselect * from a INNER JOIN b on a.a = b.b;
  4. Dselect * from a FULL OUTER JOIN b on a.a = b.b;
  5. Eselect * from a FULL INNER JOIN b on a.a = b.b;
Revelar gabarito e comentário

GabaritoB — select * from a RIGHT OUTER JOIN b on a.a = b.b;

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: LEFT, RIGHT, INNER e FULL OUTER JOIN

Gabarito: letra B. A query select * from a RIGHT OUTER JOIN b on a.a = b.b; é a única que produz exatamente o resultado apresentado: todas as linhas da tabela B (direita) preservadas, com os valores correspondentes da tabela A (esquerda) quando há correspondência, e NULL quando não há. O RIGHT OUTER JOIN garante que todos os registros da tabela à direita apareçam no resultado, preenchendo com NULL os campos da tabela à esquerda que não encontram par.

O conceito central aqui é o de junção externa (OUTER JOIN). Diferente da junção interna (INNER JOIN), que só retorna linhas com correspondência nas duas tabelas, a junção externa preserva as linhas de uma ou de ambas as tabelas mesmo quando não há par na outra. No SQL Server, existem três variações: LEFT OUTER JOIN (preserva a tabela da esquerda), RIGHT OUTER JOIN (preserva a da direita) e FULL OUTER JOIN (preserva ambas). A palavra OUTER é opcional — LEFT JOIN, RIGHT JOIN e FULL JOIN são equivalentes.

Vamos aplicar isso aos dados do enunciado. A tabela A tem os valores 1, 2, 3, 4 na coluna A; a tabela B tem 3, 4, 5, 6 na coluna B. A condição de junção é a.a = b.b, ou seja, igualdade entre os valores das duas colunas. Os valores que existem nas duas tabelas são 3 e 4 — esses formam as linhas com correspondência. Os valores 5 e 6 existem apenas na tabela B, e os valores 1 e 2 existem apenas na tabela A.

O resultado esperado mostra as linhas (3,3), (4,4), (null,5) e (null,6). Repare que as duas primeiras linhas têm valores nas duas colunas — são os pares encontrados. As duas últimas têm NULL na coluna A e valores 5 e 6 na coluna B — são registros da tabela B que não têm correspondência na tabela A. Isso é exatamente o comportamento do RIGHT OUTER JOIN: ele preserva todos os registros da tabela da direita (B), inclusive aqueles sem par na esquerda, preenchendo com NULL os campos da esquerda. Os valores 1 e 2 da tabela A não aparecem porque não têm correspondência em B — e o RIGHT JOIN não os preserva.

A pegadinha clássica desta questão é a inversão entre LEFT e RIGHT. Muitos candidatos leem o resultado e pensam em LEFT JOIN, mas o LEFT JOIN preservaria a tabela A, trazendo (1,null), (2,null), (3,3), (4,4) — exatamente o oposto do que o resultado mostra. A banca explora justamente essa confusão entre qual tabela é preservada em cada tipo de junção. Guarde a regra: LEFT preserva a tabela que está à esquerda na cláusula FROM; RIGHT preserva a que está à direita na cláusula JOIN.

Para visualizar a diferença entre as junções, observe o diagrama abaixo — ele mostra qual região de cada tabela é retornada em cada tipo de junção:

Agora, analisemos cada alternativa à luz desse critério: qual tabela é preservada e o que acontece com as linhas sem correspondência.

Critério

LEFT JOIN (A)

RIGHT JOIN (B) ✅

INNER JOIN (C)

FULL JOIN (D)

Tabela preservada

Esquerda (A)

Direita (B)

Nenhuma (só interseção)

Ambas (A e B)

Linhas com correspondência (3,3 e 4,4)

✅ Incluídas

✅ Incluídas

✅ Incluídas

✅ Incluídas

Linhas sem par da tabela A (1 e 2)

✅ Incluídas com NULL em B

❌ Excluídas

❌ Excluídas

✅ Incluídas com NULL em B

Linhas sem par da tabela B (5 e 6)

❌ Excluídas

✅ Incluídas com NULL em A

❌ Excluídas

✅ Incluídas com NULL em A

Total de linhas no resultado

4 (1,null), (2,null), (3,3), (4,4)

4 (3,3), (4,4), (null,5), (null,6)

2 (3,3), (4,4)

6 (1,null), (2,null), (3,3), (4,4), (null,5), (null,6)

Bate com o resultado esperado?

❌ Não

✅ Sim

❌ Não

❌ Não

Alternativa A — ❌ Incorreta

select * from a LEFT OUTER JOIN b on a.a = b.b; preservaria todos os registros da tabela A (esquerda). Como A tem os valores 1, 2, 3, 4, o resultado incluiria (1,null), (2,null), (3,3), (4,4). Isso não bate com o resultado esperado, que traz NULL na coluna A — não na coluna B. O LEFT JOIN é o espelho do RIGHT JOIN: ele preserva a tabela da esquerda, não a da direita.

Alternativa B — ✅ Correta ⟵ GABARITO

select * from a RIGHT OUTER JOIN b on a.a = b.b; preserva todos os registros da tabela B (direita). B tem os valores 3, 4, 5, 6. Os valores 3 e 4 encontram correspondência em A, gerando (3,3) e (4,4). Os valores 5 e 6 não encontram correspondência, então a coluna A é preenchida com NULL, gerando (null,5) e (null,6). O resultado final é exatamente o apresentado no enunciado: (3,3), (4,4), (null,5), (null,6).

Alternativa C — ❌ Incorreta

select * from a INNER JOIN b on a.a = b.b; retornaria apenas as linhas com correspondência nas duas tabelas, ou seja, (3,3) e (4,4). As linhas com NULL não apareceriam, pois o INNER JOIN descarta qualquer linha sem par. O resultado teria apenas 2 linhas, não 4.

Alternativa D — ❌ Incorreta

select * from a FULL OUTER JOIN b on a.a = b.b; preservaria todas as linhas de ambas as tabelas. O resultado incluiria (1,null), (2,null), (3,3), (4,4), (null,5), (null,6) — 6 linhas no total. O resultado esperado tem apenas 4 linhas, sem os valores 1 e 2 da tabela A. O FULL JOIN é a união do LEFT com o RIGHT, trazendo tudo de ambos os lados.

Alternativa E — ❌ Incorreta

select * from a FULL INNER JOIN b on a.a = b.b; não é uma sintaxe válida no SQL Server. Não existe o comando FULL INNER JOIN — as junções são INNER, LEFT, RIGHT ou FULL OUTER. O termo "FULL INNER" é uma combinação inexistente, provavelmente criada pela banca para confundir o candidato que não domina a sintaxe correta.

A regra de ouro para resolver questões de junção é identificar qual tabela o resultado preserva. Se o resultado inclui linhas com NULL na coluna da esquerda, é um RIGHT JOIN; se inclui NULL na coluna da direita, é um LEFT JOIN; se inclui NULL nos dois lados, é um FULL JOIN; se não inclui NULL nenhum, é um INNER JOIN. Nesta questão, o NULL aparece na coluna A (esquerda), indicando que a tabela B (direita) é a preservada — logo, RIGHT OUTER JOIN.

Gabarito: letra B

Link permanente: /questoes/qa699064