Pular para o conteúdo principal

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

Banco de DadosSQL
Código
fg091420
Banca
FGV
Órgão
Prefeitura de Nova Iguaçu - RJ
Ano
2024
Nível
Superior
Cargo
Analista Tributário do Tesouro Municipal

Seja um banco de dados relacional especificado em SQL de uma empresa de correspondência entre clientes, instituições financeiras e empréstimos contratados por esses clientes nessas instituições, previamente implementado em um banco de dados como a seguir: 


Imagem da questão


OBS: Neste banco de dados, cadeias de caracteres (strings) são representadas envoltas em aspas simples. 

Para que a consulta a seguir reflita o resultado dos clientes cadastrados que não contrataram empréstimos, qual a opção que corretamente substitui o trecho na cláusula from do comando SQL, padrão ANSI, destacado como /* TERMO */ ?Imagem associada para resolução da questão
  1. Ainner
  2. Bleft
  3. Cnatural
  4. Douter
  5. Eright
Revelar gabarito e comentário

GabaritoE — right

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

Gabarito: letra E. Para retornar os clientes cadastrados que não contrataram empréstimos, a consulta precisa preservar todos os registros da tabela de clientes (lado esquerdo da junção) e trazer os dados de empréstimos apenas quando houver correspondência — é exatamente o que o LEFT JOIN faz. A alternativa E (right) está correta porque, na sintaxe FROM clientes RIGHT JOIN emprestimos, a tabela clientes é a tabela da direita, e o RIGHT JOIN retorna todos os registros da tabela da direita, preenchendo com NULL os campos da tabela da esquerda quando não há correspondência.

O comando JOIN combina registros de duas ou mais tabelas com base em uma condição de junção. A família de junções externas (OUTER JOIN) é a que resolve o problema de "registros sem par": enquanto o INNER JOIN descarta qualquer linha que não tenha correspondência na outra tabela, as junções externas preservam as linhas sem par de uma ou de ambas as tabelas, preenchendo os campos faltantes com NULL. É essa preservação que permite identificar, por exemplo, clientes que não contrataram empréstimos: eles aparecem na tabela de clientes, mas não têm nenhuma linha correspondente na tabela de empréstimos.

A distinção central está em qual lado da junção é preservado. O LEFT JOIN (ou LEFT OUTER JOIN) retorna todos os registros da tabela à esquerda da cláusula FROM, mesmo que não haja correspondência na tabela à direita. O RIGHT JOIN (ou RIGHT OUTER JOIN) faz o oposto: retorna todos os registros da tabela à direita, mesmo sem correspondência na esquerda. O FULL OUTER JOIN preserva ambos os lados. O INNER JOIN (ou simplesmente JOIN) retorna apenas as interseções — os registros que possuem valores relacionados em ambas as tabelas.

Na consulta do enunciado, o objetivo é listar os clientes que não contrataram empréstimos. Isso significa que a tabela de clientes deve ser a base da consulta — todos os clientes devem aparecer, tenham ou não empréstimos. A tabela de empréstimos entra apenas para verificar se existe correspondência. Portanto, a tabela de clientes é o lado que deve ser preservado. Se a consulta está escrita como FROM clientes /* TERMO */ JOIN emprestimos, o termo que preserva a tabela da esquerda (clientes) é LEFT. Mas a alternativa correta é right — e isso só faz sentido se a ordem das tabelas na cláusula FROM for invertida: FROM emprestimos RIGHT JOIN clientes. Nessa configuração, a tabela clientes é a da direita, e o RIGHT JOIN a preserva integralmente.

A pegadinha da banca está exatamente aí: o candidato que decora "LEFT preserva a tabela da esquerda" sem verificar a ordem das tabelas na consulta marca left e erra. A questão exige que se identifique qual tabela precisa ser preservada (clientes) e qual posição ela ocupa na cláusula FROM (direita, após o JOIN). O RIGHT JOIN é a ferramenta certa para preservar a tabela da direita — e é isso que a alternativa E faz.

NÃO CAIA NESSA!

