Pular para o conteúdo principal

Questão de Banco de Dados — SQL — CESPE / CEBRASPE 2024

Banco de DadosSQL
Código
ce188236
Banca
CESPE / CEBRASPE
Órgão
TCE-AC
Ano
2024
Nível
Superior
Cargo
Analista de Tecnologia da Informação - Área: Gestão de Dados

A figura a seguir representa um projeto de banco de dados para a análise de gastos em saúde por município e por hospital.


Imagem da questão


A partir dessas informações, julgue o próximo item. 

A seguinte consulta SQL lista os hospitais que não tiveram gastos com fisioterapia.Imagem associada para resolução da questão
  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoE — Errado

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”.

SQL: consulta para listar hospitais sem gastos com fisioterapia

Gabarito: Errado. A consulta SQL apresentada na figura não lista corretamente os hospitais que não tiveram gastos com fisioterapia, pois utiliza uma junção interna (INNER JOIN) que exclui os hospitais sem registros de gastos, em vez de uma junção externa (LEFT JOIN) que preservaria esses hospitais. A técnica correta envolve o uso de NOT EXISTS ou LEFT JOIN ... WHERE ... IS NULL para identificar a ausência de registros.

Para entender por que a afirmação está errada, é preciso dominar o comportamento das junções em SQL. Uma junção interna (INNER JOIN) combina registros de duas tabelas somente quando há correspondência na condição de junção. Se um hospital não possui nenhum gasto com fisioterapia, ele não terá nenhuma linha correspondente na tabela de gastos, e portanto será excluído do resultado. Isso é exatamente o oposto do que se deseja: queremos listar os hospitais que não têm gastos, ou seja, aqueles que não têm correspondência.

A forma clássica e mais direta de resolver esse problema é usar a subconsulta com NOT EXISTS. Essa cláusula verifica se não existe nenhum registro na tabela de gastos que atenda à condição de pertencer ao hospital e ser do tipo fisioterapia. Se não existir, o hospital é incluído no resultado. Alternativamente, pode-se usar um LEFT JOIN entre a tabela de hospitais e a tabela de gastos, filtrando no WHERE os registros onde a coluna da tabela de gastos é NULL — isso indica que não houve correspondência, ou seja, o hospital não teve gastos.

Vamos a um exemplo concreto. Suponha que a tabela Hospital tenha os hospitais H1, H2 e H3, e a tabela Gasto tenha registros apenas para H1 e H2 com fisioterapia. A consulta correta com NOT EXISTS retornaria H3, pois não existe nenhum gasto de fisioterapia para ele. Já uma consulta com INNER JOIN entre Hospital e Gasto (filtrando fisioterapia) retornaria apenas H1 e H2, deixando H3 de fora — exatamente o erro da questão.

A pegadinha aqui é a inversão do conceito de junção. O candidato pode pensar que, ao juntar as tabelas e filtrar por fisioterapia, os hospitais sem gastos apareceriam com valores nulos. Mas isso só acontece com LEFT JOIN, não com INNER JOIN. A banca explora justamente essa confusão entre os tipos de junção e o efeito que cada uma tem sobre os registros sem correspondência.

Guarde a distinção central: para encontrar registros que não possuem relação, é preciso usar NOT EXISTS, NOT IN (com cuidado com nulos) ou LEFT JOIN com teste de NULL. A junção interna (INNER JOIN) é usada para encontrar registros que possuem relação. É exatamente nessa fronteira que a questão se decide.

  1. 1INNER JOIN
  2. 2LEFT JOIN + IS NULL
  3. 3NOT EXISTS
LEVEL · soulevel.com.br

Alternativa E — ❌ Errado ⟵ GABARITO

A afirmação de que a consulta lista os hospitais que não tiveram gastos com fisioterapia está errada. O erro está no tipo de junção utilizado. Se a consulta usa INNER JOIN, ela retorna apenas os hospitais que têm gastos com fisioterapia, excluindo justamente aqueles que se deseja listar. Para listar os hospitais sem gastos, seria necessário usar LEFT JOIN (preservando todos os hospitais) e filtrar os que não têm correspondência, ou usar NOT EXISTS.

PEGA ESSA DICA!

Na prova, ao ver uma questão pedindo "listar os X que não têm Y", desconfie imediatamente de INNER JOIN. A técnica correta é sempre LEFT JOIN ... WHERE ... IS NULL ou NOT EXISTS. Memorize o par: INNER JOIN = tem relação; LEFT JOIN + IS NULL = não tem relação.

Gabarito: letra E (Errado).

Link permanente: /questoes/ce188236