Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2024

Banco de DadosConsultas e Comandos em SQL
Código
ce403647
Banca
CESPE / CEBRASPE
Órgão
TCE AC
Ano
2024
Cargo
ATI ( )
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.   A partir dessas informações, julgue o próximo item.   A seguinte consulta SQL lista os hospitais que não tiveram gastos com fisioterapia. SELECT h.nome_hospital FROM hospital h WHERE EXISTS ( SELECT 1 FROM gastos g WHERE g.id_hospital = h.id_hospital AND g.id_tipo_gasto_saude = (SELECT id_tipo_gasto_saude FROM tipo_gasto_saude WHERE nome_tipo_gasto = '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 – Subconsultas correlacionadas e o operador EXISTS

Gabarito: Errado. A consulta apresentada lista os hospitais que tiveram gastos com fisioterapia, e não os que não tiveram. O operador EXISTS retorna verdadeiro quando a subconsulta retorna ao menos uma linha, ou seja, quando existe um registro de gasto com fisioterapia para aquele hospital — exatamente o oposto do que o enunciado pede. Para listar os hospitais sem gastos com fisioterapia, seria necessário usar NOT EXISTS (ou NOT IN).

A questão cobra o entendimento do operador EXISTS em subconsultas correlacionadas. Uma subconsulta correlacionada é aquela que referencia colunas da consulta externa — aqui, g.id_hospital = h.id_hospital. O EXISTS avalia se a subconsulta retorna pelo menos uma linha; se retornar, a condição é verdadeira e a linha da consulta externa é incluída no resultado. Portanto, o EXISTS é um teste de existência, não de ausência.

Para ilustrar, imagine um hospital H1 que possui um registro de gasto com fisioterapia. A subconsulta SELECT 1 FROM gastos g WHERE g.id_hospital = H1 AND g.id_tipo_gasto_saude = (id da fisioterapia) retornará uma linha, fazendo o EXISTS ser verdadeiro e H1 aparecer no resultado. Já um hospital H2 sem esse registro fará a subconsulta retornar vazio, o EXISTS será falso e H2 ficará de fora. O resultado final é exatamente a lista dos hospitais com gastos de fisioterapia.

A pegadinha está na inversão do operador: para obter o complemento (hospitais sem o gasto), o correto seria WHERE NOT EXISTS (...). Essa é uma distinção clássica entre EXISTS e NOT EXISTS, e a banca explora justamente a troca de um pelo outro. Guarde a regra: EXISTS = existe pelo menos um → inclui; NOT EXISTS = não existe nenhum → inclui. É nessa fronteira que a questão se decide.

1Subconsulta retorna ≥1 linha
2Inclui o hospital
3Lista quem TEM o gasto
4NOT EXISTS
Subconsulta retorna 0 linhas
Inclui o hospital
Lista quem NÃO TEM o gasto
EXISTS
LEVELsoulevel.com.br
EXISTS: Subconsulta retorna ≥1 linha; Inclui o hospital; Lista quem TEM o gasto; NOT EXISTS (Subconsulta retorna 0 linhas, Inclui o hospital, Lista quem NÃO TEM o gasto)

Item — ❌ Errado

A consulta usa WHERE EXISTS, que retorna os hospitais para os quais a subconsulta encontra ao menos um registro de gasto com fisioterapia. O enunciado pede os hospitais que não tiveram gastos com fisioterapia, o que exigiria WHERE NOT EXISTS. Portanto, a consulta está logicamente invertida: ela lista os hospitais que tiveram gastos com fisioterapia, não os que não tiveram.

NÃO CAIA NESSA!

A banca troca o operador EXISTS por NOT EXISTS. O candidato que lê rápido associa a subconsulta sobre fisioterapia à resposta correta, sem perceber que o EXISTS testa a presença de registros, não a ausência. Para listar os hospitais sem gastos, o comando correto seria WHERE NOT EXISTS (...). Com treino, você enxerga essa inversão de longe 💪.

Gabarito: Errado.

Link permanente: /questoes/ce403647