Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2024
Banco de Dados›Consultas e Comandos em SQL
Código
qa630709
Banca
FUNDATEC
Órgão
CETENE
Ano
2024
Cargo
Tecno P ( )
Para responder a questão abaixo, considere o modelo entidade-relacionamento (ER) apresentado pela figura abaixo:
Figura 1 - Modelo entidade - realcionamento (ER)
Considerando o modelo ER apresentado pela Figura 1, pretende-se implementar uma expressão SQL para apresentar os registros de Servico que NÃO estão associados com qualquer Unidade. Analise as assertivas abaixo e assinale a alternativa correta.
I. select ser_descricao from Servico
where ser_id not in (select S.ser_id
from Unidade U
inner join UnidadeServico US on U.uni_id = US.uni_id
inner join Servico S on US.ser_id = S.ser_id)
II. select ser_descricao
from Unidade U
inner join UnidadeServico US on U.uni_id = US.uni_id
inner join Servico S on US.ser_id = S.ser_id
where US.ser_id is null
III. select ser_descricao
from Unidade U
inner join UnidadeServico US on U.uni_id = US.uni_id
right join Servico S on US.ser_id = S.ser_id
where US.ser_id is null
ATodas as assertivas estão corretas.
BTodas as assertivas estão incorretas.
CApenas a assertiva II está correta.
DApenas as assertivas I e III estão corretas.
EApenas as assertivas II e III estão corretas.
Revelar gabarito e comentário▾
GabaritoD — Apenas as assertivas I e III estão corretas.
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”.
Consultas SQL: identificando registros sem associação
Gabarito: letra D. As assertivas I e III estão corretas, pois ambas retornam corretamente os registros de Servico que não possuem associação com nenhuma Unidade — a I usa a subconsulta com NOT IN, e a III usa o RIGHT JOIN com filtro de nulos. A assertiva II está incorreta, pois o INNER JOIN elimina exatamente os registros sem correspondência, tornando a condição WHERE US.ser_id IS NULL sempre falsa.
O problema central é identificar, em um banco relacional, quais registros de uma tabela não possuem correspondência em outra, através de uma tabela de associação (tabela pivô). No modelo apresentado, UnidadeServico é a entidade associativa que liga Unidade e Servico — se um serviço não aparece nessa tabela, ele não está associado a nenhuma unidade. Existem duas abordagens clássicas para resolver isso em SQL: a subconsulta com NOT IN (ou NOT EXISTS) e a junção externa (LEFT JOIN ou RIGHT JOIN) com verificação de nulos.
A subconsulta com NOT IN funciona selecionando os serviços cujo ser_id não está presente no conjunto de ser_id que possuem associação. Já a junção externa preserva todos os registros de uma das tabelas — no RIGHT JOIN, todos os registros da tabela à direita (Servico) são mantidos, e os que não têm correspondência na tabela à esquerda recebem valores nulos nas colunas desta. Filtrando por US.ser_id IS NULL, obtemos exatamente os serviços sem associação.
A pegadinha da assertiva II está no uso do INNER JOIN: essa junção retorna apenas os registros que possuem correspondência em ambas as tabelas, ou seja, apenas os serviços que JÁ estão associados a alguma unidade. Portanto, a condição WHERE US.ser_id IS NULL nunca será verdadeira, pois o INNER JOIN já descartou as linhas sem correspondência. É a diferença fundamental entre junção interna e junção externa que decide esta questão.
Guarde a distinção entre INNER JOIN (descarta sem par) e RIGHT JOIN/LEFT JOIN (preserva sem par): é exatamente nela que as assertivas se dividem.
Serviços sem associação com Unidade
1Abordagens corretas
Subconsulta NOT IN
Seleciona ser_id com associação
Filtra quem não está no conjunto
RIGHT JOIN com IS NULL
Preserva todos os serviços
Nulos para quem não tem par
2Pegadinha: INNER JOIN
Só retorna quem tem par
IS NULL nunca é verdadeiro
LEVEL · soulevel.com.br
Assertiva I — ✅ Correta
A consulta usa uma subconsulta para obter todos os ser_id que possuem associação com alguma unidade (através dos INNER JOINs entre Unidade, UnidadeServico e Servico). Em seguida, o WHERE ser_id NOT IN (...) seleciona os serviços cujo ser_id não está nesse conjunto — exatamente os serviços sem associação. A lógica está correta e o resultado atende ao pedido.
Assertiva II — ❌ Incorreta
O INNER JOIN retorna apenas as linhas com correspondência entre as tabelas. Como a consulta parte de Unidade e junta com UnidadeServico e Servico, o resultado contém apenas serviços que possuem associação. A condição WHERE US.ser_id IS NULL nunca será verdadeira, pois o INNER JOIN já eliminou as linhas sem correspondência. O resultado seria um conjunto vazio, não os serviços sem associação.
Assertiva III — ✅ Correta
O RIGHT JOIN preserva todos os registros da tabela à direita (Servico). Para os serviços sem associação, as colunas da tabela à esquerda (Unidade e UnidadeServico) ficam com valores nulos. A condição WHERE US.ser_id IS NULL filtra exatamente esses serviços, retornando o resultado desejado. A lógica está correta.
NÃO CAIA NESSA!
A banca explora a confusão entre INNER JOIN e junções externas. No INNER JOIN, a condição IS NULL é sempre falsa, pois a junção já descartou as linhas sem par. Já no RIGHT JOIN (ou LEFT JOIN), as linhas sem par são preservadas com valores nulos, tornando o filtro eficaz. Lembre-se: junção interna = só quem tem par; junção externa = todos, com nulos para quem não tem par.
Gabarito: letra D — corretas apenas as assertivas I e III.