Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2025
Banco de Dados›Consultas 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 A
Tabela B
A
B
1
3
2
4
3
5
4
6
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?
Aselect * from a LEFT OUTER JOIN b on a.a = b.b;
Bselect * from a RIGHT OUTER JOIN b on a.a = b.b;
Cselect * from a INNER JOIN b on a.a = b.b;
Dselect * from a FULL OUTER JOIN b on a.a = b.b;
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.
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.