Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2024
Banco de Dados›Consultas 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
1
15
2
10
3
11
Um auditor executou uma consulta SQL e obteve a resposta abaixo:
id_municipio
id_bairro
id_municipio
10
2
10
15
1
15
Qual das alternativas abaixo representa a consulta SQL executada para obter a resposta acima?
Aselect * from municipios as m left join bairros as b on (m.id_municipio=b.id_municipio)
Bselect * from municipios as m right join bairros as b
Cselect * from municipios as m full join bairros as b on (m.id_municipio=b.id_municipio)
Dselect * from municipios as m full join bairros as b
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.
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.