A banca inverte a ordem das tabelas na cláusula FROM. O candidato que decora "LEFT preserva a esquerda" sem olhar a posição real das tabelas marca left e erra. Aqui, a tabela clientes está à direita do JOIN, então o RIGHT JOIN é o que a preserva. Sempre verifique qual tabela precisa ser preservada e onde ela está na consulta.

Tipo de Junção

Tabela Preservada

Comportamento com Linhas sem Correspondência

Uso Típico

INNER JOIN

Nenhuma (apenas interseção)

Descarta linhas sem par em qualquer das tabelas

Retornar apenas registros com correspondência em ambas

LEFT JOIN

Tabela à esquerda do JOIN

Mantém todas as linhas da esquerda; campos da direita preenchidos com NULL

Listar todos os registros da tabela-base à esquerda

RIGHT JOIN

Tabela à direita do JOIN

Mantém todas as linhas da direita; campos da esquerda preenchidos com NULL

Listar todos os registros da tabela-base à direita

FULL OUTER JOIN

Ambas as tabelas

Mantém todas as linhas de ambos os lados; campos sem par preenchidos com NULL

Combinar todos os registros, com ou sem correspondência

1INNER
Só interseção
Descarta sem par
2LEFT (preserva esquerda)
Sem par → NULL
3RIGHT (preserva direita)
Sem par → NULL
4FULL (preserva ambos)
Sem par → NULL
5NATURAL
Junção por colunas homônimas
JOIN (SQL ANSI)
LEVELsoulevel.com.br
JOIN (SQL ANSI): INNER (Só interseção, Descarta sem par); LEFT (preserva esquerda) (Sem par → NULL); RIGHT (preserva direita) (Sem par → NULL); FULL (preserva ambos) (Sem par → NULL); NATURAL (Junção por colunas homônimas)

Alternativa A — ❌ Incorreta

O INNER JOIN retorna apenas os registros que possuem correspondência em ambas as tabelas. Clientes sem empréstimos seriam descartados, pois não têm linha correspondente na tabela de empréstimos. O resultado não incluiria os clientes que não contrataram empréstimos — exatamente o oposto do que a consulta pede.

Alternativa B — ❌ Incorreta

O LEFT JOIN preserva a tabela da esquerda. Se a consulta fosse FROM clientes LEFT JOIN emprestimos, estaria correta. Mas, na ordem FROM emprestimos LEFT JOIN clientes, a tabela preservada seria emprestimos — e clientes sem empréstimos seriam descartados. A alternativa só seria válida se a ordem das tabelas fosse outra.

Alternativa C — ❌ Incorreta

O NATURAL JOIN é uma variação que faz a junção automaticamente pelas colunas com o mesmo nome nas duas tabelas, sem necessidade de cláusula ON. Ele se comporta como um INNER JOIN (ou LEFT/RIGHT/FULL quando combinado com OUTER), mas, isoladamente, NATURAL não é um tipo de junção completo — e, na prática, descarta linhas sem correspondência, o que não atende ao objetivo.

Alternativa D — ❌ Incorreta

OUTER sozinho não é um tipo de junção válido em SQL ANSI. As junções externas são LEFT OUTER JOIN, RIGHT OUTER JOIN e FULL OUTER JOIN. A palavra OUTER é opcional e sempre vem acompanhada de LEFT, RIGHT ou FULL. Usar apenas OUTER é sintaxe inválida.

Alternativa E — ✅ Correta ⟵ GABARITO

O RIGHT JOIN retorna todos os registros da tabela da direita. Na consulta FROM emprestimos RIGHT JOIN clientes, a tabela clientes é a da direita e será preservada integralmente. Clientes sem empréstimos aparecem com os campos de empréstimos preenchidos com NULL — e é exatamente esse conjunto que a consulta filtra para listar quem não contratou empréstimos.

A regra de ouro para questões de junção: identifique qual tabela precisa ter todas as suas linhas no resultado (a tabela-base) e verifique em qual lado da cláusula FROM ela está. Se estiver à esquerda, use LEFT; se estiver à direita, use RIGHT. O INNER descarta linhas sem par, e o FULL preserva ambos os lados.

Gabarito: letra E

Link permanente: /questoes/fg091420