Pular para o conteúdo principal

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

Banco de DadosConsultas e Comandos em SQL
Código
qa630536
Banca
FUNDATEC
Órgão
Pref Criciúma
Ano
2024
Cargo
AFRM ( )

Para responder às questões 58 a 60, considere um SGBD relacional que contém duas tabelas, uma que contém os dados de municípios, e outra que contém os dados de bairros dos municípios, conforme a representação abaixo:

 

Municípios

bairros

id_municipio

10
12
13
15
 

id_bairro

id_municipio

115
210
311
 
 

Um auditor executou uma consulta SQL e obteve a resposta abaixo:

 

id_municipio

id_bairro

id_municipio

10210
15115
 

Qual das alternativas abaixo representa a consulta SQL executada para obter a resposta acima?

  1. Aselect * from municipios as m left join bairros as b on (m.id_municipio=b.id_municipio)
  2. Bselect * from municipios as m right join bairros as b
  3. Cselect * from municipios as m full join bairros as b on (m.id_municipio=b.id_municipio)
  4. Dselect * from municipios as m full join bairros as b
  5. Eselect * from municipios as m inner join bairros as b on (m.id_municipio=b.id_municipio)
Revelar gabarito e comentário

GabaritoE — select * from municipios as m inner join bairros as b on (m.id_municipio=b.id_municipio)

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 JOIN

Gabarito: letra E. A consulta que produz exatamente as duas linhas do resultado — municípios 10 e 15, cada um com seu bairro correspondente — é o INNER JOIN, que retorna apenas os registros com correspondência nas duas tabelas. As demais alternativas ou usam junções externas (LEFT/RIGHT/FULL), que preservariam linhas sem correspondência, ou omitem a condição de junção, gerando produto cartesiano.

O que são junções em SQL

Junções (JOINs) combinam linhas de duas ou mais tabelas com base em uma condição relacionada. O tipo de junção determina quais linhas aparecem no resultado:

  • INNER JOIN: retorna apenas as linhas que têm correspondência em ambas as tabelas, conforme a condição ON.

  • LEFT JOIN (ou LEFT OUTER JOIN): retorna todas as linhas da tabela à esquerda, mesmo sem correspondência na direita; para as sem par, as colunas da direita ficam NULL.

  • RIGHT JOIN (ou RIGHT OUTER JOIN): o oposto — todas as linhas da direita, com NULL na esquerda quando não há par.

  • FULL JOIN (ou FULL OUTER JOIN): retorna todas as linhas de ambas as tabelas, com NULL onde não há correspondência.

A condição ON é essencial: sem ela, o SGBD combina cada linha de uma tabela com todas as linhas da outra, gerando o produto cartesiano — um resultado muito maior e quase sempre indesejado.

Analisando os dados da questão

A tabela Municípios tem 4 registros (id_municipio: 10, 12, 13, 15). A tabela bairros tem 3 registros (id_bairro: 1, 2, 3), com id_municipio: 15, 10 e 11, respectivamente.

O resultado esperado tem apenas 2 linhas:

id_municipio

id_bairro

id_municipio

10

2

10

15

1

15

Observe que apenas os municípios 10 e 15 têm bairros correspondentes. Os municípios 12 e 13 não aparecem, e o bairro 3 (id_municipio 11) também não. Isso é exatamente o comportamento do INNER JOIN: só entram os pares que casam.

Por que as outras alternativas estão erradas

  • A) LEFT JOIN: retornaria todos os municípios (10, 12, 13, 15), com NULL nas colunas de bairro para 12 e 13. O resultado teria 4 linhas, não 2.

  • B) RIGHT JOIN sem ON: além de ser um RIGHT JOIN (que incluiria o bairro 3, sem município correspondente), a falta da condição ON gera produto cartesiano — cada município combinado com cada bairro, resultando em 12 linhas.

  • C) FULL JOIN com ON: retornaria todos os municípios e todos os bairros, incluindo 12, 13 e o bairro 3 — 5 linhas no total.

  • D) FULL JOIN sem ON: produto cartesiano de 4×3 = 12 linhas, com todas as combinações possíveis.

A alternativa E é a única que combina a condição correta (ON m.id_municipio = b.id_municipio) com o tipo de junção que descarta linhas sem par — o INNER JOIN.

A pegadinha da banca

A banca explora duas confusões comuns: (1) trocar INNER por LEFT/RIGHT/FULL, achando que qualquer junção serve; (2) esquecer a cláusula ON, o que transforma a consulta em produto cartesiano. O candidato que não domina a diferença entre junções internas e externas tende a marcar a alternativa A (LEFT JOIN), que é a mais parecida com a correta, mas incluiria os municípios sem bairro.

NÃO CAIA NESSA!

A banca troca o tipo de junção para confundir: o INNER JOIN (correto) descarta linhas sem correspondência, enquanto o LEFT JOIN (alternativa A) preservaria os municípios 12 e 13 com NULL. Além disso, as alternativas B e D omitem a condição ON, gerando produto cartesiano — um erro clássico de quem decora a sintaxe sem entender o significado.

1INNER JOIN
Só pares com correspondência
Exige condição ON
2LEFT JOIN
Todas as linhas da esquerda
NULL onde não há par
3RIGHT JOIN
Todas as linhas da direita
NULL onde não há par
4FULL JOIN
Todas as linhas de ambas
NULL onde não há par
5Sem ON
Produto cartesiano
Tipos de JOIN
LEVELsoulevel.com.br
Tipos de JOIN: INNER JOIN (Só pares com correspondência, Exige condição ON); LEFT JOIN (Todas as linhas da esquerda, NULL onde não há par); RIGHT JOIN (Todas as linhas da direita, NULL onde não há par); FULL JOIN (Todas as linhas de ambas, NULL onde não há par); Sem ON (Produto cartesiano)

Alternativa A — ❌ Incorreta

O LEFT JOIN retornaria todas as linhas da tabela municipios, mesmo sem bairro correspondente. No resultado, os municípios 12 e 13 apareceriam com valores NULL nas colunas de bairro, totalizando 4 linhas — diferente das 2 linhas esperadas. O erro está em usar uma junção externa onde a questão exige uma junção interna.

Alternativa B — ❌ Incorreta

Dois erros: (1) é um RIGHT JOIN, que incluiria o bairro 3 (id_municipio 11) mesmo sem município correspondente; (2) falta a cláusula ON, então o SGBD faria o produto cartesiano entre as 4 linhas de municípios e as 3 de bairros, gerando 12 linhas. O resultado correto tem apenas 2 linhas.

Alternativa C — ❌ Incorreta

O FULL JOIN com ON retornaria todas as linhas de ambas as tabelas: os 4 municípios (10, 12, 13, 15) e os 3 bairros (1, 2, 3). Municípios sem bairro (12, 13) e bairro sem município (3) apareceriam com NULL, totalizando 5 linhas — não 2.

Alternativa D — ❌ Incorreta

Além de ser um FULL JOIN (que já incluiria linhas sem par), falta a condição ON. Sem ela, o SGBD combina cada município com cada bairro, gerando o produto cartesiano de 4×3 = 12 linhas. O resultado esperado tem apenas 2 linhas.

Alternativa E — ✅ Correta ⟵ GABARITO

O INNER JOIN com a condição ON m.id_municipio = b.id_municipio retorna apenas os pares que têm correspondência: município 10 com bairro 2, e município 15 com bairro 1. Os municípios 12 e 13 (sem bairro) e o bairro 3 (sem município) são descartados, produzindo exatamente as 2 linhas do resultado.

Gabarito: letra E

Link permanente: /questoes/qa630536